NSUbiquitousKeyValueStore与iCloud同步不了

8

我已经尝试了一切并阅读了所有相关话题,但我无法找出为什么NSUbiquitousKeyValueStore没有存储在iCloud上的原因。

• 创建了特定的App ID

• 为该App ID启用了iCloud

• 创建了配置文件

• 在项目中启用了iCloud

• 将entitlements设置为键值:$(TeamIdentifierPrefix)$(CFBundleIdentifier)

• 在设备上开启了iCloud Drive

但是NSUbiquitousKeyValueStore只保存在本地。当我重新安装应用程序时,它不会从iCloud获取信息。

这是我的尝试方式:

    NSUbiquitousKeyValueStore *cloudStore = [NSUbiquitousKeyValueStore defaultStore];

if ([[cloudStore stringForKey:@"testString"] length] == 0) {
    NSLog(@"Nothing in iCloud - setting a value...");
    [cloudStore setString:@"I'm live in iCloud!" forKey:@"testString"];
    [cloudStore synchronize];
    [[NSUbiquitousKeyValueStore defaultStore] synchronize];

} else {
    NSString *result = [cloudStore stringForKey:@"testString"];
    NSLog(@"Found something in iCloud - here it is: %@", result);
}

[self registerForiCloudNotificatons];

如果我删除了应用程序或尝试在新设备上使用它,它就无法在iCloud上找到任何内容。

因此,我尝试了以下方法来查看iCloud是否正常工作:

    NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
if (ubiq) {
    NSLog(@"iCloud at %@", ubiq);

} else {
    NSLog(@"No iCloud access, %@", ubiq);
}

这个函数总是返回“没有iCloud访问权限”,我无法弄清楚原因。无论我做什么,URLForUbiquityContainerIdentifier始终返回nil。

我在启用iCloud的iOS 8设备上运行。

我有什么遗漏吗?

谢谢!


4
经过若干天的挣扎后,我简单地注销了iCloud并重新登录。现在一切都正常了……URLForUbiquityContainerIdentifier仍然返回空值,所以我无法检查iCloud是开启还是关闭,但至少数据正在云端同步和保存。 - tomDev
4个回答

7
我曾经遇到过同样的问题。我是这样解决的:
  1. 卸载应用程序
  2. 重启设备
  3. 安装应用程序

不需要登录和退出iCloud。


7
我也曾遇到过这个问题。在设备上注销并重新登录iCloud帐户解决了我的问题。
当您在启用iCloud授权之前在设备上安装具有相同捆绑标识符的应用程序时,似乎会出现此问题。我在两个测试设备上都遇到了这个问题。第三个设备,在其中第一次安装启用了iCloud的应用程序时,没有出现问题。

1

我刚刚花了数小时尝试各种方法(重新启动、清理构建、卸载、撤销、重新创建授权等等)。

然后我意识到,在“+功能”旁边有“全部、调试、发布”选项卡,如果你在调试或发布中添加了该功能,则它仅适用于该环境。

Screenshot of capabilities environment

您必须在“所有”选项卡下创建该功能。如果您之前已经在Debug或Release下创建了它,请确保先删除该功能,然后再重新添加。


1

您似乎是在下载数据后添加观察器,这可能是错误的。

我发现当应用程序被从Xcode删除并重新安装时,如果您尝试从[didFinishLaunchingWithOptions:]太快读取[NSUbiquitousKeyValueStore defaultStore],则什么也不会发生。 如果您已经为NSUbiquitousKeyValueStoreDidChangeExternallyNotification添加了观察器,则该观察器将使用以下内容调用:

[[[notification userInfo] objectForKey: NSUbiquitousKeyValueStoreChangeReasonKey] intValue] == NSUbiquitousKeyValueStoreInitialSyncChange

从那里,您可以成功地从[NSUbiquitousKeyValueStore defaultStore]中读取。

其中一个优点是观察器还可以响应NSUbiquitousKeyValueStoreChangeReasonKey] intValue] == NSUbiquitousKeyValueStoreServerChange

并且设备将在其他设备执行[[NSUbiquitousKeyValueStore defaultStore] synchronize];之后很快获得由任何其他设备进行的更改。


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