我的项目今天在生产中有一个非常丑陋的 iCloud 实现,我计划在我的下一个更新中禁用它(我们不需要 iCloud)。这是我将用户从 iCloud 迁移到本地商店的方法 - 更新从应用程序中删除了 iCloud 授权,并且这个简单的事件序列在应用程序启动时启动:
如果有 iCloud 存储([[NSFileManager defaultManager] fileExistsAtPath:[legacyStoreUrl path]]
- 加载“旧版”iCloud 商店
将 iCloud 商店迁移到本地商店
([_persistentStoreCoordinator migratePersistentStore:legacyStore toURL:targetStoreUrl options:options withType:NSSQLiteStoreType error:&legacyStoreMigrationError]);
删除遗留商店
([fileManager removeItemAtURL:legacyStoreUrl 错误:&legacyStoreRemovalError])
否则
- 加载(或创建)本地商店
这一切都很好 - 在 iOS6 上。
当我在 iOS7 上运行相同的代码以迁移本地商店时,它似乎找不到 iCloud 商店。我没有得到任何错误指示,调用 FileManager 询问商店是否存在只是返回 false。我验证了升级应用程序使用的商店 url 与以前版本中使用的完全相同。另请注意,该应用程序的现有版本在 iOS7 上运行,访问 iCloud 商店没有任何问题。
有没有想过这可能是什么原因,或者是否有一些关于其他要调查的线索?
最佳答案
发生这种情况是因为您删除了 iCloud 授权。否则,您将无权访问 iCloud 商店,因此整个方案将分崩离析。如果这在 iOS 6 上有效,那就是一个错误,因为如果没有正确的授权,你真的不应该访问任何与 iCloud 相关的内容。 iOS 7 有大量内部变化,因此他们发现并修复了这些变化也就不足为奇了。
因此您需要恢复该权利。
另外两个细节:
- 执行迁移时,请确保在
options
字典中将新的NSPersistentStoreRemoveUbiquitousMetadataOption
设置为@YES
。否则,一些与云相关的元数据会留下来,这真的会毁了你以后的一天。 (您可能已经知道这一点,但由于您没有提及,我想我会知道)。 - 删除云存储时,不要使用
NSFileManager
调用。一方面,它缺少 SQLitewal
和shm
文件。更糟糕的是,它让所有现有的 iCloud 事务日志都坐在那里占用空间。您需要NSPersistentStore
上的新(ish)removeUbiquitousContentAndPersistentStoreAtURL:options:error
方法。此处的options
字典应包含您在添加 iCloud 商店时使用的与云相关的 key ,因为这是查找交易日志所必需的。
关于ios - 在 iOS7 上关闭 iCloud for Core Data 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23143995/