web-dev-qa-db-ja.com

Swift)のAppleのファイルアプリにあるフォルダにファイルを書き込む方法

XcodeプロジェクトにXMLファイルがあり、最初にそれをディスクに保存しようとしています。次に、正常に保存したかどうかを確認するにはどうすればよいですか?これは適切なアプローチですか?シミュレーターを使用して、iOS 11の新しい「ファイル」フォルダーに移動しましたが、表示されませんが、そこにあるべきかどうかわかりません。

guard let path = Bundle.main.url(forResource: "sample", withExtension: "xml") else {print("NO URL"); return}
    let sample = try? Data(contentsOf: path)


print("sample XML = \(String(describing: sample?.debugDescription))")

//put xml file on the device
let filename = getDocumentsDirectory().appendingPathComponent("sample.xml")
do {
    try sample?.write(to: filename)
} catch {
    print("ERROR")
}

ファイルが存在するかどうかのチェックを含めるように更新されました:

 //check if file exists
    let checkPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let url = URL(fileURLWithPath: checkPath)
let filePath = url.appendingPathComponent("sample.xml").path
let fileManager = FileManager.default
if fileManager.fileExists(atPath: filePath) {
    print("FILE AVAILABLE")
} else {
    print("FILE NOT AVAILABLE")
}
7
GarySabo

UIDocumentInteractionControllerを使用して、URLを共有するときにユーザーがファイルを保存する場所を選択できるようにすることができます。ユーザーは、[ファイルに保存]を選択し、エクスポートするファイルを保存するディレクトリを選択するだけです。

UIDocumentInteractionControllerを使用して、アプリバンドル内、ドキュメントディレクトリ、またはアプリからアクセスできる別のフォルダーにある任意のファイルタイプを共有できます。

class ViewController: UIViewController {
    let documentInteractionController = UIDocumentInteractionController()
    func share(url: URL) {
        documentInteractionController.url = url
        documentInteractionController.uti = url.typeIdentifier ?? "public.data, public.content"
        documentInteractionController.name = url.localizedName ?? url.lastPathComponent
        documentInteractionController.presentOptionsMenu(from: view.frame, in: view, animated: true)
    }
    @IBAction func shareAction(_ sender: UIButton) {
        guard let url = URL(string: "https://www.ibm.com/support/knowledgecenter/SVU13_7.2.1/com.ibm.ismsaas.doc/reference/AssetsImportCompleteSample.csv?view=kc") else { return }
        URLSession.shared.dataTask(with: url) { data, response, error in
            guard let data = data, error == nil else { return }
            let tmpURL = FileManager.default.temporaryDirectory
                .appendingPathComponent(response?.suggestedFilename ?? "fileName.csv")
            do {
                try data.write(to: tmpURL)
                DispatchQueue.main.async {
                    self.share(url: tmpURL)
                }
            } catch { 
                print(error)
            }

        }.resume()
    }
}

extension URL {
    var typeIdentifier: String? {
        return (try? resourceValues(forKeys: [.typeIdentifierKey]))?.typeIdentifier
    }
    var localizedName: String? {
        return (try? resourceValues(forKeys: [.localizedNameKey]))?.localizedName
    }
}
12
Leo Dabus