我的项目今天在生产中有一个非常难看的iCloud实现,我计划在下次更新时禁用它(我们不需要iCloud)。以下是我将用户从iCloud迁移到本地商店的方法 - 更新从应用程序中删除了iCloud权利,这个简单的事件序列在应用程序启动时启动:
如果有iCloud商店([[NSFileManager defaultManager] fileExistsAtPath:[legacyStoreUrl path]]
将iCloud商店迁移到本地商店
([_ persistentStoreCoordinator migratePersistentStore:legacyStore toURL:targetStoreUrl options:options withType:NSSQLiteStoreType error:& legacyStoreMigrationError]);
删除旧版商店
([fileManager removeItemAtURL:legacyStoreUrl error:& legacyStoreRemovalError])
其他
这一切都很棒 - 在iOS6上。
当我在iOS7上运行相同的代码来迁移本地商店时,似乎找不到iCloud商店。我没有得到任何错误的指示,调用FileManager询问商店是否只是返回false。我确认升级后的应用使用的商店的网址与之前版本中使用的网址完全相同。另请注意,现有版本的应用程序可在iOS7上运行,而无需访问iCloud商店。
对于为什么会出现这种情况或者可能是某些问题导致其他调查问题的任何想法?
答案 0 :(得分:1)
这种情况正在发生,因为您删除了iCloud权利。没有它,你就不被允许访问iCloud商店,所以整个方案都崩溃了。如果这适用于iOS 6,那就是一个错误,因为如果没有正确的权利,你真的不应该访问任何与iCloud相关的内容。 iOS 7有很多内部变化,因此他们发现并修复它并不奇怪。
所以你需要把这个权利放回来。
另外两个细节:
NSPersistentStoreRemoveUbiquitousMetadataOption
字典中将新@YES
设置为options
。否则,一些与云相关的元数据将会存在,这可能会在以后破坏你的一天。 (你可能已经知道了,但既然你没有提到它,我想我会这样做。)NSFileManager
电话。首先,它错过了SQLite wal
和shm
文件。然而,更糟糕的是,它使所有现有的iCloud事务日志只是占用空间。您需要removeUbiquitousContentAndPersistentStoreAtURL:options:error
上的新(ish)NSPersistentStore
方法。此处的options
字典应包含您在添加iCloud存储时使用的与云相关的密钥,因为这是查找事务日志所必需的。