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

DocumentGroup无法打开macOS Package类型xcloc文件问题咨询

解决DocumentGroup无法加载xcloc包类型文件的问题

问题分析

xcloc是macOS下的包类型文件夹(本质为目录),使用DocumentGroup时,FileDocument的init(configuration: ReadConfiguration)方法未被触发,但普通xliff文件可正常加载,改用fileImport则能正常读取文件。核心原因是DocumentGroup对包类型文件的处理逻辑与单文件不同,且自定义UTType配置不够精准。

解决方案

1. 修正UTType配置

使用系统预定义的xcloc专属UTType,替代自定义的filenameExtension + .package,确保系统正确识别文件类型:

struct XliffFile: FileDocument {
    var xliff: XMLXliff
    
    static var readableContentTypes: [UTType] = [
        UTType(filenameExtension: "xliff", conformingTo: .data)!,
        UTType("com.apple.xcode.localization-catalog")! // 系统预定义xcloc类型
    ]
    
    // ... 其他代码
}

2. 适配包类型文件的读取逻辑

包是目录结构,需手动遍历内部文件(xcloc中包含xliff文件),修改init(configuration:)方法处理目录:

init(configuration: ReadConfiguration) throws {
    let fileURL = configuration.file.url
    if fileURL.hasDirectoryPath {
        // 遍历xcloc包,查找内部xliff文件
        guard let enumerator = FileManager.default.enumerator(at: fileURL, includingPropertiesForKeys: [.isRegularFileKey]) else {
            throw NSError(domain: "XliffEditor", code: -1, userInfo: [NSLocalizedDescriptionKey: "无法遍历xcloc包"])
        }
        // 读取第一个找到的xliff文件(可根据需求调整逻辑)
        for case let itemURL as URL in enumerator {
            guard itemURL.pathExtension.lowercased() == "xliff",
                  (try? itemURL.resourceValues(forKeys: [.isRegularFileKey]))?.isRegularFile == true else {
                continue
            }
            let data = try Data(contentsOf: itemURL)
            self.xliff = try XMLXliff(from: data) // 假设XMLXliff支持从Data初始化
            return
        }
        throw NSError(domain: "XliffEditor", code: -2, userInfo: [NSLocalizedDescriptionKey: "xcloc包中未找到xliff文件"])
    } else {
        // 处理普通xliff单文件
        let data = try Data(contentsOf: fileURL)
        self.xliff = try XMLXliff(from: data)
    }
}

3. 确保DocumentGroup配置正常

确认App结构体中的DocumentGroup初始化逻辑正确,未限制文件类型:

@main
struct XliffEditorApp: App {
    var body: some Scene {
        DocumentGroup(newDocument: XliffFile()) { file in
            ContentView(document: file.$document)
        }
    }
}

关键原因说明

  • DocumentGroup对UTType.package类型的文件不会自动触发单文件式的读取流程,需开发者手动处理目录遍历与内部文件解析。
  • fileImport直接返回目录URL,由开发者完全控制读取逻辑,因此不存在适配问题。
  • 自定义UTType时,仅通过filenameExtension绑定.package可能无法让系统精准识别xcloc类型,使用系统预定义UTType可避免此问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:03:33