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

Posted

技术标签:

【中文标题】如何在 Swift 中将文件写入位于 Apple 文件应用程序的文件夹中【英文标题】:How to write a file to a folder located at Apple's Files App in Swift 【发布时间】:2017-09-27 20:15:16 【问题描述】:

我的 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")

【问题讨论】:

将 var 路径命名为 url 对象具有误导性。您可以使用 FileManager 方法 fileExists(atPath:) 并将 yourURLObject.path 传递给它 谢谢@LeoDabus,它说文件存在但它没有在文件夹中列出?它不应该在那里吗? 哪个文件夹?捆绑包是只读的? iOS 11 添加的名为“文件”的应用 不明白你的意思,能详细点吗? 【参考方案1】:

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

您可以使用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
    


编辑/更新

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

【讨论】:

文件视图控制器中的Add 按钮不可选择,因为没有文件夹。那么如何保存文件呢? @Supertecnoboff 抱歉,您的问题尚不清楚。您需要选择 iCloud Drive。之后,添加按钮应该可用。然后你只需要选择文件应该复制到的文件夹。 啊,我明白了,非常感谢。是的,我试图通过使用On my iPhone 选项来保存文件,但该选项不允许我选择Add 按钮。有点烦人,但很好。 @LeoDabus 我觉得你可能可以帮助我了解我的情况,任何指导将不胜感激:[***.com/questions/67126367/…

以上是关于如何在 Swift 中将文件写入位于 Apple 文件应用程序的文件夹中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将 JSON 写入 Realm

如何在 Xcode 中将 Swift 版本从 5 更改为 4?

在 Swift 中将字符串写入 NSOutputStream

使用 Swift 3 在 iOS 10 中将图像从服务器加载到 Apple Map 中的注释视图

在 Python 中将二进制数据写入文件

在 Apple Swift 中将字符串转换为浮点数产生的值与模块错误不同