关于macos:Launch-Services-Programming-Guide-03常见任务

7次阅读

共计 5314 个字符,预计需要花费 14 分钟才能阅读完成。

本文翻译自 Launch Services Programming Guide,其中带 删除线 的 API 曾经被 Apple 标记为 Deprecated。

本章总结了如何应用 Launch Services 在应用程序中执行常见工作。

关上我的项目

您要应用 Launch Services 来执行的最常见操作是关上应用程序,文档文件和 URL。依据具体情况,您能够为此应用四个 Launch Services 性能中的任何一个:LSOpenFSRefLSOpenFromRefSpecLSOpenCFURLRefLSOpenFromURLSpec

通过 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 事件处理程序以进行异步启动告诉,如上一章“同步和异步启动”一节中所述

对于 LSOpenFSRefLSOpenFromRefSpec,输入参数 outLaunchedRef 蕴含指向 file-system reference 的指针,该函数将设置该 file-system reference 来批示已关上的应用程序(如果在不同应用程序中关上了多个文档,则为第一个此类应用程序)。如果不须要此信息,则能够将此参数设置为 NULL。

通过 URL 关上我的项目

要关上 URL,请应用 Launch Services 函数 LSOpenCFURLRefLSOpenFromURLSpec。它们相似于 LSOpenFSRefLSOpenFromRefSpec,然而承受 Core Foundation URL references(CFURLRef)作为参数,而不是 file-system references。当您具备要关上的应用程序或文档的文件系统路径名时,这些性能通常也很有用:您能够应用蕴含门路的 scheme file 结构 URL,而后应用该 URL 代替 file-system references 来关上文件系统门路。LSOpenCFURLRefLSOpenFromURLSpec函数是应用其余 scheme(例如 http,ftp 或 mailto)关上 URL 的惟一办法。

像用于 file-system references 的 LSOpenFSRef 一样,LSOpenCFURLRef以默认形式在其首选应用程序中关上指定的 URL。更通用的函数 LSOpenFromURLSpec 承受 launch specification(相似于 LSOpenFromRefSpec 的 launch specification,但类型为 LSLaunchURLSpec 而不是 LSLaunchFSRefSpec),它更具体地指定了 URL 的打开方式。与 LSOpenFromRefSpec 一样,如果您须要申请除LSOpenCFURLRef 提供的默认行为以外的其余内容,则能够间接本人调用此函数。

LSOpenCFURLRefLSOpenFromURLSpec 都确定要应用哪个应用程序关上指定的 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 函数 LSGetApplicationForItemLSGetApplicationForURLLSCopyApplicationForMIMEType。您能够通过对文档的 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 函数 LSCanRefAcceptItemLSCanURLAcceptURL 提供此信息。您提供对该我的项目和指标应用程序的 file-system references 或 URL references,以及管制该函数行为的某些技术方面的角色掩码和标记位;该函数通过设置一个布尔变量来响应,您能够向该变量提供一个指针,以批示应用程序是否能够承受指定的我的项目。

注册应用程序

通常,无需在 Launch Services 中显式注册应用程序,因为只有 Finder 晓得该应用程序,启动零碎或新用户登录,该操作就会主动为您实现(请参阅上一章“应用程序注册”)。在极少数状况下,您的确须要显式注册应用程序时(例如在自定义安装程序中),则能够应用 Launch Services 函数 LSRegisterFSRefLSRegisterURL,具体取决于应用程序是通过 file-system references 还是 Core Foundation URL reference。无论哪种状况,该应用程序及其文档绑定信息都将复制到 Launch Services 数据库中,从而使该应用程序可用于打开文档和 URL。

获取无关我的项目的信息

您能够应用 Launch Services 函数 LSCopyItemInfoForRefLSCopyItemInfoForURL 来获取无关 file-system 对象(例如应用程序,文档,文件夹或磁盘卷宗)的各种信息。您须要提供 file-system references 或 Core Foundation URL reference(带有 scheme file)来标识感兴趣的我的项目,还要提供一个枚举变量(LSRequestedInfo)指定所需的信息,并在其中指向我的项目信息记录(LSItemInfoRecord)的指针以便接管信息。该记录中的信息能够包含我的项目的文件类型、创建者签名、文件扩展名以及形容我的项目属性的各种标记(请参阅上一章中的“我的项目信息”)。

有两个我的项目信息您可能会感觉有用,别离是它的显示名称(用于在屏幕上向用户显示其名称)和品种字符串(例如,在 Finder 的“显示简介”窗口或“我的项目”的“品种”列中应用)Finder 的列表视图,以表征我的项目的个别性质,例如ApplicationFolderAliasJPEG PictureQuickTime MovieFrameMaker Document。您能够应用 Launch Services 函数 LSCopyDisplayNameForRefLSCopyDisplayNameForURL 取得显示名称,并应用 LSCopyKindStringForRefLSCopyKindStringForURLLSCopyKindStringForTypeInfoLSCopyKindStringForMIMEType 获取类型字符串。

正文完
 0