2012-07-09 120 views
4

我只有NSUbiquitousKeyValueStore出现问题,并且无法在两台设备间可靠同步。它开始让我发疯。狂。NSUbiquitousKeyValueStore同步问题

我看我的代码,请调用:

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

但更多的时间比不,该数据一直没有出现在其他设备上。

我已经看到它在几秒钟内同步,其他时间我已经等了一个小时,从未见过同步。我将设备插入xcode并开始调试,有时数据会突然弹出,有时则不会。有时候确实如此。

完成此调用后,退出并重新启动应用程序,如果我阅读它,则会看到旧数据,而不是我刚刚发布的新数据。在同一台设备上。

,当应用程序启动时,我做出了一个电话:

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

我假设有一个需要运行没有初始化代码。没有我找到的例子。

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

然后今晚我一直在寻找的设备日志,发现我的最后一个出口后,这一权利(并尝试发送数据):

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"} 

这条道路不是从我的应用程序沙箱(错误GUID的有效途径),所以我想知道这是否是我的问题的根源。我在开发过程中会删除并重新安装应用程序,因此我不知道是否有某个旧路径缓存在某处,并且正试图同步这些数据。有没有办法清除它?

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

[[NSUbiquitousKeyValueStore defaultStore] synchronize]正在返回YES

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

+0

我面临同样的问题,这让我疯狂!只是试图找出为什么它不同步。 – 2012-08-04 04:46:38

+0

我有完全相同的问题。我发现删除应用程序的容器常常导致问题浮出水面。一旦应用程序的两个实例都有一个有效的容器,它们将正确同步。一旦尝试通过删除容器来测试“第一次体验”,应用程序实例可能永远不会从icloud获取UBKV。我还没有弄清楚这是否会在现实世界中出现。 – 2012-11-29 22:23:45

+0

这就是我所看到的。如果用户从设备中删除了应用程序,然后再次重新安装,期望从云UBKV获取他们的数据,这种情况不会出现吗?在我的情况下(一场比赛),这是我想处理的一个案例。 – 2012-11-30 02:21:29

回答

0

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

一个肯定的是,你应该提交一份报告,以bugreport.apple.com

0

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

0

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

0

我在启动时使用它,并立即获取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"); 
} 
2

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

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

如果它是好的,你的应用程序不立即同步和你的这种兴趣是加速测试/调试那么看来这将是,除非你改变你的技术的一个必要的挫折。

+0

苹果告诉我们使用键值存储来确定iCloud数据是否已被播种。如果它不经常同步,这是行不通的。听起来像苹果的文档有点破碎。 https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/UsingCoreDataWithiCloudPG/UsingSQLiteStoragewithiCloud/UsingSQLiteStoragewithiCloud.html#//apple_ref/doc/uid/TP40013491-CH3-SW30 – ngb 2014-04-22 02:07:52

1

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

[[NSUbiquitousKeyValueStore defaultStore] synchronize]; 

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

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

Link to documentation

总之,当你的关键字和值被上传到iCloud,并呼吁synchronize简单地将它们存储的本地缓存,并通知新的数据等待被上载的iCloud中的系统控制。