2012-04-21 2 views
9

NSFileWrapper 기반 UIDocument를 사용하는 앱이 있습니다. 내 파일 래퍼는 두 개의 하위 파일 "photo.data"와 "photo.metadata"가있는 "XXX.cp"라는 디렉토리입니다. 그것은 저장하고 내가 설정에 갈 때 부하 문서는 잘하지만 \ 저장 \ 알 수없는 관리를 보인다 하위 파일은 별도로 나열되어 있습니다iCloud 및 NSFileWrapper : 설정에서 두 개의 다른 파일로 표시

Settings

내가 "XXX.cp"를 표시하는 대신 그것을 기다리고 있었다 이 두 개의 하위 파일. 내가 문서 UTI가 설정되어 제대로 내보낼 생각 :

UTI UTI Export

그리고 내가 제대로 파일 래퍼를 만드는 오전 생각합니다 (읽기 특히 이후/잘 쓰기) :

- (void)encodeObject:(id<NSCoding>)object toWrappers:(NSMutableDictionary *)wrappers preferredFilename:(NSString *)preferredFilename {  
    @autoreleasepool {     
     NSMutableData * data = [NSMutableData data];  
     NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];  
     [archiver encodeObject:object forKey:@"data"];  
     [archiver finishEncoding]; 
     NSFileWrapper * wrapper = [[NSFileWrapper alloc] initRegularFileWithContents:data];  
     [wrappers setObject:wrapper forKey:preferredFilename];  
    }  
}   

- (id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {   
    if (self.captionedPhotoMetadata == nil || self.captionedPhoto == nil) {  
     *outError = [[NSError alloc] initWithDomain:CaptionedPhotoErrorDomain code:CaptionedPhotoInvalidDocument userInfo:[NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Invalid document!", @""), NSLocalizedDescriptionKey, nil]];  
     return nil;   
    }  
    NSMutableDictionary * wrappers = [NSMutableDictionary dictionary];  
    [self encodeObject:self.captionedPhotoMetadata toWrappers:wrappers preferredFilename:METADATA_FILENAME];  
    [self encodeObject:self.captionedPhoto toWrappers:wrappers preferredFilename:DATA_FILENAME];  
    NSFileWrapper * fileWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:wrappers];  
    return fileWrapper;   
} 

하지만 여전히 여송연. 문제가 무엇인지 누구나 알고 있습니까? 감사!

답변

4

알아 냈습니다. 문제는 파일 이름 확장자를 3 자로해야한다는 것입니다. 내 편지에는 ".cp"라는 글자 2 개만있었습니다. 나는 그것을 ".cap"으로 바꿨고 작동했습니다 : P

+0

이 문제도 있었고 파일 확장자는 3 자입니다. 내 디렉터리 기반 파일 래퍼 확장명을 .tfx 사용합니다. 최근에 필자는 랩퍼 파일을 내 유비쿼터스 컨테이너의 별도 폴더에 넣기로 결심했다. SyncDocuments를 호출한다. 그렇게하면 개별 파일이 사용자에게 표시되지 않습니다. 하지만 내 UIDocument 하위 클래스 파일은 사용자가 직접 상호 작용하지 않기 때문에 실제로 원하는 것입니다. –

+0

나는 똑같은 문제점이 있지만 내 파일 확장자에는 3 개의 문자 (및 아이콘)가 있습니다. 나는 이것이 수출 된 UTI에서 물고기 같은 환경이라고 생각한다. 필자의 직감은 iCloud에서 어떤 종류의 캐싱이 일어나고 확장자를 .cp에서 .cap로 변경하면 문제가 해결되었다는 것입니다. – auco

+0

헤이 레이는 튜토리얼을 좋아하지만 아직 문제가 있습니다. 래퍼를 패키지로 표시 할 수는 있지만 nsmetadataquery는 패키지를 볼 수 없습니다. *가있는 모든 문서를 검색하는 경우 이벤트가 아닙니다. 내 첫 번째 문서 유형은 작동하지만 내 이미지는 작동하지 않습니다 – zambono

1

UTI를 3 자로 변경하지 않았습니다. 11 자로 남습니다. 처음에는 Ray가보고 한 것과 동일한 문제를보고있었습니다. 나는 문서를 자세히보고 "iOS Apps 프로그래밍 가이드"- "앱 관련 리소스"에서 "앱의 지원되는 문서 유형 선언"단락 아래에 있습니다. "각 문서 유형에 대해 최소한 다음 정보를 제공해야합니다.

  • 하는 이름입니다
  • 내가 이름과 파일 형식이 아닌 아이콘을 제공했다

파일 형식. 그래서 가장 멋진 작은 문서 아이콘을 채찍질 아이콘 나는 22 초 만에 그것을 나의 프로젝트에 추가 할 수 있었고, 그것을 Targe에 추가했다. t의 문서 형식 및 iPad, 설정, iCloud, 저장소 관리, MyApp에서 파일 래퍼 이름, NSMetadataItemDisplayNameKey 스타일 만 볼 수 있습니다.

0

나는 동일한 문제가 있었지만 내 확장에는 3 개의 문자가 있었고 아이콘도있었습니다. 그러나 this comment을 읽은 후 CFBundleDocumentTypes 섹션 ("문서 유형"의 두 번째 이미지에서 "Types : com.razeware.captionedPhoto")을 삭제하려고 시도했습니다.

WWDC 데모 "UIDocument 및 iCloud"에도 LSItemContentType이 설정되어 있지 않은 것으로 나타났습니다. the docs에는 문서 유형이 있어야한다고 분명히 나와있는 나에게 거대한 버그가있는 것 같습니다.