本文翻译自Launch Services Programming Guide,其中带
删除线的API已经被Apple标记为Deprecated。
本章总结了如何使用 Launch Services 在应用程序中执行常见任务。
打开项目
您要使用Launch Services来执行的最常见操作是打开应用程序,文档文件和URL。根据具体情况,您可以为此使用四个Launch Services功能中的任何一个: LSOpenFSRef , LSOpenFromRefSpec ,LSOpenCFURLRef
或LSOpenFromURLSpec
。
通过File-System Reference 打开项目
当您要打开的项目由file-system reference(FSRef
)标识时,最简单的打开方法是使用 -LSOpenFSRef- 。您只需提供file-system reference,Launch Services就以直接,简洁,默认的方式打开该项目:
- 如果指定的项目是应用程序:
- 如果该应用程序尚未运行,则将启动该应用程序并发送一个“ oapp”(“open application”)Apple事件。
- 如果该应用程序已经在运行,则将其激活(显示在屏幕的前面)并发送一个“ rapp”(“reopen application””)Apple事件。
- 如果指定的项目是文档,则其首选的应用程序将启动(如果已运行,则将其激活),并发送Apple事件“ odoc”(“open document”),指示其打开文档。
LSOpenFSRef 依次调用更通用的函数 LSOpenFromRefSpec ,这是“瑞士军刀”函数,可用于访问打开应用程序和文档的所有选项。如果您需要请求默认行为以外的其他内容,则可以直接自己调用此函数。例如,您可以使用它来:
- 在相同或不同的应用程序中一次打开多个文档
- 将文档在其自身首选应用程序以外的应用程序中强制打开
- 打开文档进行打印,而不是简单地查看或编辑
- 强制在Classic emulation环境中打开应用程序
- 打开指定的应用程序并隐藏所有其他应用程序
- 阻止将应用程序或文档添加到Finder的“最近的项目”菜单中
您也可以提供指向 launch specification 的指针,而不是直接使用对要打开的项目的file-system reference,该指针是一种类型为LSLaunchFSRefSpec
的数据结构,该数据结构标识了一个或多个项目以及有关如何打开它们的其他信息:
- 要打开一个或多个文档,请在launch specification的
itemRefs
字段中传递一个file-system reference的数组;numDocs
字段提供文档的数量。如果appRef
字段也不为空,则它指定要在哪个应用程序中打开文档。否则,每个文档将在其自己的首选应用程序中打开。 - 要在不指定任何文档的情况下打开应用程序,请在launch specification的
appRef
字段中将file-system reference传递给该应用程序,然后将itemRefs
字段设置为NULL,并将numDocs
设置为0。
Launch specification中的其他信息包括:
- 标志位(launchFlags)包含各种启动选项,用于控制打开应用程序的方式;请参阅 Launch Options
- 指向可选Apple事件描述符记录(passThruParams)的指针,该记录包含应用程序在打开时与Apple事件一起传递的参数信息
- 一个可选的引用常量(asyncRefCon),将传递给您的Carbon事件处理程序以进行异步启动通知,如上一章“同步和异步启动”一节中所述
对于 LSOpenFSRef 和 LSOpenFromRefSpec ,输出参数outLaunchedRef
包含指向file-system reference的指针,该函数将设置该file-system reference来指示已打开的应用程序(如果在不同应用程序中打开了多个文档,则为第一个此类应用程序)。如果不需要此信息,则可以将此参数设置为NULL。
通过URL打开项目
要打开URL,请使用 Launch Services 函数 LSOpenCFURLRef
或LSOpenFromURLSpec
。它们类似于 LSOpenFSRef 和 LSOpenFromRefSpec ,但是接受Core Foundation URL references(CFURLRef)作为参数,而不是file-system references。当您具有要打开的应用程序或文档的文件系统路径名时,这些功能通常也很有用:您可以使用包含路径的scheme file
构造URL,然后使用该URL代替file-system references来打开文件系统路径。 LSOpenCFURLRef
和LSOpenFromURLSpec
函数是使用其他scheme(例如http,ftp或mailto)打开URL的唯一方法。
像用于file-system references的 LSOpenFSRef 一样,LSOpenCFURLRef
以默认方式在其首选应用程序中打开指定的URL。更通用的函数LSOpenFromURLSpec
接受launch specification(类似于 LSOpenFromRefSpec 的launch specification,但类型为LSLaunchURLSpec
而不是LSLaunchFSRefSpec
),它更详细地指定了URL的打开方式。与 LSOpenFromRefSpec 一样,如果您需要请求除LSOpenCFURLRef
提供的默认行为以外的其他内容,则可以直接自己调用此函数。
LSOpenCFURLRef
和LSOpenFromURLSpec
都确定要使用哪个应用程序打开指定的URL,启动该应用程序(如果已经运行,则将其激活),并向其发送一个Apple事件,指示其打开URL。 (使用LSOpenFromURLSpec
,您可以通过在launch specification的appURL
字段中明确指定另一个应用程序来覆盖URL的首选应用程序。)通常,该应用程序会收到一个“ GURL”(“get URL”)Apple事件;但是,如果该URL的scheme是file
格式,并且该应用程序未声明接受该scheme的URL,则会向其发送一个“ odoc”(“open document”)Apple事件。
像file-system references中的对应文件一样,这两个基于URL的函数都可以选择返回有关实际打开了哪个应用程序的信息(如果在不同的应用程序中打开了多个URL,则返回第一个)。该信息通过Core Foundation URL reference 传回,您可以在输出参数outLaunchedURL
中提供一个指针。如果应用程序的身份不重要,则可以将此参数设置为NULL。
查找项目的首选应用程序
要找到文档、URL或MIME类型的首选应用程序而不打开它,请分别使用Launch Services函数 LSGetApplicationForItem , LSGetApplicationForURL 或 LSCopyApplicationForMIMEType 。您可以通过对文档的file-system references(FSRef),对URL的Core Foundation URL references(CFURLRef)或对指定MIME类型的字符串的Core Foundation string reference(CFStringRef)来标识感兴趣的项目。另一个Launch Services函数 LSGetApplicationForInfo 可以找到由文档的文件类型、创建者签名、文件扩展名或这些特征的任意组合定义的文档系列的首选应用程序。
在每种情况下,您都必须提供一个角色掩码(LSRolesMask
),以指定应用程序应针对给定项目或项目系列声明的一个或多个角色(Editor, Viewer, or None)。 (请注意,“None”并不意味着“根本没有任何作用”,而是指应用程序可以针对该项目的承担特定的角色:提供标识信息(例如显示名称和图标文件)而实际上却不能打开项目本身。)如果您不在乎应用程序要求什么角色,请使用掩码值kLSRolesAll
。
要接收结果,您可以将指针传递到file-system references(在outAppRef
参数中),Core Foundation URL references(在outAppURL
参数中)或两者。 Launch Services将设置指定的数据结构以表示该项目的首选应用程序。如果您不希望以这种形式接收结果,则可以为这些参数中的任何一个传递一个空指针,但是两个指针中的至少一个必须为非空。 (对于 LSCopyApplicationForMIMEType ,只有URL选项可用;没有outAppRef
参数。)
要查找可以以指定角色打开给定项目的所有已知应用程序,请使用 Launch Services 函数LSCopyApplicationURLsForURL
。尽管此功能只能接受URL references,而不能接受file-system references,但是您也可以通过将带有scheme file
的URL传递给所需的文档,将其用于文档文件。
Launch Services 函数 LSFindApplicationForInfo 根据应用程序的名称、创建者签名、bundle ID或这些特征的任意组合来查找应用程序。 (请注意,这与LSGetApplicationForInfo的不同之处在于,指定的特征适用于应用程序本身,而不适用于它可以打开的文档。)与前面讨论的其他Launch Services函数一样,您可以将结果作为file-system references、URL或两者同时来接收,其中传递指向要相应信息的适当数据结构的指针。
测试应用程序是否可以打开项目
通常,找出给定的应用程序是否声明打开特定文档或URL的功能很有用。Launch Services 函数 LSCanRefAcceptItem 和LSCanURLAcceptURL
提供此信息。您提供对该项目和目标应用程序的file-system references 或URL references,以及控制该函数行为的某些技术方面的角色掩码和标志位;该函数通过设置一个布尔变量来响应,您可以向该变量提供一个指针,以指示应用程序是否可以接受指定的项目。
注册应用程序
通常,无需在Launch Services中显式注册应用程序,因为只要Finder知道该应用程序,启动系统或新用户登录,该操作就会自动为您完成(请参阅上一章“应用程序注册”)。在极少数情况下,您确实需要显式注册应用程序时(例如在自定义安装程序中),则可以使用Launch Services函数 LSRegisterFSRef 或LSRegisterURL
,具体取决于应用程序是通过file-system references还是Core Foundation URL reference。无论哪种情况,该应用程序及其文档绑定信息都将复制到Launch Services数据库中,从而使该应用程序可用于打开文档和URL。
获取有关项目的信息
您可以使用 Launch Services 函数 LSCopyItemInfoForRef 和 LSCopyItemInfoForURL 来获取有关file-system对象(例如应用程序,文档,文件夹或磁盘卷宗)的各种信息。您需要提供file-system references或Core Foundation URL reference(带有scheme file
)来标识感兴趣的项目,还要提供一个枚举变量(LSRequestedInfo
)指定所需的信息,并在其中指向项目信息记录(LSItemInfoRecord
)的指针以便接收信息。该记录中的信息可以包括项目的文件类型、创建者签名、文件扩展名以及描述项目属性的各种标志(请参阅上一章中的“项目信息”)。
有两个项目信息您可能会觉得有用,分别是它的显示名称(用于在屏幕上向用户显示其名称)和种类字符串(例如,在Finder的“显示简介”窗口或“项目”的“种类”列中使用) Finder的列表视图,以表征项目的一般性质,例如Application
、 Folder
、Alias
、JPEG Picture
、QuickTime Movie
或FrameMaker Document
。您可以使用 Launch Services 函数 LSCopyDisplayNameForRef 或 LSCopyDisplayNameForURL 获得显示名称,并使用 LSCopyKindStringForRef , LSCopyKindStringForURL , LSCopyKindStringForTypeInfo 或 LSCopyKindStringForMIMEType 获取类型字符串。