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

标签 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 错误:&legacyStoreRemovalError])

否则

  1. 加载(或创建)本地商店

这一切都很好 - 在 iOS6 上。

当我在 iOS7 上运行相同的代码以迁移本地商店时,它似乎找不到 iCloud 商店。我没有得到任何错误指示,调用 FileManager 询问商店是否存在只是返回 false。我验证了升级应用程序使用的商店 url 与以前版本中使用的完全相同。另请注意,该应用程序的现有版本在 iOS7 上运行,访问 iCloud 商店没有任何问题。

有没有想过这可能是什么原因,或者是否有一些关于其他要调查的线索?

最佳答案

发生这种情况是因为您删除了 iCloud 授权。否则,您将无权访问 iCloud 商店,因此整个方案将分崩离析。如果这在 iOS 6 上有效,那就是一个错误,因为如果没有正确的授权,你真的不应该访问任何与 iCloud 相关的内容。 iOS 7 有大量内部变化,因此他们发现并修复了这些变化也就不足为奇了。

因此您需要恢复该权利。

另外两个细节:

  • 执行迁移时,请确保在 options 字典中将新的 NSPersistentStoreRemoveUbiquitousMetadataOption 设置为 @YES。否则,一些与云相关的元数据会留下来,这真的会毁了你以后的一天。 (您可能已经知道这一点,但由于您没有提及,我想我会知道)。
  • 删除云存储时,不要使用 NSFileManager 调用。一方面,它缺少 SQLite walshm 文件。更糟糕的是,它让所有现有的 iCloud 事务日志都坐在那里占用空间。您需要 NSPersistentStore 上的新(ish)removeUbiquitousContentAndPersistentStoreAtURL:options:error 方法。此处的 options 字典应包含您在添加 iCloud 商店时使用的与云相关的 key ,因为这是查找交易日志所必需的。

关于ios - 在 iOS7 上关闭 iCloud for Core Data 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23143995/

相关文章:

ios - 使用 NSMutableURLRequest/URLRequest 请求 http

ios5 - MagicalRecord iCloud 备份

ios - 在 NSString 中写入 %

ios - NSTimer 与 NSUserDefaults

ios - 跨设备同步核心数据

ios - 如何针对 iCloud 验证 iCloud ID token ?

ios - 从 iCloud 下载文件时显示进度百分比?

ios - 在 IOS 中使用 iCloud 导出和导入文档

ios - 以编程方式更改推送通知内容

ios - 使用 calloutAccessoryControlTapped Xcode 传递数据