You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未知UTType是导出/导入时,Swift包中应使用哪个初始化器?

动态创建适配宿主应用的UTType方案

核心思路:读取宿主应用的Info.plist声明

通过检查当前运行的宿主应用Info.plist中对com.example.custom-document的声明类型(导出/导入),动态创建对应的UTType实例,无需调用者手动传递参数。

具体实现

1. 封装UTType检测逻辑

在Swift包中添加一个UTType的扩展方法,自动判断并返回正确的UTType:

import UniformTypeIdentifiers
import Foundation

extension UTType {
    static var customDocument: UTType {
        let targetIdentifier = "com.example.custom-document"
        guard let infoPlist = Bundle.main.infoDictionary else {
            // 兜底:默认使用导入类型,确保导出功能正常
            return UTType(importedAs: targetIdentifier)
        }
        
        // 检查是否为导出类型
        if let exportedTypes = infoPlist["UTExportedTypeDeclarations"] as? [[String: Any]],
           exportedTypes.contains(where: { $0["UTTypeIdentifier"] as? String == targetIdentifier }) {
            return UTType(exportedAs: targetIdentifier)
        }
        
        // 否则使用导入类型
        return UTType(importedAs: targetIdentifier)
    }
}

2. 在共享视图中直接调用

在.fileExporter中直接使用这个预定义的UTType属性,无需上层视图传递参数:

// 共享视图内的导出代码示例
.fileExporter(
    isPresented: $showExportSheet,
    document: currentDocument,
    contentType: .customDocument,
    defaultFilename: "New Document.custom"
) { exportResult in
    switch exportResult {
    case .success(let url):
        print("导出成功:\(url)")
    case .failure(let error):
        print("导出失败:\(error.localizedDescription)")
    }
}

关键说明

  • 利用Bundle.main获取宿主应用的配置,精准匹配App A(导出方)和App B(导入方)的不同声明。
  • 兜底逻辑确保即使Info.plist读取失败,导出功能依然能正常运行,不会因类型创建失败崩溃。
  • 完全避免了在复杂视图层级中传递UTType参数,保持了共享视图的职责单一性。

内容的提问来源于stack exchange,提问作者Sweeper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:42:21