2013-02-18 3 views
2

나는 스스로 해결할 수없는 이상한 문제가 있습니다. 어떤 도움이나 생각이 부탁드립니다.NSMetadataQuery는 NSFileWrapper 폴더 번들을 찾지 못하지만 파일 만 있습니다 (그러나 거기에 있습니다).

문제 :

  • NSMetadataQuery이 (TEST.TXT처럼) 일반 파일을 발견하지만 filewrapper 번들 (myWrapperDocument.pro)는
  • 그러나, NSFileManager를 내 유비쿼터스 컨테이너에있는 모든 파일을 발견하지 - 그래서 거기에 파일이 있지만 NSMetadataQuery 그들을 찾을 수 없습니다!

사실 :

  • UIDocument 기반 응용 프로그램 사용 NSFileWrappers (iOS 및 데스크톱 응용 프로그램에 대한)
  • 공유 유비 컨테이너
  • 맥 OS에 완벽하게 작동
  • 가에 완벽하게 작동 내 iPad Mini 및 iPhone 4S 및 iPhone 3GS (iOS6 및 iOS5 실행)
  • iPad1에서 작동하지 않습니다. 내 베타 테스터의 장치의 대부분 (iOS5를 실행 아이 패드 1, 2 & 3 또는 6) 내가 지금까지 무슨 짓을

:

  • 공부 WWDC12 UIDocument & iCloud에 예 (CloudNotes.xcodeproj)
  • 불행히도 운이없는 애플의 dev 포럼에서 공부 한 시간
  • 많은 다른 조건을 테스트하고 자격 및 문서 설정을 확인했습니다 (시스템에서 알고있는 것처럼 폴더 있지만, 문서 다발)
  • 지우기 및 편재 용기

에게 관련 코드를 재설정 :

타이틀먼트 정확해야;

- (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); 
} 
: 의 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> 

유비쿼터스 컨테이너와 아이 클라우드 문서의 URL이 모두 괜찮 (I 문서 유형이 올바르게 등록 된 생각)

정말 이상한 점은 하나의 파일 "test.txt"로 쿼리가 반환되지만 나머지는 감지되지 않는 것입니다. 그러나 로그에서 볼 수 있듯이 컨테이너에는 84 개의 .pro 파일 (모두 "something.pro")이 있지만 쿼리는 "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 

난 정말 더 이상 어떻게 해야할지 모르겠어요. 가장 이상한 것은 일부 장치에서는 작동하지만 다른 장치에서는 전혀 작동하지 않는다는 것입니다.

나는이 문제에 대한 어떤 힌트에 대해서도 감사 할 것입니다. 고마워요!

+1

패키지가 패키지로 나타나거나 다운로드 할 수 있습니까? "foo.pro"(실제 파일)를 검색하기 위해 술어를 변경하면 그 작업이 수행됩니까? –

+0

예, 패키지가 표시되며 폴더가 아닌 파일로 표시됩니다. Foo.pro가 없습니다 (그러나 foo.txt는). 또한 모든 장치가 영향을받는 것은 아닙니다. 일부 장치는 완벽하게 작동하고 다른 장치는 전혀 작동하지 않습니다. 나는 그것이 FileWrapper/폴더와 관련이 있어야한다고 생각한다. 내 추측은 NSMetadataQuery가 폴더를보고하지 않는 것과 동시에 번들로 등록 되었기 때문에이 폴더의 내용을 무시하는 충돌이다. 번들이 올바르게 등록되지 않았다면, 래퍼의 내용이 나열 될 것으로 예상되지만, 그 경우도 아닙니다. – auco

+0

문제가 무엇인지 모릅니다. 패키지/폴더의 구현이 잘 작동합니다. 술어로 % K == foo.pro를 사용하면 –

답변

0

는 이상하게도, 나는LSItemContentTypes의 Info.plist 파일에서 설정을 제거 로했다 :이 설정을 내 보낸 사용자 정의 UTI filewrapper의 파일 형식을 인식 할 수 없습니다 이유가 있었다

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

제대로 파일로,하지만 폴더로 해석. NSMetadataQuery는 폴더를 쿼리하지 않기 때문에 내 파일을 찾지 못했습니다.

불행히도 Mac 응용 프로그램과 내 사용자 파일 유형이 Mobile Documents iCloud 폴더에 영향을주는 바탕 화면에 올바르게 등록되어 있습니다. 그래서 이것이 내 장치의 대부분에서 작동하는 이유 였지만 내 테스터 중 누구도 사용하지 못했습니다.

+0

비슷한 문제가 있습니다. 앱을 iCloud로 전환하면 iCloud 폴더의 데이터를 볼 수 있지만 결과는 나타나지 않지만 앱을 다시 시작하면 결과가 표시되지 않습니다. 이것은 시뮬레이터에서 발생하며 LSItemContentTypes를 제거했습니다. – zambono

+0

@ zambono : iCloud와 관련하여 시뮬레이터가 아닌 실제 장치를 사용하는 것이 좋습니다. 문제가 다른 것 같습니다. 내 문제는 폴더 번들이 올바르게 등록되지 않아 시스템이 파일을 파일로 보는 대신 해석 (= 무시)했기 때문입니다. – auco

+0

기기에서 계속 문제가 발생합니다. 나는 LSTypeIsPackage를 true로 설정했으며, 패키지 식별자를 제거하는 것은 직관적이라고 생각합니다. 앱에 여러 개의 문서가 있습니다. 하나는 효과가 있고 다른 하나는 효과가 없습니다. 둘 다 같은 방식으로 설정됩니다. – zambono

1

파일 이름 조건자를 검색하는 대신 UTI 유형 트리 조건 자 형식을 사용하십시오.

나는 주어진 파일의 URL에서 모든 파일, 폴더, 패키지 및 번들을 반환하려면 다음을 사용했습니다 : 당신이 https://developer.icloud.com/#documents는 않습니다에 가면

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];