7

NSUbiquitousKeyValueStore に問題があり、2 つのデバイス間で確実に同期することができません。それは私を怒らせ始めています。狂った。

私は自分のコードが次の呼び出しを行うのを見ています:

[[NSUbiquitousKeyValueStore defaultStore] setObject:_someData forKey:@"SomeData"];
[[NSUbiquitousKeyValueStore defaultStore] synchronize];

しかし、多くの場合、データが他のデバイスに表示されることはありません。

数秒以内に同期するのを見たことがありますが、1 時間待っても同期が見られないこともあります。デバイスを 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"}

そのパスは Apps サンドボックス (間違った 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 に答える
0

その場合、ジェイルブレイクされたデバイスを使用する場合は、icloudとGameCenterのサポートが正しく機能する前にAppSyncを削除する必要があります。明らかに、私はあなたがAppledevアカウントを持っていると思います。

于 2012-09-21T19:53:42.463 に答える
0

[Xcode のオーガナイザーを介して] デバイス コンソールを確認します。おそらく役立つ情報が含まれています。空の defaultStore 同期で YES が返された場合でも、権利が正しくない可能性があります。

于 2012-08-06T20:55:33.143 に答える
0

インストールされているアプリケーションのデバイス リスト内の古いキャッシュである可能性があります。デバイス上のアプリを削除して、再インストールしてみてください。または、デバイスを再起動してください。

1 つ確かなことは、bugreport.apple.com にレポートを提出することです。

于 2012-07-20T01:54:24.340 に答える