2012-08-16 77 views
5

對於我的應用程序,我使用iCloud鍵值存儲來存儲一些用戶設置。當它們都安裝了應用程序時,它會在我的iPad和iPhone之間完美同步。我的問題是,當我刪除應用程序,並且新運行它時,它在第一次運行時沒有任何來自iCloud的設置。在我再次運行它之後,即使它第一次沒有設置,它也有它們。iCloud不適用第一次啓動應用程序

我使用了一些NSLogs來查看它在鍵值容器中看到的內容,並在第一次運行新應用程序時顯示「(null)」,但是任何後續運行都會打印出之前保存的NSArray。

我很樂意提供代碼,但我不完全確定這裏的相關內容。

我會很感激的任何幫助,這個問題讓我瘋了......

回答

6

添加觀察員NSUbiquitousKeyValueStoreDidChangeExternallyNotification和同步NSUbiquitousKeyValueStore。等待回調立即被調用。

if([[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]) 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyValueStoreChanged:) 
               name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification 
               object:[NSUbiquitousKeyValueStore defaultStore]]; 

    [[NSUbiquitousKeyValueStore defaultStore] synchronize]; 
} 
else 
{ 
     NSLog(@"iCloud is not enabled"); 
} 

然後使用NSUbiquitousKeyValueStoreChangeReasonKey的第一時間同步和服務器變化同步之間進行區分。

-(void)keyValueStoreChanged:(NSNotification*)notification 
{ 
    NSLog(@"keyValueStoreChanged"); 

    NSNumber *reason = [[notification userInfo] objectForKey:NSUbiquitousKeyValueStoreChangeReasonKey]; 

    if (reason) 
    { 
     NSInteger reasonValue = [reason integerValue]; 
     NSLog(@"keyValueStoreChanged with reason %d", reasonValue); 

     if (reasonValue == NSUbiquitousKeyValueStoreInitialSyncChange) 
     { 
      NSLog(@"Initial sync"); 
     } 
     else if (reasonValue == NSUbiquitousKeyValueStoreServerChange) 
     { 
      NSLog(@"Server change sync"); 
     } 
     else 
     { 
      NSLog(@"Another reason"); 
     } 
    } 
} 
+0

好奇...是什麼原因在NSFileManager上使用-URLForUbiquityContainerIdentifier方法? – 2012-08-16 20:55:10

+0

檢查iCloud是否在設備上啓用。 – erkanyildiz 2012-08-16 20:55:53

+1

注意:由於所有其他原因,始終有一個回退。這非常重要。您可以考慮所有其他未處理的原因,就像執行正常的服務器更改一樣。 – Julien 2012-08-16 20:58:49

1

安裝(並啓動)您的應用程序與KVS下載初始值可能存在延遲。如果你正確地註冊的變更通知,你應該看到的值在未來

你的代碼應該總是這個樣子,通常在你-applicationDidFinishLaunching:委託方法:

_store = [[NSUbiquitousKeyValueStore defaultStore] retain]; // this is the store we will be using 
// watch for any change of the store 
[[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(updateKVStoreItems:) 
     name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification 
     object:_store]; 
// make sure to deliver any change that might have happened while the app was not launched now 
[_store synchronize]; 
相關問題