プログラミング

エンジョイSwiftUIプログラミングその35(do/catchでerrorの内容を出力する方法)

do/catchで、tryして失敗した時のerrorの内容を見たい時があります。例えば、FileManagerでは実際のファイルの操作ができない場合がありました。知らなかったんですが、開発段階ではiCloud上のfileをAppのフォルダに入れて操作するのはsimulatorではできますが、実機のiPhone等ではできません。

最初はどうしてできないのかわからなかったので、do/catchでtryしたFileManagerの操作のエラーを見て初めて原因がわかりました。いまだに解決はしていないですが、エラーの内容をググって問題の所在が把握できました。

その問題のファイル操作の部分のコードです。

func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
            print(urls)
            print(urls.first!)
            
            self.parent.urlString = urls.first!.absoluteString
            self.parent.filename =  String(urls.first!.lastPathComponent)
            //アプリフォルダにこの時点で保存コピーする
            do {
            let documentsURL = try
                FileManager.default.url(for: .documentDirectory,
                                        in: .userDomainMask,
                                        appropriateFor: nil,
                                        create: false)
                print("documentsURLは\(documentsURL)")
            let savedURL = documentsURL.appendingPathComponent(
                "\(String(urls.first!.lastPathComponent))")
            let encodedSavedURLpath = savedURL.path.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)
                print("encodedSavedURLpathは\(String(describing: encodedSavedURLpath))")
                if FileManager.default.fileExists(atPath: encodedSavedURLpath!) {
                    try FileManager.default.removeItem(atPath:encodedSavedURLpath!)
                    print("There is an already file at the encodedSavedURLpath and the file is deleted.")
                    
                }
                try FileManager.default.copyItem(atPath:urls.first!.path, toPath:encodedSavedURLpath!)
                print("the selected file has been copied.")
                
                //UserDefaultsに値を保存
                UserDefaults.standard.set(urls.first!.absoluteString, forKey: "urlString")
                
            }catch let error as NSError {
                print("Couldn't copy file to final location! Error:\(error.description)")
            }
           
        }

エラーを表示させる部分は以下です。

do {

  }catch let error as NSError {
                print("Couldn't copy file to final location! Error:\(error.description)")
            }

実際のエラーコードはこんな感じでした。

Error:Error Domain=NSCocoaErrorDomain Code=257 "The file “ブエノスアイレスの冬〜春ピアソラ.pdf” couldn’t be opened because you don’t have permission to view it." UserInfo={NSFilePath=/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/ピアノ音楽データ/ブエノスアイレスの冬〜春ピアソラ楽譜/ブエノスアイレスの冬〜春ピアソラ.pdf, NSUnderlyingError=0x2826fa130 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}

したがって、「Error Domain=NSPOSIXErrorDomain Code=1 “Operation not permitted”」「couldn’t be opened because you don’t have permission to view it.」でググるとFileManagerの操作がsimulatorではできるが実機ではできないことがわかりました。

まだ、解決したわけではないですが、問題の原因は分かりました、、、、、

現在Apple Technical Supportに問い合わせ中ですのでFileManagerのdevelopment段階の操作について回答があればここでも取り上げようかなと思っています。

関連記事一覧

コメント

この記事へのコメントはありません。