【问题标题】:Error turning off iCloud for Core Data on iOS7在 iOS7 上为 Core Data 关闭 iCloud 时出错
【发布时间】:2014-06-02 08:46:22
【问题描述】:

我的项目今天在生产环境中有一个非常丑陋的 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。我验证了升级后的应用程序使用的商店网址与之前版本中使用的网址完全相同。另请注意,该应用程序的现有版本在 iOS7 上运行,访问 iCloud 商店没有任何问题。

对为什么会出现这种情况有任何想法,或者可能有一些关于其他调查的线索?

【问题讨论】:

    标签: ios icloud


    【解决方案1】:

    发生这种情况是因为您删除了 iCloud 授权。没有它,你就不能访问 iCloud 商店,所以整个计划就会分崩离析。如果这适用于 iOS 6,这是一个错误,因为如果没有正确的权利,你真的不应该访问任何与 iCloud 相关的东西。在 iOS 7 中,有大量的内部变化,所以他们发现并修复了这一点也就不足为奇了。

    因此,您需要收回该权利。

    另外两个细节:

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

    【讨论】:

    • 你是对的。另一个因素是,我对遗留商店是否存在的测试在 iOS7 上似乎也没有像我预期的那样工作。 [[NSFileManager defaultManager] fileExistsAtPath:[legacyStoreUrl path]] 总是返回 false,即使启用了 iCloud。我需要努力寻找不同的测试,但这个特殊问题已经解决。谢谢!
    • 另一个更新 - 我更新为使用 removeUbiquitousContentAndPersistentStoreAtURL:options:error 方法,但 shm 和 wal 文件仍然存在。不过它们似乎无害(我重命名了商店文件)。
    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2015-02-04
    • 2013-11-23
    • 1970-01-01
    • 2012-12-15
    • 2015-04-09
    • 1970-01-01
    相关资源
    最近更新 更多