7

我在使用 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

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

4

6 回答 6

3

我在启动时使用它并立即获得 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"); 
}
于 2013-05-12T14:33:58.877 回答
2

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

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

如果您的应用程序没有立即同步是可以的,并且您对此的兴趣是加快测试/调试速度,那么除非您更改您的技术,否则这将是一个必要的挫折。

于 2013-10-26T00:04:38.327 回答
2

NSUbiquitousKeyValueStore 的文档详细说明了同步的工作原理。我认为 Roger 的假设是,当您致电时:

[[NSUbiquitousKeyValueStore defaultStore] synchronize];

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

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

链接到文档

简而言之,系统控制您的键和值何时上传到 iCloud,调用synchronize只是将它们存储在本地缓存中,并通知 iCloud 等待上传的新数据。

于 2014-04-09T10:38:16.440 回答
0

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

可以肯定的是,您应该向 bugreport.apple.com 提交报告

于 2012-07-20T01:54:24.340 回答
0

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

于 2012-08-06T20:55:33.143 回答
0

在这种情况下,如果您使用越狱设备,您必须先删除 AppSync,然后 icloud 和 GameCenter 支持才能正常工作。显然,我假设您确实拥有 Apple 开发帐户。

于 2012-09-21T19:53:42.463 回答