2

自分では解決できないような奇妙な問題があります。どんな助けや考えも大歓迎です。

問題:

  • 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

もうどうしたらいいのかわからない。最も奇妙なことは、他のデバイスではまったく機能しないのに、一部のデバイスでは機能することです。

この問題に関するヒントをいただければ幸いです。どうもありがとう!

4

2 に答える 2

2

奇妙なことに、info.plist ファイルからLSItemContentTypes設定を削除する必要がありました。

<key>LSItemContentTypes</key>
  <array>
    <string>de.ac.prowriting.sketch</string>
  </array>

この設定が原因で、エクスポートしたカスタム UTI ファイルラッパー ファイルタイプがファイルとして正しく認識されず、フォルダーとして解釈されました。NSMetadataQuery はフォルダーを照会しません。そのため、ファイルが見つかりませんでした。

残念ながら、私は Mac アプリも持っており、カスタム ファイルタイプがデスクトップに正しく登録され、Mobile Documents iCloud フォルダーに影響を与えていました。そのため、ほとんどのデバイスで機能しましたが、テスターでは機能しませんでした。

于 2013-02-21T02:42:47.670 に答える
1

ファイル名述語で検索するのではなく、UTI 型のツリー述語形式を使用します。

以下を使用して、特定のファイル URL にあるすべてのファイル、フォルダー、パッケージ、およびバンドルを返しました。

NSMetadataQuery *query = [NSMetadataQuery new];
[query setSearchScopes:@[url]];

NSPredicate *filePredicate = [NSPredicate predicateWithFormat:@"kMDItemContentTypeTree = %@", kUTTypeData];
NSPredicate *bundlePredicate = [NSPredicate predicateWithFormat:@"kMDItemContentTypeTree = %@", kUTTypeBundle];
NSPredicate *packagePredicate = [NSPredicate predicateWithFormat:@"kMDItemContentTypeTree = %@", kUTTypePackage];
NSPredicate *folderPredicate = [NSPredicate predicateWithFormat:@"kMDItemContentTypeTree = %@", kUTTypeFolder];

NSPredicate *searchPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[filePredicate, bundlePredicate, packagePredicate, folderPredicate]];

[query setPredicate:searchPredicate];
于 2015-02-18T11:27:02.350 に答える