2012-08-16 27 views
5

私のアプリでは、iCloudキー値ストレージを使用してユーザー設定を保存します。私は両方のアプリがインストールされているときに私のiPadとiPhoneの間で完全に同期します。私の問題は、私がアプリを削除したときに新しく実行すると、初めて実行するときにiCloudの設定がないことです。私はもう一度それを実行した後、初めての設定を持っていないにもかかわらず、それはそれらを持っています。アプリが初めて起動したときにiCloudが動作しない

私はいくつかのNSLogを使ってキー値コンテナに表示されているものを見て、初めてアプリケーションを実行すると「(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を使用しています。

+0

好奇心をNSFileManagerの-URLForUbiquityContainerIdentifier:メソッドを使用するには? –

+0

を使用して、iCloudがデバイスで有効になっているかどうかを確認します。 – erkanyildiz

+1

注:他のすべての理由で常にフォールバックがあります。それは非常に重要です。通常のサーバー変更と同じ方法で、処理されていない他のすべての理由を考慮することができます。 – Julien

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]; 
関連する問題