我有一个应该尝试保存Markdown文件的应用。这是我的Info.plist中的相关部分:
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>md</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>icon.icns</string>
<key>CFBundleTypeName</key>
<string>Markdown document</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSItemContentTypes</key>
<array>
<string>net.daringfireball.markdown</string>
</array>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>NSDocumentClass</key>
<string>MyDocument</string>
<key>NSExportableAs</key>
<array>
<string>Microsoft Word Document</string>
<string>RTF</string>
<string>HTML</string>
</array>
<key>NSExportableTypes</key>
<array>
<string>net.daringfireball.markdown</string>
<string>com.microsoft.word.doc</string>
<string>public.rtf</string>
<string>public.html</string>
</array>
</dict>
如您所见,我还需要该应用程序才能导出到doc,html和rtf。
这是UTExportedTypeDeclarations:
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.source</string>
</array>
<key>UTTypeDescription</key>
<string>Markdown document</string>
<key>UTTypeIdentifier</key>
<string>net.daringfireball.markdown</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>md</string>
</array>
</dict>
</dict>
现在,当我在我的应用中保存文档,然后在我得到的文件上运行mdls
时:
kMDItemContentType = "dyn.ah62d4rv4ge8043a"
kMDItemContentTypeTree = (
"dyn.ah62d4rv4ge8043a",
"public.data",
"public.item"
)
此外,我的应用程序似乎无法打开以前保存的文件并出错:
Error Domain = NSCocoaErrorDomain Code = 256“自动保存的文档 “test10.md”无法重新打开。 “UserInfo = 0x102210bf0 {NSLocalizedDescription =自动保存的文档“test10.md”不能 重新开放。 }
我做错了什么?如何让它正确识别我的UTI?
答案 0 :(得分:4)
我相信你的符合是不正确的。你需要从物理树和功能树中获得超类型。
文档中有许多过时的内容,请参阅我的文章,了解您现在真正需要的部分。例如,您不再需要可导出类型:http://www.cocoanetics.com/2012/09/fun-with-uti/
关于进口/出口。这取决于此应用程序是否拥有该文件类型。如果是,它应该导出它。如果不是,它应该导入它。在导出IIRC类型的所有应用程序中,最新的一个获胜。任何能够读取您的类型的应用都应该导入它。此外,表明他们能够使用您的UTI向上工作的应用程序可以打开该文件。例如如果你的格式符合纯文本,那么TextEdit也可以打开它。
另外,通过您的实验,您可能无意中搞砸了您的启动服务UTI注册表。我的文章提到了清理它的方法。
答案 1 :(得分:0)
在这里猜测,但是如果类型已经存在于你的系统上(这两个似乎可能是这样),你可能应该导入它们而不是导出它们吗?
因此,UTExportedTypeDeclarations
数组应该在UTImportedTypeDeclarations
数组中而不是{{1}}。
如果您的代码依赖于系统上可能不存在的第三方UTI类型,则应将这些UTI声明为捆绑中的导入类型。