6

2 つのアプリ (1 つは iOS、もう 1 つは Mac) の間で動作するセットアップがあり、どちらもユビキタス コンテナーにファイルを配置し、NSMetadataQuery を使用してそのコンテナーを監視します。ほとんどの場合、ディレクトリでファイルが setUbiquitous:YES に設定された直後にクエリが更新されます。

ただし、同期時にコンテナーが完全に空になる可能性がある別の厄介な iCloud バグに関連して (アプリやユーザーによってではなく、自動的に)、アプリ間の「クリーンセットアップ」がバグによって破損すると、クエリ - iPhone 側のみ - 更新されなくなりました。

iPhone のコンテナーにファイルを追加すると、Mac はそれらをすぐに認識します。しかし、Mac 側でファイルを追加すると、iPhone は更新されません。タイマーとファイル マネージャーを使用してコンテナーをスキャンすると、コンテンツにファイルが一覧表示されていることを確認できます。それらを認識しないのはクエリです。

これはコードの問題ではないと思いますが、ここに含めておきます。これは「iCloud はベータ版 (せいぜい)」の問題だと思いますが、誰かがこの質問に答えられるかどうか疑問に思っています:アプリを終了して再起動するとクエリが正しく更新されるため、NSMetadataQuery を強制的にアップデート? それを削除して別のものを作成しても何も起こりません。

クエリ コードは次のとおりです (どの NSNotification モニターにも正しく報告されます)。

    self.query = [[[NSMetadataQuery alloc] init] autorelease];
    [query setDelegate:self];
    [query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];
    [query setPredicate:[NSPredicate predicateWithFormat:@"%K like[cd] %@", NSMetadataItemFSNameKey, @"*"]];
    [query startQuery];

ポーリングコードは次のとおりです(フォルダーにファイルがあると言っています):

 - (void)pollUbiquitousStore:(NSTimer *)aUbiquitousStoreMonitor {
     //Query update
     NSArray *topLevelCloudContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[self.fileController.cloudFolderURL.path stringByAppendingPathComponent:@"Documents"] error:nil];
     NSLog(@"known iCloud url: %@ contents: %@", self.fileController.cloudFolderURL, topLevelCloudContents);

ここでクエリを監視します(システムがホースになった場合を除いて結果を取得します):

    //Refresh
    id queryGatheringObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSMetadataQueryGatheringProgressNotification object:aQuery queue:nil usingBlock:^(NSNotification *note) {
        refresh((NSMetadataQuery *)[note object]);
    }];
    id queryUpdateObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSMetadataQueryDidUpdateNotification object:aQuery queue:nil usingBlock:^(NSNotification *note) {
        refresh((NSMetadataQuery *)[note object]);
    }];

さて、あなたは「あなたはそれがホースであると言っています、なぜ最初からやり直さないのですか?」と言っているかもしれません. 私が答える - 両方のデバイスから両方のアプリを削除し、iCloud をオフにし、両方のコンピューターの [設定] の [ドキュメントとデータ] からアプリを削除し、両方のアプリを再ダウンロードする必要があることをユーザーに伝えることはできません。またいつでも」。アプリに主要な冗長性を構築しようとしています。

ありがとう!

4

0 に答える 0