2016-10-11 2 views
0

처음으로 iOS에서 UIDocumentPicker 확장 프로그램을 만들고 있습니다. 적절한 방법으로 UIDocumentPickerExtensionViewController 하위 클래스를 채 웠습니다. 내 UI에서 사용자가 내 확장 프로그램에서 문서를 선택하면 문제의 이미지를 문서 디렉토리에 성공적으로 복사 할 수 있습니다. 관련 코드 :이 모든 선택이 만들어진 후 위, 그러나, 통화가 dismissGrantingAccessToURL:로 만든 코드 경로에 따라 잘 진행`UIDocumentPickerExtensionViewController` :이 이미지는 unsuborted 유형입니다.

NSURL *sourceURL = [item imageUrlWithPath:image.fullSizeImagePath]; 
NSString *filename = [NSString stringWithFormat:@"%@.jpg", item.title ?: NSLocalizedString(@"NO_TITLE", nil)]; 
NSURL *targetURL = [self.documentStorageURL URLByAppendingPathComponent:filename]; 

NSError *copyError = nil; 
BOOL success = [fm copyItemAtURL:sourceURL toURL:targetURL error:&copyError]; 

if (success) { 
    [self dismissGrantingAccessToURL:targetURL]; 
} else { 
    NSLog(@"Error! %@", copyError); 
} 

는 UI 기각됩니다,하지만 난 호스트 응용 프로그램에서 경고를 얻을 (이 경우, Pages)에서 "이 이미지는 지원되지 않는 유형입니다."때문에 이미지를 삽입 할 수 없다는 메시지가 나타납니다.

상황은 내가 시도 :

  • 새 파일에 다른 파일 확장자 이미지를 재 압축 내 이미지
  • 의 다른 축소판
  • 사용 변화를 파일 이름을보십시오.

모두 사용할 수 없습니다. 내 파일을 다른 응용 프로그램에서 어떻게 읽을 수 없습니까?

답변

0

Xcode 8 이상에서 새 문서 공급자 확장을 만들 때 Apple은 파일 공급자라는 추가 확장명을 만듭니다. 이것은 서버와 같은 원격 서비스에서 파일을 가져 오기 위해 UI와 별도로 별도의 확장입니다. 이 기능은 파일이 물리적으로 장치 상에 있지 않지만 사용자가 호스트 응용 프로그램으로 파일을 가져올 수 있도록하려는 경우에 유용합니다.

이것의 불행한 부작용은 Apple이 NSFileProviderExtension의 하위 클래스 인 스텁 코드를 작성했기 때문입니다. 이 클래스를 발견하면 (기본값은 FileProvider), startProvidingItemAtURL:completionHandler: 메소드가 있습니다. 쉽게이 코드에서 볼 수있는 바와 같이

- (void)startProvidingItemAtURL:(NSURL *)url completionHandler:(void (^)(NSError *))completionHandler { 

    // Should ensure that the actual file is in the position returned by URLForItemWithIdentifier:, then call the completion handler 
    NSError *fileError = nil; 

    // TODO: get the contents of file at <url> from model 
    NSData *fileData = [NSData data]; 

    [fileData writeToURL:url options:0 error:&fileError]; 

    if (completionHandler) { 
     completionHandler(nil); 
    } 
} 

, 파일이 사실 이전부터 이미 존재하는 경우가 완전히 이미 작성한 수있는 파일을 덮어 쓰기 :이 방법은 애플이 거기에 넣어 가지고 몇 가지 미리 만든 코드가 피커 확장. 파일을 자동으로 지울 때까지 샘플 코드를 구하십시오. 이 문제를 해결하는 한 가지 방법은 완료 핸들러 호출을 제외하고,이 방법으로 코드의 모든 라인을 주석하는 것입니다 : 그와

- (void)startProvidingItemAtURL:(NSURL *)url completionHandler:(void (^)(NSError *))completionHandler { 
    if (completionHandler) { 
     completionHandler(nil); 
    } 
} 

는 문서 제공자는 바로 비가 같습니다.