macos – 自定义Spotlight导入器和Finder的获取信息“更多信息”部分

macos – 自定义Spotlight导入器和Finder的获取信息“更多信息”部分,第1张

概述我为我的应用程序定义的自定义文档类型编写了Spotlight Importer. 一切正常,Spotlight正确索引元数据字段(使用mdls命令验证),Spotlight搜索显示我的文档. 我唯一的问题是我在< displayattrs>中指定的项目.当我询问有关文件的信息(Finder中的Cmd I)时,schema.xml文件的部分不会显示在“更多信息”部分中. 我希望这些字段出现在那里,因 我为我的应用程序定义的自定义文档类型编写了Spotlight importer.

一切正常,Spotlight正确索引元数据字段(使用mdls命令验证),Spotlight搜索显示我的文档.

我唯一的问题是我在< displayattrs>中指定的项目.当我询问有关文件的信息(Finder中的Cmd I)时,schema.xml文件的部分不会显示在“更多信息”部分中.

我希望这些字段出现在那里,因为我在< allattrs>中声明了它们.和< displayattrs>部分.

我在这里找到了几个与此问题相关的问题,但没有一个问题对我有帮助.

导入器捆绑到应用程序中,由系统加载(mdimport -L确认了这一点).
此外,bundle结构似乎正确,schema.xml出现在Resources文件夹中,以及en / lproj文件夹中的schema.strings.

这是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 Moutain lion 10.8.3,Xcode 4.6.2.

所以在这里我的问题是,我错过了在“更多信息”部分显示这些项目的内容吗?
是否有人遇到过这样的问题并找到了解决方案?

编辑:

到目前为止,没有人回答我的问题,也许有人可以指点我这个问题的教程或文档?

解决方法 我知道文斯可能很久就解决了这个问题(或者放弃了).但是,我花了很长时间来处理编写导入器的各种记录不完整或完全没有记录的问题,所以我想我会在这里记录我的发现. (我担心这已经变成了一篇文章 – 这是一个复杂的主题).

我们假设:

>您已经阅读了有关如何编写Spotlight导入程序的documentation,特别是故障排除指南.
>您已编写并调试了导入程序.

要在Xcode中调试导入器,请选择Product-> Scheme-> Edit Scheme并设置:

> Info->可执行到/usr/bin/mdimport
> Arguments->参数为-n -d2 -g $(BUILT_PRODUCTS_DIR)/ $(WRAPPER_name)/path/to/some/test/file.ext
>选项 – >工作目录到$(SRCROOT)

并在GetMetadataForURL()函数上设置断点.
> /usr/bin/mdimport -n -d2 -g /path/to/your/importer.mdimporter /path/to/some/test/file.ext的输出正确包含您的标准和/或自定义元数据属性意.
>您已部署导入程序进行测试(在/ library / Spotlight中独立/或嵌入在应用程序包中),mdimport -L列出导入程序.
>但是mdls /some/other/file.ext和/或Finder的“获取信息”窗口的输出不会显示您期望的元数据属性.

这里有一些要检查的事情:

>其他人需要声明您要导入的文档类型的UTI.

>如果您要导入system-declared类型的文档,则OSX已为您声明了UTI.
>如果您的导入程序嵌入在应用程序包中,则应用程序应通过应用程序的Info.pList中的UTExportedTypeDeclarations键声明UTI.
>如果您要导入第三方文档类型,请检查“拥有”文档类型的应用是否已在应用的Info.pList中的UTExportedTypeDeclarations键中为其声明了UTI.如果应用程序没有声明UTI(有些人没有,仍然使用旧的CFBundledocumentTypes-> CFBundleTypeExtensions键),或者如果你希望你的导入器工作,即使没有安装应用程序,那么你将不得不创建一个“虚拟”应用程序,其唯一目的是在应用程序的Info.pList中的UTimportedTypeDeclarations键中声明UTI.在/ library / Application Support / myOrg / myApp.app之类的地方安装“虚拟”应用程序.您的导入程序应该是独立的,不应嵌入此应用程序的捆绑包中,因为Spotlight不会从用户尚未打开的应用程序运行导入程序.

没有必要在导入器的Info.pList中声明您在UTimportedTypeDeclarations或UTExportedTypeDeclarations键中导入的UTI – LaunchServices将无法从那里可靠地读取它们,因此Spotlight将无法识别它们.但是,您必须通过在导入器的Info.pList中的CFBundledocumentTypes-> LSItemContentTypes键中引用它们来注册您对UTI的兴趣.

没有正确声明UTI的其他人的症状是mdimport -n -d1 /some/file.ext说:

>’dyn.xxx’类型的导入’/some/file.ext’…或(令人困惑):
>导入’/some/file.ext’类型为’the.correct.uti’,没有插件.

.
>如果导入器返回的属性未在文档的UTI或任何父UTI的元数据模式中列出,则Spotlight会抛弃该属性.即使它是像kMDItemAuthors这样的标准属性.要了解原因,我们需要详细了解Spotlight的工作原理:

>应用程序在UTimportedTypeDeclarations或UTExportedTypeDeclarations键中声明一个或多个UTI.
>在每个UTI声明中,应用程序在UTTypeConformsTo键中指定一个或多个“父”UTI.如果可能,父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获得.

> Spotlight维护一个“架构”,列出它感兴趣的元数据属性:

>您可以使用mdimport -X 2>& 1查看元数据架构的当前状态.
>您可以在/System/library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/schema.pList中查看“干净”计算机的元数据架构.

>当Spotlight决定存储什么时,它会针对UTI层次结构和元数据模式交叉引用导入器的输出.因此,对于导入器返回的每个属性:

> Spotlight在元数据模式中查找文档的UTI.如果存在UTI条目,则Spotlight会检查导入器返回的属性是否列在allattrs键下.如果是,则Spotlight会记录导入器在其数据库中提供的值.
>否则Spotlight会在UTI层次结构中查找父UTI并重复该过程,直到它命中“public.data”.
>如果Spotlight无法找到文档的UTI或任何父UTI的allattrs键中列出的属性,则会丢弃导入器提供的值.

.
>如果未列出Spotlight数据库中存储的属性,以便在文档的UTI或任何父UTI的元数据模式中显示,则Finder的“获取信息”窗口将不会显示该属性.即使它是像kMDItemAuthors这样的标准属性.

> Finder遵循与上述Spotlight类似的过程,除了它参考显示键而不是元数据数据库中的allattrs键.
>显示属性的顺序取决于它们在元数据模式层次结构中的位置.

.
>如果要控制Spotlight存储的内容和/或Finder的“获取信息”窗口,则导入器需要提供自定义模式.

>自定义schema.xml的格式已有详细记录.不幸的是,文档中提到的mdcheckschema命令不再附带Xcode.如果你的机器有旧版本的OSX& Xcode你可以从/usr/bin/mdcheckschema复制它.如果您有Apple Developer帐户,可以从“Xcode 4.2 for SNow Leopard”dmg上的/Packages/DeveloperToolsCli.pkg中提取.
>您不必在allattrs和displayattrs键中列出导入器支持的每个属性 – 只有那些未在/System/library/Frameworks/CoreServices.framework/Frameworks/Metadata中为父或祖父UTI列出的属性.framework / Resources / schema.pList.
>但是,如果要控制“获取信息”窗口中显示属性的顺序,则应在displayattrs键中列出要按所需顺序首先显示的属性. (例如,在模式中查看“public.movi​​e”,它从其父“public.audiovisual-content”复制某些键,以便首先显示它们).
>您的架构必须在属性部分中定义至少一个自定义属性,并在allattrs键中引用它,否则Spotlight会忽略整个架构.如果您的导入器不提供任何自定义属性,那么只需向架构添加虚假自定义属性. (这个要求在SNow Leopard之后的某个时间到达并且完全没有记录,并且可能是Vince出错的地方).
>如果您的模式定义了自定义属性(它应该;请参阅上一点),那么您必须为其提供英语schema.strings本地化,否则Spotlight会忽略整个模式. (当然,欢迎您提供其他本地化).
>检查Xcode项目中是否有“复制包资源”阶段,该阶段将schema.xml和schema.strings复制到产品中.
>仔细检查您的构建产品中是否确实存在Contents / Resources / schema.xml和Contents / Resources / en.lproj / schema.strings或Contents / Resources / English.lproj / schema.strings;一些旧版本的Xcode没有复制它们.
>检查文件/path/to/your/built/importer.mdimporter/Contents/Resources/en.lproj/schema.strings是否说:

> little-endian UTF-16 Unicode c程序文本.

得到任何上述错误的症状是mdimport -X 2>& 1 | grep -A20 uti.of.interest要么返回任何内容,要么返回导入器的schema.xml试图定义的UTI的空模式.
> Spotlight并不总是及时发现变化.

>在测试导入程序的更新版本时,首先删除旧导入程序(如果它嵌入应用程序包中,则删除包含它的整个应用程序)并键入mdimport -L以检查Spotlight是否已注意到它已消失(这可能需要约30秒) )在部署更新版本之前.再次输入mdimport -L以检查Spotlight是否已注意到更新后的版本(这可能需要约30秒)才能恢复测试.
>如果您要在.pkg文件中分发独立导入程序,那么您应该在1中包含一个postinstall脚本:告诉LaunchServices该软件包已更新(安装程序会自动为应用程序执行此 *** 作,但不会对其他软件包类型执行此 *** 作)和2 :使Spotlight重新为当前用户索引导入器理解的文档类型:

#!/ bin / sh的
触摸-c“$2”
if [-n“$USER”];然后sudo -u“$USER”/usr/bin/mdimport -r“$2”;科幻
真正

> LaunchServices并不总是及时发现变化,并保留旧信息.

>如果您正在对声明它们的应用程序中的UTI声明进行更改,或者对您的导入程序注册的UTI进行更改,那么LaunchServices和Spotlight可能会混淆.您可以完全重置LaunchServices并使其从标准位置重新读取:

/System/library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -v -kill -seed -domain system -domain network -domain local -domain user

如果您想在开发系统上模拟导入器和/或应用程序的“干净”安装,这也很有用.

编辑:This project在gitHub上说明了上面的第1-5点.

总结

以上是内存溢出为你收集整理的macos – 自定义Spotlight导入器和Finder的获取信息“更多信息”部分全部内容,希望文章能够帮你解决macos – 自定义Spotlight导入器和Finder的获取信息“更多信息”部分所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1006919.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存