2016-12-02 103 views
8

我试图导出我的UIDocument子类与UIDocumentPickerViewController。子类将数据写入FileWrapper,其UTI符合com.apple.package导出UIDocument与自定义文件包UTI

但提交的文档选择器显示“iCloud Drive中的文档不可用,因为iCloud Drive设置已禁用。”

该文件是成功写入到缓存中,我可以从出口容器包装看。

Cache directory

当我改变文档的子类和定制UTI以符合单个文件(例如public.plain-text),该文件选择器工作正常,我可以导出文件。所以这个问题似乎与文件类型或导出的UTI有关。

我做错了什么或者这是一个错误?


的Info.plist

Document Type and Exported UTI

<key>CFBundleDocumentTypes</key> 
<array> 
    <dict> 
     <key>CFBundleTypeIconFiles</key> 
     <array/> 
     <key>CFBundleTypeName</key> 
     <string>Custom Doc</string> 
     <key>LSHandlerRank</key> 
     <string>Owner</string> 
     <key>LSItemContentTypes</key> 
     <array> 
      <string>com.zxzxlch.documentsandbox.customdoc</string> 
     </array> 
     <key>LSTypeIsPackage</key> 
     <true/> 
    </dict> 
</array> 

... 

<key>UTExportedTypeDeclarations</key> 
<array> 
    <dict> 
     <key>UTTypeConformsTo</key> 
     <array> 
      <string>com.apple.package</string> 
     </array> 
     <key>UTTypeDescription</key> 
     <string>Custom Doc File</string> 
     <key>UTTypeIdentifier</key> 
     <string>com.zxzxlch.documentsandbox.customdoc</string> 
     <key>UTTypeTagSpecification</key> 
     <dict> 
      <key>public.filename-extension</key> 
      <array> 
       <string>zzz</string> 
      </array> 
     </dict> 
    </dict> 
</array> 

CustomDocument.swift

private let textFilename = "contents.txt" 

class CustomDocument: UIDocument { 
    var content = "Test" 

    override func load(fromContents contents: Any, ofType typeName: String?) throws { 
     guard let topFileWrapper = contents as? FileWrapper, 
      let textData = topFileWrapper.fileWrappers?[textFilename]?.regularFileContents else { 
       return 
     } 
     content = String(data: textData, encoding: .utf8)! 
    } 

    override func contents(forType typeName: String) throws -> Any { 
     let textFileWrapper = FileWrapper(regularFileWithContents: content.data(using: .utf8)!) 
     textFileWrapper.preferredFilename = textFilename 

     return FileWrapper(directoryWithFileWrappers: [textFilename: textFileWrapper]) 
    } 

} 

ViewController.swift

func exportDocument() { 
    // Write to cache 
    let cachesDir = FileManager.default.urls(for: FileManager.SearchPathDirectory.cachesDirectory, in: .allDomainsMask).first! 
    let dataDir = cachesDir.appendingPathComponent("export", isDirectory: true) 
    try! FileManager.default.createDirectory(at: dataDir, withIntermediateDirectories: true, attributes: nil) 

    let fileURL = dataDir.appendingPathComponent("cookie").appendingPathExtension("zzz") 

    let archive = CustomDocument(fileURL: fileURL) 
    archive.content = "Cookie cat" 

    archive.save(to: archive.fileURL, for: .forCreating) { success in 
     guard success else { 
      let alertController = UIAlertController.notice(title: "Cannot export data", message: nil) 
      self.present(alertController, animated: true, completion: nil) 
      return 
     } 

     let documentPicker = UIDocumentPickerViewController(url: archive.fileURL, in: .exportToService) 
     documentPicker.delegate = self 
     self.present(documentPicker, animated: true, completion: nil) 
    } 

} 

回答

2

这解决了我的问题:使UTI也顺应public.composite-content,即

<key>UTTypeConformsTo</key> 
<array> 
    <string>com.apple.package</string> 
    <string>public.composite-content</string> 
</array> 

我不知道为什么,虽然。