ios - 如何在 Swift 中将文件写入位于 Apple 的文件应用程序中的文件夹

标签 ios swift xml

我的 Xcode 项目中有一个 XML 文件,我试图先将它保存到磁盘,然后如何判断我是否已成功保存它?这是正确的方法吗?使用模拟器,我导航到 iOS 11 中的新"file"文件夹,但我没有看到它,但我不确定它是否应该在那里?

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")
}

最佳答案

您可以使用 UIDocumentInteractionController 并让用户在您共享您的 url 时选择他想要保存您的文件的位置。用户只需选择保存到文件并选择要保存导出文件的目录即可。

您可以使用 UIDocumentInteractionController 来共享位于您的 App bundle 中、您的 Documents 目录或可从您的 App 访问的其他文件夹中的任何文件类型。

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
    }
}

编辑/更新:

如果您想公开位于 App Bundle 文档目录中的文件,您可以查看这篇文章 How can I display my App documents in the Files app for iPhone

关于ios - 如何在 Swift 中将文件写入位于 Apple 的文件应用程序中的文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46972013/

相关文章:

ios - 自动完成算法

ios - MoPub 快速集成无法正常工作

java - 使用 JAXB&MOXy 将 JPA 实体转换为 XML 并再次转换回来

c# - 如何在现有的完全空的 .xml 文件中写入内容?

java - 通过Java代码设置按钮位置?

iphone - 更新应用程序时数据库是否更新

ios - 如何快速在 UIScrollView 中设置全宽图像

ios - 将 UIImage 调整为 200x200pt/px

ios - 为什么 AdMob 测试广告出现在我的应用上,但实际广告不再显示?

swift - RxSwift 使用 RxCocoa 与动画绑定(bind)