【问题标题】:Export UIDocument with custom file package UTI使用自定义文件包 UTI 导出 UIDocument
【发布时间】:2017-04-17 16:38:42
【问题描述】:

我正在尝试使用UIDocumentPickerViewController 导出我的UIDocument 子类。子类将数据写入FileWrapper,其UTI 符合com.apple.package

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

文档成功写入缓存,从导出的容器包中可以看到。

当我更改文档子类和自定义 UTI 以符合单个文件(例如 public.plain-text)时,文档选择器工作正常,我可以导出文件。所以问题似乎出在文档类型或导出的 UTI 上。

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


Info.plist

<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)
    }

}

【问题讨论】:

    标签: ios icloud uidocument uti nsfilewrapper


    【解决方案1】:

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

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

    我不知道为什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      相关资源
      最近更新 更多