NSUbiquitousKeyValueStore同步问题

我什么也没有,但NSUbiquitousKeyValueStore麻烦,并得到它可靠地跨两个设备同步。 它开始让我发疯。 狂。

我看我的代码打电话给:

[[NSUbiquitousKeyValueStore defaultStore] setObject:_someData forKey:@"SomeData"]; [[NSUbiquitousKeyValueStore defaultStore] synchronize]; 

但是更多的时候,数据永远不会显示在另一台设备上。

我已经看到它几秒钟内同步,其他时间,我已经等了一个小时,从来没有看到同步。 我将设备插入xcode并开始debugging,有时数据突然popup,有时则不会。 有时候确实如此。

完成这个调用之后,退出并重新启动应用程序,如果我看到了旧数据,而不是我刚刚发布的新数据。 在同一台设备上。

当应用程序启动时,我打电话给:

 _someData = [[NSUbiquitousKeyValueStore defaultStore] stringForKey:@"SomeData"]; 

我假设没有需要运行的init代码。 没有我find的例子。

当它工作,它工作得很好。

那么今天晚上,我正在查看设备日志,并在我最后一次退出(并尝试发送数据)后发现:

 Jul 8 21:32:03 unknown syncdefaultsd[17296] <Warning>: Error writing storage for com.mycompany.myapp to /private/var/mobile/Applications/4AC8C56E-6060-408B-84F9-F7EC336221D9/Library/SyncedPreferences/com.mycompany.myapp.plist: Error Domain=NSCocoaErrorDomain Code=4 "The operation couldn't be completed. (Cocoa error 4.)" UserInfo=0xde80d40 {NSFilePath=/private/var/mobile/Applications/4AC8C56E-6060-408B-84F9-F7EC336221D9/Library/SyncedPreferences, NSUnderlyingError=0xde80b20"The operation couldn't becompleted. No such file or directory"} 

该path不是我的Apps沙箱(错误的GUID)的有效path,所以我不知道这是否是我的问题的根源。 我在开发过程中删除并重新安装了很多应用程序,所以我想知道是否有某个旧path被caching在某处,并且正试图同步这些数据。 有没有办法清除它?

我知道我的所有权利都设置正确,因为它有时会工作。

[[NSUbiquitousKeyValueStore defaultStore] synchronize]返回YES

有没有其他人看到这个问题或错误? 当我的应用程序启动并将数据发送到云时,是否还有其他需要做的事情? 根据文档和示例,这似乎很容易。

iCloud键值存储不适用于需要定期频繁同步的数据,Apple似乎并不保证这些操作的及时性。 苹果说 :

键值存储区旨在用于存储不经常更改的数据。 如果设备上的应用程序频繁更改键值存储区,则系统可能会推迟一些更改的同步,以尽量减less往返服务器的次数。 越频繁的应用程序进行更改,越有可能以后的更改将被推迟,并且不会立即显示在其他设备上。

如果您的应用程序没有立即同步,并且您对此的兴趣是加速testing/debugging,那么看起来这将是一个必要的挫折,除非您改变技术。

NSUbiquitousKeyValueStore的文档说明了同步如何工作的细节。 我认为从罗杰的假设是,当你打电话给:

 [[NSUbiquitousKeyValueStore defaultStore] synchronize]; 

它将立即上传数据(假设networking连接)。 不是这种情况。 调用synchronize只需要在内存中设置的键和值,并将其保存到本地磁盘caching中。 一旦完成,系统会通知iCloud有数据可以上传。 下面的synchronize方法文档中提到了关键信息:

此方法不会强制将新键和值写入iCloud。 相反,它让iCloud知道可以上传新的密钥和值。 不要立即依赖您的密钥和其他设备上的值。 系统控制这些键和值的上传时间。 键值存储的上传请求频率限制为每分钟几个。

链接到文档

总之,系统控制你的密钥和值上传到iCloud,调用synchronize只是简单地存储它们的本地caching,并通知iCloud等待上传的新数据。

它可能是设备已安装应用程序列表中陈旧的caching。 尝试删除设备上的应用程序并重新安装。 或者也许重新启动设备。

一件确定的事情是你应该向bugreport.apple.com提交报告

检查您的设备控制台[通过Xcode中的组织者]。 它可能包含有用的信息。 即使空的defaultStore同步返回YES,您的权利也可能不正确。

在这种情况下,如果您使用越狱设备,则必须在icloud和GameCenter支持正常工作之前删除AppSync。 显然,我认为你有苹果开发账户。

我在启动时使用它,并立即获取iCloud值或updateKVStoreItems:在<5秒内调用。

 - (void) initializeiCloud { NSUbiquitousKeyValueStore* store = [NSUbiquitousKeyValueStore defaultStore]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateKVStoreItems:) name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:store]; if ([store boolForKey:@"fakeSyncBit"]) { NSLog(@"in initiCloud setting syncbit NO"); [store setBool:NO forKey:@"fakeSyncBit"]; } else { NSLog(@"in initiCloud setting syncbit YES"); [store setBool:YES forKey:@"fakeSyncBit"]; } [store synchronize]; NSLog(@"icloud store is synchronized. updateKVStoreItems: should be called shortly"); }