【问题标题】:iCloud KeyValue store not recognized on first launch首次启动时无法识别 iCloud 键值存储
【发布时间】:2012-07-15 12:55:11
【问题描述】:

我的应用使用 iCloud(键值存储)在多个设备之间同步唯一 ID。如果它真的必须在应用程序的第一次启动时工作,那么这项工作就可以接受。看起来设备在首次启动时还不熟悉 iCloud 的值,只有在安装了应用程序并运行了一段时间之后。

我在应用程序主视图的 viewDidLoad 函数中检查 iCloud 值。

所以,我的问题:

  • 这是预期的行为吗?
  • 如果是,是否有其他解决方案?
  • 难道这只是从 Xcode 运行时出现的问题,而不是发布版本?如果有,如何测试?

谢谢!

碧玉

【问题讨论】:

标签: objective-c ios icloud key-value-store


【解决方案1】:

当您第一次运行启用了 iCloud 的应用程序时,它必须从 Apple 服务器中提取所有数据。执行此操作所需的时间取决于许多因素,例如您当前使用的网络类型(Edge、3G、GPRS、WLAN)。它还取决于 iCloud 服务器当前必须处理多少流量,因此无论您拥有何种类型的网络连接,对 iCloud 服务器的请求都可能需要几秒钟的时间。

总结一下:是的,听起来很正常。

如果运行您的应用取决于这些设置,请考虑实施“等待”或“正在加载”视图,只要应用需要执行初始同步并从云端加载所有需要的数据,该视图就会一直停留在屏幕上。为了不永远阻塞 UI,还要为此视图实现超时(如果 iCloud 数据未在 X 秒内加载,则关闭视图并通知用户)。

【讨论】:

  • 感谢您的回复!有没有办法检查初始 iCloud 同步是否完成?
  • 您必须订阅 NSUbiquitousKeyValueStoreDidChangeExternallyNotification 通知。文档中有一个示例 :-) developer.apple.com/library/ios/documentation/cocoa/Conceptual/…
  • @BjörnKaiser 我有同样的问题,但无论我在第一个应用程序启动时等待多长时间,都没有收到任何通知,这是我知道数据存在于 iCloud 中的 keyValueStore 上的时候。
  • 归档到 apple @ bugreport.apple.com,12394404 - NSUbiquitousKeyValueStore 通知不会在首次应用启动时触发
  • 我有同样的问题...有时是 50% 可靠,对于其他用户 100% 失败。
【解决方案2】:

您无法保证NSUbiquitousKeyValueStore 会在您的应用首次启动时完成其首次同步。 (事实上​​,在 iOS 5 上,它通常会在您首次启动应用时开始同步)。

无法知道第一次初始同步是否已经发生、正在进行或已完成。您可以(实际上应该)订阅NSUbiquitousKeyValueStoreDidChangeExternallyNotification。诀窍是,如果您的存储在 iCloud 服务器上是空的,那么在初始同步后您将不会收到任何通知(因为您的本地存储是空的并且云存储也是空的,所以在初始同步之后“外部”没有真正改变同步...)

通常,您不应依赖正在完成的初始同步。

在发布时保持乐观,即使您的商店是空的,也要立即推动您的价值观(例如您的唯一 ID)。如果初始同步同时或之后发生并且服务器上已经有一些值,则您的本地值将重置为服务器值,并且您将收到带有 NSUbiquitousKeyValueStoreInitialSyncChange 原因的 NSUbiquitousKeyValueStoreDidChangeExternallyNotification 通知。

最后,如果您真的想知道初始同步是否已完成,请向 bugreport.apple.com 提交错误并解释您真正需要它的原因。

【讨论】:

    【解决方案3】:

    我遇到了类似的问题,即无论我等了多长时间,安装后第一次启动时都没有触发 NSUbiquitousKeyValueStoreDidChangeExternallyNotification。在 NSUBiquitousKeyValueStore 中设置一个初始键似乎可以解决这个问题。

    将观察者添加到默认存储后,我立即调用:

    [[NSUbiquitousKeyValueStore defaultStore] setString:@"testValue" forKey:@"testKey"];
    [[NSUbiquitousKeyValueStore defaultStore] synchronize];
    

    我对要同步的实际数据使用不同的密钥(即不是 testKey)。

    【讨论】:

    • 我已经实现了这个,它似乎运行良好。最重要的是,在第一次调用观察者函数之前,我不依赖从 iCloud 返回的任何数据。一旦它被调用,我就会看到我在应用程序的先前实例中保存的所有值。我通过删除应用程序、重新启动手机并等待大约 10 分钟来测试这一点。不确定是否需要所有这些步骤,但它似乎让 iOS 最初为数据返回 nil,然后在几秒钟后调用观察者函数后正确地通过。
    • 没有帮助。似乎 iCloud 服务器的响应在访问保存或加载时可能非常缓慢,并且您的应用程序需要能够处理这些异步事件。数据通常可用....“稍后”,但很少在应用启动后 30 秒内。
    猜你喜欢
    • 2013-06-12
    • 2016-10-19
    • 2016-03-05
    • 2012-08-13
    • 2013-01-20
    • 1970-01-01
    • 2013-08-08
    • 2013-06-12
    • 1970-01-01
    相关资源
    最近更新 更多