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 をオフにし、両方のコンピューターの [設定] の [ドキュメントとデータ] からアプリを削除し、両方のアプリを再ダウンロードする必要があることをユーザーに伝えることはできません。またいつでも」。アプリに主要な冗長性を構築しようとしています。
ありがとう!