在iOS7上关闭iCloud for Core Data时出错

时间:2014-04-17 21:45:20

标签: ios icloud

我的项目今天在生产中有一个非常难看的iCloud实现,我计划在下次更新时禁用它(我们不需要iCloud)。以下是我将用户从iCloud迁移到本地商店的方法 - 更新从应用程序中删除了iCloud权利,这个简单的事件序列在应用程序启动时启动:

如果有iCloud商店([[NSFileManager defaultManager] fileExistsAtPath:[legacyStoreUrl path]]

  1. 加载“传统”iCloud商店
  2. 将iCloud商店迁移到本地商店

    ([_ persistentStoreCoordinator migratePersistentStore:legacyStore toURL:targetStoreUrl options:options withType:NSSQLiteStoreType error:& legacyStoreMigrationError]);

  3. 删除旧版商店

    ([fileManager removeItemAtURL:legacyStoreUrl error:& legacyStoreRemovalError])

  4. 其他

    1. 加载(或创建)本地商店
    2. 这一切都很棒 - 在iOS6上

      当我在iOS7上运行相同的代码来迁移本地商店时,似乎找不到iCloud商店。我没有得到任何错误的指示,调用FileManager询问商店是否只是返回false。我确认升级后的应用使用的商店的网址与之前版本中使用的网址完全相同。另请注意,现有版本的应用程序可在iOS7上运行,而无需访问iCloud商店。

      对于为什么会出现这种情况或者可能是某些问题导致其他调查问题的任何想法?

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您删除了iCloud权利。没有它,你就不被允许访问iCloud商店,所以整个方案都崩溃了。如果这适用于iOS 6,那就是一个错误,因为如果没有正确的权利,你真的不应该访问任何与iCloud相关的内容。 iOS 7有很多内部变化,因此他们发现并修复它并不奇怪。

所以你需要把这个权利放回来。

另外两个细节:

  • 执行迁移时,请务必在NSPersistentStoreRemoveUbiquitousMetadataOption字典中将新@YES设置为options。否则,一些与云相关的元数据将会存在,这可能会在以后破坏你的一天。 (你可能已经知道了,但既然你没有提到它,我想我会这样做。)
  • 删除云存储时,请勿使用NSFileManager电话。首先,它错过了SQLite walshm文件。然而,更糟糕的是,它使所有现有的iCloud事务日志只是占用空间。您需要removeUbiquitousContentAndPersistentStoreAtURL:options:error上的新(ish)NSPersistentStore方法。此处的options字典应包含您在添加iCloud存储时使用的与云相关的密钥,因为这是查找事务日志所必需的。