Objective c UTI不';似乎没有得救
我有一个应用程序,应该尝试保存降价文件。这是my Info.plist中的相关部分:Objective c UTI不';似乎没有得救,objective-c,uti,Objective C,Uti,我有一个应用程序,应该尝试保存降价文件。这是my Info.plist中的相关部分: <dict> <key>CFBundleTypeExtensions</key> <array> <string>md</string> </array> <key>CFBundleTypeIconFile</key> <string>i
<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>
此外,我的应用程序似乎无法打开以前保存的文件,并出现错误:
错误域=NSCOCAERRORDOMAIN代码=256“自动保存的文档
无法重新打开“test10.md”。UserInfo=0x102210bf0
{NSLocalizedDescription=无法保存自动保存的文档“test10.md”
重新开放。}
我做错了什么?如何使其正确识别我的UTI?这里是猜测,但是如果类型可能已经存在于您的系统中(这两个类型似乎很可能存在),那么您可能应该导入它们,而不是导出它们 因此,它们应该位于
UTImportedTypeDeclarations
数组中,而不是UTExportedTypeDeclarations
从
如果您的代码依赖于系统上可能不存在的第三方UTI类型,则应将这些UTI声明为捆绑包中的导入类型
这里是猜测,但是如果类型可能已经在您的系统上(这两个看起来很可能是),那么您可能应该将它们导入类型而不是导出它们 因此,它们应该位于
UTImportedTypeDeclarations
数组中,而不是UTExportedTypeDeclarations
从
如果您的代码依赖于系统上可能不存在的第三方UTI类型,则应将这些UTI声明为捆绑包中的导入类型
我认为你的意见是错误的。您需要从物理树和功能树中获得一个超级类型 文档中有很多过时的东西,请参阅我的文章,了解您现在真正需要的部件。例如,您不再需要可导出类型: 关于进出口。这取决于此应用是否拥有该文件类型。如果是这样,它应该将其导出。如果没有,它应该导入它。在所有导出IIRC类型的应用程序中,最新的应用程序获胜。任何能够读取您的类型的应用程序都应该导入它。此外,如果应用程序声明它们能够使用您的UTI,则可以打开该文件。e、 g.如果您的格式符合纯文本,则TextEdit也可以打开它
此外,在进行实验时,您可能会无意中弄乱了LaunchServices UTI注册表。我的文章提到了一种清洁它的方法。我认为您的符合是不正确的。您需要从物理树和功能树中获得一个超级类型 文档中有很多过时的东西,请参阅我的文章,了解您现在真正需要的部件。例如,您不再需要可导出类型: 关于进出口。这取决于此应用是否拥有该文件类型。如果是这样,它应该将其导出。如果没有,它应该导入它。在所有导出IIRC类型的应用程序中,最新的应用程序获胜。任何能够读取您的类型的应用程序都应该导入它。此外,如果应用程序声明它们能够使用您的UTI,则可以打开该文件。e、 g.如果您的格式符合纯文本,则TextEdit也可以打开它
此外,在进行实验时,您可能会无意中弄乱了LaunchServices UTI注册表。我的文章提到了一种清理它的方法。问题是,如果我的一些用户没有安装该类型,会发生什么情况?文档中说:“导入的UTI声明用于声明捆绑包不拥有的类型,但希望看到该类型在系统上可用。例如,假设视频编辑程序使用专有格式创建文件,其UTI在其应用程序包中声明。如果您正在编写能够读取此类文件的应用程序或插件,则必须确保系统了解专有UTI,即使实际的视频编辑应用程序不可用。要做到这一点,您的应用程序应该在自己的包中重新声明UTI,但将其标记为导入声明。“啊,看起来上面缺少了另一个部分。很高兴您让它正常工作。然后问题是,如果我的一些用户没有安装该类型,会发生什么?文档中说:”导入的UTI声明用于声明捆绑包不拥有的类型,但希望看到该类型在系统上可用。例如,假设视频编辑程序使用专有格式创建文件,其UTI在其应用程序包中声明。如果您正在编写能够读取此类文件的应用程序或插件,则必须确保系统了解专有UTI,即使实际的视频编辑应用程序不可用。为此,应用程序应该在自己的包中重新声明UTI,但将其标记为导入的声明。“啊,看起来上面还有一块你丢的东西。很高兴你能使用它。是的,将
public.item
添加到我的UTTypeConformsTo
中成功了。是的,将public.item
添加到我的UTTypeConformsTo
中成功了。
<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>
kMDItemContentType = "dyn.ah62d4rv4ge8043a"
kMDItemContentTypeTree = (
"dyn.ah62d4rv4ge8043a",
"public.data",
"public.item"
)