1

我有一个应该尝试保存 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"
)

此外,我的应用似乎无法打开之前保存的文件并出现错误:

错误域=NSCocoaErrorDomain Code=256 “无法重新打开自动保存的文档“test10.md”。” UserInfo=0x102210bf0 {NSLocalizedDescription=无法重新打开自动保存的文档“test10.md”。}

我究竟做错了什么?我怎样才能让它正确识别我的尿路感染?

4

2 回答 2

4

我相信你的符合是不正确的。您需要从物理树和功能树中获得超类型。

文档中有很多过时的东西,请参阅我关于您现在真正需要的部分的文章。例如,您不再需要可导出类型:http: //www.cocoanetics.com/2012/09/fun-with-uti/

关于进出口。这取决于此应用程序是否拥有该文件类型。如果是这样,它应该导出它。如果不是,它应该导入它。在所有导出 IIRC 类型的应用程序中,最新的应用程序获胜。任何能够读取您的类型的应用程序都应该导入它。此外,声明他们能够从您的 UTI 向上使用的应用程序也可以打开该文件。例如,如果您的格式符合纯文本,那么 TextEdit 也可以打开它。

此外,通过您的试验,您可能无意中弄乱了您的启动服务 UTI 注册表。我的文章提到了一种清洁方法。

于 2012-12-09T09:20:09.620 回答
0

在这里猜测,但如果类型已经在您的系统上(这两个似乎可能是),也许您应该导入它们类型而不是导出它们?

因此,而不是UTExportedTypeDeclarations这些应该在UTImportedTypeDeclarations数组中。

来自UTI 概述

如果您的代码依赖于系统上可能不存在的第三方 UTI 类型,则应将这些 UTI 声明为捆绑包中的导入类型。

于 2012-12-08T22:13:13.113 回答