NSCocoaErrorDomain Code=256 无法打开“md”格式的文件

NSCocoaErrorDomain Code=256 Cannot open files in the “md” format

我正在开发一个用于编辑文件的 macOS 应用程序,但在尝试使用 NSDocumentController.shared.makeDocument 从文件 URL 创建新的 NSDocument 实例时遇到了一个相当烦人的错误.

下面是我如何调用 makeDocument 的简单示例。磁盘上存在文件 test.md

let url = URL(fileURLWithPath: "/Users/me/Desktop/test.md"

do {
  let newDocument = try NSDocumentController.shared.makeDocument(withContentsOf: url, ofType: url.pathExtension)
  print("Created \(newDocument)")
} catch {
  print("Error: \(error)")
}

问题是这个 try 调用失败并到达 catch 块。我得到的错误是:

Error: Error Domain=NSCocoaErrorDomain Code=256 "“test.md” could not be handled because MyApp cannot open files in the “md” format." UserInfo={NSLocalizedDescription=“test.md” could not be handled because MyApp cannot open files in the “md” format., NSLocalizedFailureReason= MyApp cannot open files in the “md” format.}

我相信我已经为降价文件正确设置了应用程序的文档类型,如下所示:

我已经尝试清理构建、删除派生数据并为降价文件添加 'Imported UTI' 类型,但似乎没有任何效果。

奇怪的是,通过“文件”>“打开”,我可以打开 .md 个文件,只是不能通过 makeDocument.

以编程方式打开

使用来自 XCode 10 Info.plist 的示例及其设置验证生成的 Info.plist。 还要检查 lsregister 命令并查看您的应用程序是否已注册以处理 md.

lsregister(使用 switch dump 或 read man):

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister

Markdown 文档:

<dict>
    <key>CFBundleTypeName</key>
    <string>Markdown Document</string>
    <key>CFBundleTypeExtensions</key>
    <array>
        <string>md</string>
        <string>mdown</string>
        <string>markdown</string>
        <string>text</string>
    </array>
    <key>LSItemContentTypes</key>
    <array>
        <string>net.daringfireball.markdown</string>
    </array>
    <key>CFBundleTypeRole</key>
    <string>Editor</string>
    <key>CFBundleTypeIconFile</key>
    <string>net-daringfireball-markdown</string>
</dict>

makeDocument(withContentsOf:ofType:) 需要一个类型作为第二个参数,而不是扩展名。查看 typeForContents(of url: URL) 如何从 URL.

派生类型

见图6-3 https://developer.apple.com/library/archive/documentation/DataManagement/Conceptual/DocBasedAppProgrammingGuideForOSX/AdvancedTopics/AdvancedTopics.html

正如 Marek H 在他的回答中指出的那样,在 info.plist 中应该有一个用于文档类型的 UTI(标识符)。