NSUbiquitousKeyValueStore不是那么普遍存在?

时间:2015-01-07 17:47:54

标签: ios objective-c icloud nsubiquitouskeyvaluestore

我正在尝试使用NSUbiquitousKeyValueStore存储键值。安装应用程序时,它们似乎存储得很好,但如果我从设备上删除应用程序并再次运行应用程序,则键值似乎丢失了。这是预期的行为,还是有些东西我不知道?

我正在存储和检索如下值:

-(void)setString:(NSString*)stringValue forKey:(NSString*)keyValue {
    NSUbiquitousKeyValueStore *iCloudStore = [NSUbiquitousKeyValueStore defaultStore];
    [iCloudStore setString:stringValue forKey:keyValue];
    [iCloudStore synchronize];
}
-(NSString*)getStringForKey:(NSString*)keyValue {
    NSUbiquitousKeyValueStore *iCloudStore = [NSUbiquitousKeyValueStore defaultStore];
    return [iCloudStore stringForKey:keyValue];
}

我已经检查了什么:

  1. 我已在目标功能中启用了iCloud和键值存储。
  2. iCloud Drive已在我的设备上启用,应用程序本身已启用。
  3. 在尝试加载值之前我已经等了一段时间,以确保它不仅仅是一个同步问题。
  4. 我已根据Apple docs在NSNotificationCentre中为NSUbiquitousKeyValueStoreDidChangeExternallyNotification注册了一名观察员。在安装后的第一次运行或后续运行中,我的观察者从未被调用过。我的代码(从Apple docs剥离)

    NSUbiquitousKeyValueStore* store = [NSUbiquitousKeyValueStore defaultStore];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(updateKVStoreItems:)                                                         name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification
                                           object:store];
    [store synchronize];
    
    - (void)updateKVStoreItems:(NSNotification*)notification {
        NSLog(@"RECEIVED DATA");
    }
    
  5. 其他问题 -

    1. 有没有办法告诉你的数据何时同步到云?(即上传的数据)
    2. 或者相反,有没有办法告诉你的应用程序何时从云成功同步?(即下载的数据)我希望NSUbiquitousKeyValueStoreDidChangeExternallyNotification会通知此事,但由于我没有收到此通知,我怀疑它只是因为其他设备在应用程序打开时更新了数据,怀疑似乎是由Apple docs确认的:​​

        

      NSUbiquitousKeyValueStoreServerChange - iCloud中更改的值。当另一台运行应用程序的另一个实例并连接到同一iCloud帐户的设备上传新值时,会发生这种情况。"

    3.   

1 个答案:

答案 0 :(得分:0)

您是否在Application Developer中为Apple Developer Portal中的app id启用了iCloud?之后,您还必须为应用程序创建配置文件。

我在代码中看到的唯一区别是"名称:"参数。您需要指定要观察NSUbiquitousKeyValueStoreDidChangeExternallyNotification

[[NSNotificationCenter defaultCenter]
 addObserver: self
 selector: @selector (storeDidChange:)
 name: NSUbiquitousKeyValueStoreDidChangeExternallyNotification
 object: [NSUbiquitousKeyValueStore defaultStore]];

您的代码在我的环境中发出警告

Instance method '-addObserver:selector:object:' not found (return type defaults to 'id')

我也一直在使用setObject:forKey:而不是setString:forKey: