【问题标题】:Problem sharing files between OSX / iOS Versions of app via shared iCloud Folder通过共享 iCloud 文件夹在 OSX / iOS 版本的应用程序之间共享文件时出现问题
【发布时间】:2020-06-29 03:00:43
【问题描述】:

保存到共享 iCloud 文件夹时,我的应用程序的 OSX 版本和应用程序的 iOS 版本之间共享文件时遇到问题。

iMac 版本可以读取共享文件夹中的任何文件。但是 iOS 版本无法读取从 OSX 版本保存的文件。

在 iOS 上调用 contentsOfDirectory 时

FileManager.default.contentsOfDirectory(at: mmFile.containerUrl!, includingPropertiesForKeys: nil, options: [])

我得到的网址是这样的:

file:///private/var/mobile/Library/Mobile%20Documents/iCloud~xxx/Documents/Untitled.render-z, file:///private/var/mobile/Library/Mobile%20Documents/iCloud ~xxx/Documents/.refract.render-z.icloud

第一个文件保存在 iOS 上并正确加载,第二个来自 OSX,其中有一个“。”前缀和“.icloud”后缀,无法加载。

我用相同的代码保存文件:

stringData.write(to: url(), atomically: true, encoding: .utf8)

编码无关紧要,如果我使用 .ascii 或 .utf8 等,其行为相同。

当我尝试在 iOS 中读取这样的文件时,我会得到类似的内容

bplist00Ó\NSURLNameKey_NSURLFileSizeKey_NSURLFileResourceTypeKey_2spheres.render-z

我想不通!所有权利和 plist 属性似乎都是正确的,并且共享 iCloud DB 也可以正常工作。

【问题讨论】:

  • 从 OSX 创建文件时您实际使用的文件名是什么,您希望看到什么内容?文件 .refract.render-z.icloud 是一个隐藏文件,看起来像某种元数据
  • 这是一个带有编码 JSON 的字符串,它序列化了项目状态。我使用相同的代码来读取/写入字符串内容,它在所有情况下都可以正常工作,除了读取在 iOS 上的 OSX 上创建的文件。我可以在 OSX 上读取没有问题的相同文件,并且它没有显示为隐藏。

标签: ios swift macos icloud


【解决方案1】:

我想通了。对于遇到同样问题的任何人:

不要使用 FileManager 来解析文件,而是像这样使用 NSMetadataItem

    query = NSMetadataQuery()
    query.predicate = NSPredicate.init(format: "%K BEGINSWITH %@", argumentArray: [NSMetadataItemPathKey, self.containerUrl!.path])
    query.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope]

    NotificationCenter.default.addObserver(self, selector: #selector(self.updateCloudData), name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: nil)

    query.enableUpdates()
    query.start()

最重要的是使用 FileController 来读取文件,这样可以确保与 iCloud 同步:

func loadJSON(url: URL) -> String
{
    var string : String = ""

    let fc = NSFileCoordinator()
    fc.coordinate(readingItemAt: url, options: .forUploading, error: nil, byAccessor: { url in
        do {
            string = try String(contentsOf: url, encoding: .utf8)
        } catch {
            print(error.localizedDescription)
        }
    })
    return string
}

【讨论】:

    猜你喜欢
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2016-07-31
    • 2015-11-26
    相关资源
    最近更新 更多