我已经写了自定义文档聚光灯进口商键入我的应用程序定义。
一切工作正常,元数据字段被正确地聚焦索引(使用验证mdls
命令),和Spotlight搜索显示我的文档。
我唯一的问题是,我的物品在指定<displayattrs>
的部分schema.xml
文件中的“详细信息”一节中,当我询问有关文件(Cmd的+在Finder I)信息不显示。
我预计这些领域出现那里,因为我宣布他们俩在<allattrs>
和<displayattrs>
部分。
我发现这里涉及到这个问题几个问题,没有人帮助我。
进口商捆绑到应用程序,由系统加载( mdimport -L
证实了这一点)。 此外,光纤束结构似乎是正确的,在schema.xml
出现在资源文件夹,还有schema.strings
在EN / lproj文件夹。
这里是什么样schema.xml
文件是这样的:
<schema version="1.0"
xmlns="http://www.apple.com/metadata"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.apple.com/metadata file:///System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/MetadataSchema.xsd">
<types>
<type name="com.mydomain.myapp.mydocument">
<allattrs>
kMDItemTitle kMDItemAuthors kMDItemAlbum
</allattrs>
<displayattrs>
kMDItemTitle kMDItemAuthors kMDItemAlbum
</displayattrs>
</type>
</types>
一对夫妇的事情更多,我的系统缺乏mdcheckschema
命令,但XML文件是如此短暂,我怀疑是有语法问题。
有时候,“更多信息”部分显示文件的最后启用日期,有时什么也没有。
最后,我想重新导入文件( mdimport
),都无济于事。
我在运行Mac OS X狮子颇富10.8.3时,Xcode 4.6.2。
所以在这里我的问题,我失去的东西有“更多信息”一节中显示的那些项目? 有没有人谁经历过这样的问题,并找到了解决办法?
编辑 :
没有人回答我的问题,到目前为止,也许有人可以点我对这个问题的一些教程或文档?
我知道文斯可能已经早已解决了这个(或放弃)。 但是我刚刚花了令人沮丧的很长一段时间通过各种记录不完整或完全无证问题与写作的供应工作,所以我想我会在这里记录我的发现。 (这恐怕已经变成了一篇文章 - 这是一个复杂的问题)。
让我们假设:
这里有一些事情要检查:
别人需要声明UTI(S)的文件类型,你要导入。
- 如果你导入的文件系统申报类型,然后OSX宣布对你的UTI。
- 如果你的进口商嵌入到应用程序包,然后应用程序应该通过声明UTI
UTExportedTypeDeclarations
在应用程序的Info.plist键。 - 如果要导入第三方文档类型,然后检查“拥有”应用程序的文档类型已经宣布它尿路感染的
UTExportedTypeDeclarations
在应用程序的Info.plist键。 如果应用程序没有宣布一个UTI(有的不和仍然使用旧CFBundleDocumentTypes
- > CFBundleTypeExtensions
键代替),或者如果你想,即使没有那么安装应用程式的进口工作,你必须创建一个“虚拟”的应用程序,其唯一目的是在申报UTI(S) UTImportedTypeDeclarations
在应用程序的Info.plist键。 类似的地方/库/ Application Support / MYORG / myApp.app安装 “虚拟” 的应用程序。 你的进口商必须是独立的,不应该被嵌入在该应用程序的包,因为焦点将不会从该用户没有打开的应用程序运行的进口商。
有没有点声明你在导入UTI(S) UTImportedTypeDeclarations
或UTExportedTypeDeclarations
钥匙放在进口商的Info.plist -从那里LaunchServices就不能可靠地读取它们使焦点将无法识别它们。 然而,你必须通过指的他们注册在UTI(S)的兴趣CFBundleDocumentTypes
- > LSItemContentTypes
在进口商的Info.plist键(一个或多个)。
有人的症状别人没有正确地宣布UTI是mdimport -n -d1 /some/file.ext
说:
-
Imported '/some/file.ext' of type 'dyn.xxx' ...
或(混淆的): -
Imported '/some/file.ext' of type 'the.correct.uti' with no plugIn
。
。
如果你的进口商返回属性没有在你的文档的UTI元数据架构上市,或任何父尿路感染,那么聚光灯抛出属性了 。 即使像kMDItemAuthors一个标准的属性。 要理解为什么,我们需要看看焦点详细的工作原理:
- 一个应用程序中声明一个或多个泌尿系感染
UTImportedTypeDeclarations
或UTExportedTypeDeclarations
关键。 在每个UTI声明,该应用指定在一个或多个“父”尿路感染UTTypeConformsTo
键。 父UTI应是具体的,如果可能的东西 - 如“public.image”如果应用程序正在申报一个新的类型的图像文件 - 或者只是“public.data”如果没有别的为宜。
- :您可以通过研读的LaunchServices数据库的内容看UTI层次结构的当前状态
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump
。 - 但是,这是棘手的破译。 幸运的是,你会通常会更感兴趣,可以通过以下方式获得一个“干净”的机器的UTI层次
plutil -p /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist
。
聚光灯维持“模式”,它列出感兴趣的metatdata属性吧:
- 可以看到元数据模式的当前状态与
mdimport -X 2>&1
。 - 你可以看到在/System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/schema.plist的一个“干净”的机器的元数据架构。
当聚光灯是决定做什么来存放它的交叉引用您的对阵双方UTI层次结构和元数据架构进口商的输出。 因此,对于每个属性,你的回报进口商:
- 聚焦中查找文件的元数据架构UTI。 如果存在的UTI的条目,然后重点应的属性,无论您的进口商回报是根据所列出的检查
allattrs
关键。 如果它是那么的Spotlight记录了你的进口商在其数据库提供的值。 - 否则射灯查找在UTI层次中的父UTI,直到它击中“public.data”重复此过程。
- 如果聚焦找不到列出的属性
allattrs
为您的文档的UTI键,或任何父尿路感染,那么它扔掉你的进口商提供的值。
。
如果你的文档的UTI元数据架构没有列出显示存储在聚光灯数据库的属性,或任何父尿路感染,那么Finder的“获取信息”窗口将不会显示。 即使像kMDItemAuthors一个标准的属性。
- 取景器遵循类似的过程,以聚光灯上述,不同的是将查询
displayattrs
键而不是allattrs
在元数据数据库的密钥。 - 显示在哪些属性的顺序取决于它们在元数据架构层次中的位置。
。
如果您想要控制聚光灯商店和/或什么Finder的“获取信息”窗口显示那么你的进口商必须提供一个自定义模式。
- 自定义schema.xml中的格式相当有据可查。 不幸的是,
mdcheckschema
的文档不再附带的Xcode中提到的命令。 如果你有一台机器与旧版本的OSX和Xcode中,你可以从它复制/usr/bin/mdcheckschema
。 如果你有一个苹果开发者帐户,您可以从/Packages/DeveloperToolsCLI.pkg上伤害了“雪豹的Xcode 4.2”提取出来。 - 你不必列出您的进口商支持的每个属性
allattrs
和displayattrs
键-只有那些没有在/System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata父母或祖父母UTI列出的那些属性。框架/资源/ schema.plist。 - 但是,如果你想控制哪些属性显示在“获取信息”窗口中,你应该列出你想在你希望的顺序首先显示属性的顺序
displayattrs
关键。 (参见例如在架构,该架构复制从其父“public.audiovisual内容”某些键“public.movie”,使他们显示第一)。 - 你的架构必须定义在至少一个自定义属性
attributes
中的部分和参考吧allattrs
键,否则射灯忽略了整体架构。 如果进口商没有提供任何自定义属性,然后只需添加一个虚假的自定义属性的架构反正。 (这个要求到达雪豹后一段时间,完全是无证,并可能是其中文斯去错了)。 - 如果你的模式定义自定义属性(它应该,见前面的点),那么你必须提供英语schema.strings它的定位,否则射灯忽略了整体架构。 (当然欢迎您提供其他本地化太)。
- 请检查您是否在您的Xcode项目中的“复制包资源”相那份
schema.xml
和schema.strings
到你的产品。 - 仔细检查内容/资源/ schema.xml中和内容/资源/ en.lproj / schema.strings或内容/资源/ English.lproj / schema.strings 确实存在于你的内置产品; 一些旧版本的Xcode没有复制他们的对面。
- 检查
file /path/to/your/built/importer.mdimporter/Contents/Resources/en.lproj/schema.strings
说: -
Little-endian UTF-16 Unicode c program text
。
得到任何上述错误的的症状是mdimport -X 2>&1 | grep -A20 uti.of.interest
mdimport -X 2>&1 | grep -A20 uti.of.interest
要么什么都不返回或者返回一个空的架构,你的进口商的schema.xml中试图定义UTI。
Spotlight不会总是注意及时改变。
- 在测试您的进口商的更新版本,先删除旧的进口商(或包含它,如果它嵌入到应用程序包中的全部应用程序),然后键入
mdimport -L
检查焦点已经注意到,它的消失(这可能需要〜30秒)之前部署的更新版本。 类型mdimport -L
再次检查焦点已经注意到恢复测试之前的更新版本(再次这可能需要花费30多岁〜)。 如果你发布的.pkg文件的独立进口商,那么你应该包括一个后脚本,以1:告诉LaunchServices该软件包已更新(安装程序会自动执行此操作的应用程序,但不支持其他类型的包)和2:踢成焦点重新索引为当前用户,你的进口商理解文档类型:
#!/bin/sh touch -c "$2" if [ -n "$USER" ]; then sudo -u "$USER" /usr/bin/mdimport -r "$2"; fi true
LaunchServices并不总是注意及时变化,并保持旧的信息躺在附近。
如果您在更改UTI(S)的应用程序声明,或将其与UTI(S),对您的进口商寄存器,然后LaunchServices和Spotlight可以感到困惑的声明。 您可以完全复位LaunchServices,并从规范的地方用它来重新阅读:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -v -kill -seed -domain system -domain network -domain local -domain user
如果要模拟在开发系统上一个“干净”安装您的进口商和/或应用程序,这也是有用的。
编辑: 该项目在GitHub上说明点上方1-5。