前回PDFのコピーがsimulatorではできるけど、実機ではできないというエラーが出た話をしましたが、解決しました。
buildの際に警告が出てFileManagerの操作がiOS14でdeprecatedされているというものが出ていました。その警告をググると以下のサイトがヒットしました。
Initialization of UIDocumentPickerViewController in iOS 14
その通りに設定したら今度はiCloudのファイルでも問題なく自分のAppのフォルダにコピーできました!
動いたコードは以下です。10、23、24行目が変更点でした。
import UniformTypeIdentifiers
let supportedTypes: [UTType] = [UTType.pdf]
let picker = UIDocumentPickerViewController(forOpeningContentTypes: supportedTypes, asCopy: true)
// // SelectPDF.swift // bFaaaPSwitch1 // // Created by 宍戸知行 on 2020/12/05. // import SwiftUI import MobileCoreServices import UniformTypeIdentifiers struct DocumentPicker :UIViewControllerRepresentable { @Binding var urlString:String @Binding var filename:String func makeCoordinator() -> DocumentPicker.Coordinator { return DocumentPicker.Coordinator(parent1: self) } func makeUIViewController(context: UIViewControllerRepresentableContext<DocumentPicker>) -> UIDocumentPickerViewController { let supportedTypes: [UTType] = [UTType.pdf] let picker = UIDocumentPickerViewController(forOpeningContentTypes: supportedTypes, asCopy: true) picker.allowsMultipleSelection = false picker.delegate = context.coordinator return picker } func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: UIViewControllerRepresentableContext<DocumentPicker>) { } class Coordinator: NSObject, UIDocumentPickerDelegate{ var parent: DocumentPicker init(parent1: DocumentPicker){ parent = parent1 } 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)") } } } }
Githubにもprojectを追加しておきました。
実際の画面はこんな感じですよ。

コメント