2014-04-17 22 views
0

我的项目今天在生产中有一个非常丑陋的iCloud实现,我打算在下次更新时禁用它(我们不需要iCloud)。以下是我将用户从iCloud迁移到本地商店所采取的方法 - 该更新从应用程序中删除了iCloud权利,并且在应用程序启动时启动了此简单事件序列:在iOS7上关闭iCloud核心数据的错误

如果存在iCloud商店([[的NSFileManager defaultManager] fileExistsAtPath:[legacyStoreUrl路径]]

  1. 负载的 “传统” 的iCloud商店
  2. 迁移的iCloud存储到本地存储

    ([_persistentStoreCoordinator migratePersistentStore:legacyStore的toURL:目标StoreUrl选项:选项withType:NSSQLiteStoreType错误:& legacyStoreMigrationError]);

  3. 删除旧存储

    ([文件管理removeItemAtURL:legacyStoreUrl错误:& legacyStoreRemovalError])

否则

  1. 负载(或创建)本地存储

这一切都很好 - 在iOS6上使用

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

任何想法为什么这可能是或可能导致其他什么调查?

回答

1

发生这种情况是因为您删除了iCloud权利。没有这一点,你不能访问iCloud商店,所以整个计划分崩离析。如果这适用于iOS 6,这是一个错误,因为如果没有正确的授权,您实际上不应该访问与iCloud相关的任何内容。 iOS 7有很多内部变化,所以他们找到并解决这个问题并不奇怪。

因此,您需要将该权利退回。其他

两个细节:

  • 当你做对的迁移,确保新NSPersistentStoreRemoveUbiquitousMetadataOption设置为@YESoptions字典。否则,一些与云有关的元数据将继续存在,这可能会在以后真的毁了你的一天。 (你可能已经知道这一点,但因为你没有提到它,我认为我会的)。
  • 当您删除云存储时,请不要使用该呼叫NSFileManager。首先,它忽略了SQLite walshm文件。更糟糕的是,它使所有现有的iCloud交易日志都坐在那里占据了空间。您需要在NSPersistentStore上使用新的(ish)removeUbiquitousContentAndPersistentStoreAtURL:options:error方法。这里的options字典应该包含您在添加iCloud商店时使用的相关云相关密钥,因为这是查找事务日志所必需的。
+0

你说得对。另一个因素是,我对传统商店是否存在的测试似乎不像我在iOS7上预期的那样工作。即使启用了iCloud,[[NSFileManager defaultManager] fileExistsAtPath:[legacyStoreUrl path]]始终返回false。我需要努力寻找不同的测试,但是这个特殊的问题已经解决了。谢谢! – moliveira

+0

还有一个更新 - 我更新为使用removeUbiquitousContentAndPersistentStoreAtURL:options:error方法,但shm和wal文件仍然存在。他们似乎无害(我重命名商店文件)。 – moliveira