我正在开发一个用于编辑文件的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
块。我得到的错误是:
错误:错误Domain = NSCocoaErrorDomain Code = 256“”test.md“无法处理,因为MyApp无法以”md“格式打开文件。”无法处理UserInfo = {NSLocalizedDescription =“test.md”,因为MyApp无法以“md”格式打开文件。,NSLocalizedFailureReason = MyApp无法以“md”格式打开文件。}
我相信我已正确设置我的应用程序的标记文件类型,如下所示:
我已经尝试清理构建,删除派生数据,并为markdown文件添加'Imported UTI'类型但似乎没有任何效果。
奇怪的是,通过文件>打开,我能够打开.md
文件,只是不通过makeDocument
编程。
makeDocument(withContentsOf:ofType:)
期望一个类型作为第二个参数,而不是扩展。看看typeForContents(of url: URL)
如何从URL派生类型。
正如Marek H在他的回答中指出的那样,在info.plist中应该有一个文档类型的UTI(标识符)。
使用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
降价文件:
<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>