首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用UIDocument和Swift同步plist NSdata和iCloud

使用UIDocument和Swift同步plist NSdata和iCloud
EN

Stack Overflow用户
提问于 2020-08-13 09:30:21
回答 1查看 103关注 0票数 0

我已经构建了一个使用iCloud存储用户数据的iOS应用程序(TimeFinder),但我正在努力理解如何支持使用plists同步用户数据。

我以为以这种方式同步plist数据将是一项相当常见的任务,但我在网络上到处寻找答案,所有我能找到的都是使用Obj-C (OneTwo)的老式问答线程。这些可能很好,但不幸的是,我还不够熟悉Obj-C,无法弄清楚如何在我的swift项目中实现这些策略。即使是Apple documentation on Document-based applications也完全是obj-c的,在我的例子中缺乏有用的例子。

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

有人能给我一些关于如何使用Swift和UIDocument实现我的目标的建议吗?或者我应该一开始就使用iCloud文件夹来存储我的plist?

下面是其中一个plist:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
  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")
      }
  }
EN

回答 1

Stack Overflow用户

发布于 2020-08-13 10:08:49

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

您可以通过以下方法将某些文件标记为无处不在:

代码语言:javascript
复制
func setUbiquitous(_ flag: Bool, 
            itemAt url: URL, 
    destinationURL: URL) throws

更多详细信息请访问:https://developer.apple.com/documentation/foundation/filemanager/1413989-setubiquitous

在引入iCloud时还没有Swift,但是,要了解基本概念,您可以查看这些WWDC2011幻灯片https://download.developer.apple.com/wwdc_2011/adc_on_itunes__wwdc11_sessions__pdf/116_storing_documents_in_icloud_using_ios_5.pdf

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63386841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档