首次启动时未识别iCloud KeyValue存储

8
我的应用程序使用iCloud(键值存储)在多个设备之间同步唯一的ID。这在应用程序首次启动时需要正常工作,但实际上并没有正常工作。似乎设备在首次启动时还不熟悉iCloud的值,只有在应用程序安装并运行了一段时间后才会熟悉。
我在应用程序的主视图的viewDidLoad函数中检查iCloud的值。
所以,我的问题是:
  • 这是预期的行为吗?
  • 如果是,是否有其他解决方案?
  • 这只是在从Xcode运行时出现的问题吗?如果是,如何测试?
谢谢!
Jasper

请查看此问题:https://dev59.com/6Oo6XIcBkEYKwwoYPR_f - erkanyildiz
3个回答

8

我曾经遇到过类似的问题,即使等待了很长时间,在首次安装后 NSUbiquitousKeyValueStoreDidChangeExternallyNotification 也无法触发。在 NSUBiquitousKeyValueStore 中设置一个初始键(key)可以解决这个问题。

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

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

我使用不同的密钥(即非testKey)来同步实际数据。


1
我已经实现了这个功能,看起来效果不错。总之,在我的观察函数第一次被调用之前,我不依赖于从iCloud返回的任何数据。一旦它被调用,我就会看到我在之前应用程序实例中保存的所有值。我通过删除应用程序、重新启动手机并等待约10分钟来测试这一点。不确定是否需要所有这些步骤,但似乎这样做可以使iOS最初返回数据为nil,然后在几秒钟后调用观察函数后正确地传递数据。 - Nicholas
没有帮助。iCloud 服务器响应似乎极其缓慢,访问保存或加载时,您的应用程序需要能够处理这些异步事件。数据通常是“稍后”可用的,但很少在应用程序启动后的30秒内可用。 - CthulhuJon

2
当您第一次运行启用iCloud的应用程序时,它必须从苹果服务器拉取所有数据。完成此操作所需的时间取决于许多因素,例如您当前使用的网络类型(Edge、3G、GPRS、WLAN)。这还取决于iCloud服务器目前需要处理多少流量,因此无论您使用何种类型的网络连接,向iCloud服务器发送请求可能需要几秒钟的时间。
总之:是的,这听起来绝对是正常的。
如果运行您的应用程序依赖于这些设置,请考虑实现一个“等待”或“加载”视图,该视图会在屏幕上停留,直到应用程序执行初始同步并从云加载所有所需数据。为了不永远阻塞UI,还要为此视图实现超时(如果iCloud数据未在X秒内加载,则关闭视图并通知用户)。

谢谢您的回复!有没有一种方法可以检查初始iCloud同步是否完成? - Jasper Bel
你需要订阅NSUbiquitousKeyValueStoreDidChangeExternallyNotification通知。文档中有一个例子 :-) http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/UserDefaults/StoringPreferenceDatainiCloud/StoringPreferenceDatainiCloud.html - Björn Kaiser
@BjörnKaiser 我也有同样的问题,但无论我在第一次应用程序启动时等待多长时间,都没有任何通知出现,而这时我知道数据存在于iCloud的keyValueStore中。 - pulkitsinghal
1
已在 bugreport.apple.com 上提交,编号为 12394404 - NSUbiquitousKeyValueStore 通知在首次启动应用程序时不会触发。 - pulkitsinghal
我有同样的问题... 对于某些用户,它有时可靠性达到50%,但对于其他用户则完全失败。 - CthulhuJon

1

在您的应用程序首次启动时,您无法保证NSUbiquitousKeyValueStore已经完成了第一次同步。(实际上,在iOS 5上,它通常在您首次启动应用程序时开始同步)。

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

通常情况下,您不应该依赖于初始同步完成。

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

最后,如果您真的认为了解初始同步是否已完成,请在bugreport.apple.com上提交错误报告,并解释您为什么真正需要它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接