自分では解決できないような奇妙な問題があります。どんな助けや考えも大歓迎です。
問題:
- NSMetadataQueryは通常のファイル(test.txtなど)を検出しますが、ファイルラッパーバンドル(myWrapperDocument.pro)は検出しません
- ただし、NSFileManagerは、ユビキタスコンテナ内のすべてのファイルを検出します。したがって、ファイルは存在しますが、NSMetadataQueryはそれらを検出しません。
事実:
- NSFileWrappersを使用したUIDocumentベースのアプリ
- 共有ユビキタスコンテナ(iOSおよびデスクトップアプリ用)
- MacOSで完璧に動作します
- iPadMiniとiPhone4SおよびiPhone3GS(iOS6およびiOS5を実行)で完璧に動作します
- iPad1でもほとんどのベータテスターのデバイス(iOS5または6を実行しているiPad 1、2、3)でも動作しません
私がこれまでにしたこと:
- WWDC12 UIDocumentとiCloudの例を学習しました(CloudNotes.xcodeproj)
- Appleの開発フォーラムとここで何時間も勉強しましたが、残念ながら運がありませんでした
- 多くの異なる述語をテストし、資格とドキュメントの設定を確認しました(したがって、システムは、それがフォルダーではなく、ドキュメントバンドルであることを認識します)
- ユビキタスコンテナのクリアとリセット
関連するコード:
資格は正しいはずです。Info.plistドキュメントの設定(ドキュメントタイプは正しく登録されていると思います)
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>pro</string>
</array>
<key>CFBundleTypeName</key>
<string>Prowriting Sketch</string>
<key>LSItemContentTypes</key>
<array>
<string>de.ac.prowriting.sketch</string>
</array>
<key>LSTypeIsPackage</key>
<true/>
</dict>
…
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>pro</string>
</array>
<key>LSTypeIsPackage</key>
<true/>
<key>UTTypeConformsTo</key>
<array>
<string>com.apple.package</string>
</array>
<key>UTTypeDescription</key>
<string>Prowriting Sketch</string>
<key>UTTypeIdentifier</key>
<string>de.ac.prowriting.sketch</string>
</dict>
ユビキタスコンテナとiCloudドキュメントのURLはすべて問題ありません。これが、クエリを設定する方法です。
- (void)startMetadataQuery {
// ...
[self.query setSearchScopes:@[NSMetadataQueryUbiquitousDocumentsScope]];
// search for all .pro documents, also tried other predicates, see below
NSString *predicate = [NSString stringWithFormat:@"%K like '*'"];
[self.query setPredicate:[NSPredicate predicateWithFormat:predicate, NSMetadataItemFSNameKey]];
// register observer (...)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishMetadataQuery:) name:NSMetadataQueryDidFinishGatheringNotification object:nil];
[self.query startQuery];
}
- (void)didFinishMetadataQuery:(NSNotification*)notification {
[self.query disableUpdates];
NSLog(@"+++ found %i results: \n%@", self.query.resultCount, self.query.results);
NSLog(@"+++ Results in iCloud folder: %i", [self.fileManager contentsOfDirectoryAtPath:self.iCloudDocumentsFolder.path error:nil].count);
}
本当に奇妙なことは、クエリが1つのファイル「test.txt」だけで返されるのに、他のファイルは検出されないままであるということです。ただし、ログからわかるように、コンテナには84個の.proファイル(すべて「something.pro」と呼ばれます)がありますが、クエリでは1つの「test.txt」しか見つかりません。
残念ながら、NSFileManagerを使用してこれらのファイルにアクセスすることはできません。これは、これらのファイルを読み取る権限がないように思われるためです。この問題はベータテスターのデバイスの新規インストールでも発生するため、コンテナーが破損しているとは思いませんか?
2013-02-18 +++ found 1 results: ("<NSMetadataItem: 0x3ac390> /private/var/mobile/Library/Mobile Documents/ABCD123456~de~ac~prowriting/Documents/test.txt")
2013-02-18 +++ Results in iCloud folder: 84
私はそれが述語だと思います、しかし:
@"%K like '*.pro*'" // returns nothing
@"%%K like '*.*'" // returns only the test.txt file
@"%%K like '*'" // returns only the test.txt file
@"%K LIKE *" // returns only the test.txt file
@"NSMetadataItemFSNameKey == '*'" // returns only the test.txt file
もうどうしたらいいのかわからない。最も奇妙なことは、他のデバイスではまったく機能しないのに、一部のデバイスでは機能することです。
この問題に関するヒントをいただければ幸いです。どうもありがとう!