繁体   English   中英

使用 UIDocument 和 Swift 将 plist NSdata 与 iCloud 同步

[英]Syncing plist NSdata with iCloud using UIDocument and Swift

我已经构建了一个 iOS 应用程序 ( TimeFinder ),它使用 plist 存储用户数据,但我很难理解如何支持使用 iCloud 同步用户数据。

我认为以这种方式同步 plist 数据将是一项相当常见的任务,但我已经搜索了 web 寻找答案,我能找到的只是使用 Obj-C ( )的旧问答线程。 这些可能没问题,但不幸的是,我对 Obj-C 还不够熟悉,无法弄清楚如何将这些策略实施到我的 swift 项目中。 甚至关于基于文档的应用程序的 Apple 文档也完全使用 obj-c,并且没有对我的案例有用的示例。

为了让事情顺利进行,我设法实现了一些代码,将 plist 文件从本地存储复制到 iCloud Documents 容器,但考虑到潜在的冲突和数据损坏,这种策略似乎是一场噩梦。

有人可以给我一些关于如何使用 Swift 和 UIDocument 来实现我的目标的指示吗? 还是我应该只使用 iCloud 文件夹来存储我的 plist?

这是其中之一:

<plist version="1.0">
<array>
    <dict>
        <key>iconName</key>
        <string>Folder</string>
        <key>items</key>
        <array>
            <dict>
                <key>text</key>
                <string>Make handrail</string>
            </dict>
            <dict>
                <key>text</key>
                <string>Work out</string>
            </dict>
            <dict>
                <key>text</key>
                <string>Make kombucha </string>
            </dict>
        </array>
        <key>name</key>
        <string>Today</string>
    </dict>
</array>
</plist>

这是我如何设法至少将 plist 从本地目录复制到 iCloud 的示例:

  func copyDocumentsToiCloudDirectory() {
      guard let localDocumentsURL = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: .userDomainMask).last else { return }
      
      guard let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents").appendingPathComponent("Data") else { return }
      
      var isDir:ObjCBool = false
      
      if FileManager.default.fileExists(atPath: iCloudDocumentsURL.path, isDirectory: &isDir) {
          do {
              try FileManager.default.removeItem(at: iCloudDocumentsURL)
          }
          catch {
              //Error handling
              print("Error in remove item")
          }
      }
      
      do {
          try FileManager.default.copyItem(at: localDocumentsURL, to: iCloudDocumentsURL)
      }
      catch {
          //Error handling
          print("Error in copy item")
      }
  }

您的文件可以通过 iCloud 在设备之间同步,同时保存在应用程序自己的Documents目录中。 go 这种方式更好,因为您的文件格式是plist ,这对可能在 iCloud 文件夹中看到它的用户没有任何意义。

您可以通过以下方法将某个文件标记为普遍存在:

func setUbiquitous(_ flag: Bool, 
            itemAt url: URL, 
    destinationURL: URL) throws

更多细节在这里: https://developer.apple.com/documentation/foundation/filemanager/1413989-setubiquitous

There was no Swift when iCloud was introduced, but, to get the basic concept, you can check these WWDC 2011 slides https://download.developer.apple.com/wwdc_2011/adc_on_itunes__wwdc11_sessions__pdf/116_storing_documents_in_icloud_using_ios_5.pdf

提示:当您看到一些 ObjC API 时,在 Apple 文档中搜索它们,并将那里的语言更改为 Swift,它将向您展示相同的方法在 Swift 中的样子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM