问题标签 [launch-services]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
225 浏览

macos - 在基于文档的应用程序的“打开”面板中允许任何类型

我正在编写一个可以打开任何类型的基于文档的 Mac 应用程序。我的应用程序在其 Dock 磁贴上成功接收到任何类型的拖放文件,但是当我从“文件”菜单中选择“打开”时,所有文件都显示为灰色。

是模板自带的标准Open项目;我没有在它后面放任何特别的东西。

这是我的 Info.plist 的相关部分:

我有一个自定义文档控制器;这是它的实现。

除非我将文件放在 Dock 磁贴上,否则不会随时调用这些方法。

0 投票
1 回答
4432 浏览

macos - 当 OS X 应用程序通过注册的 URL 方案启动时,如何访问完整的 URL?

我正在开发一个 Cocoa 应用程序,该应用程序使用带有自定义方案的 URL 启动/激活,该方案在 Info.plist 文件中注册,如下所示:

我的问题是,一旦应用程序启动或激活,我如何知道启动应用程序的 URL 是什么?在 iOS 上,这很容易使用 UIApplicationDelegate 上的 -application:openURL:sourceApplication:annotation: 方法,因为它传递了一个 NSURL 实例。

我希望能够使用诸如myscheme://do/something/awesome 之类的 URL 将数据传递到我的应用程序中

0 投票
0 回答
427 浏览

macos - 如何将Finder中的右键菜单配置为隐藏某些特殊数据类型的文件?

我为我的 OS X(10.7.3) 创建了一项服务。我已经在 info.plist 中配置它,如下所示:

它对于 Finder 中的任何“文件和文件夹”(public.item)都是可见的,但我想让一些具有特殊数据类型的文件(例如 *.txt、*.rar)不可见。

有什么方法可以配置 info.plist 来完成它?

0 投票
1 回答
1067 浏览

objective-c - 从启动服务中删除 URL 方案处理程序

我正在开发一个 Cocoa Mac 应用程序,它可以动态生成并注册自己的 URL 方案。但是,当应用程序注册自己以处理新生成的 URL 方案(例如 myscheme1423://)时,我想阻止应用程序响应任何以前注册的 URL 方案。

LSSetDefaultHandlerForURLScheme()用于注册 URL 方案的目的;同时,应用程序会自动覆盖它的 Info.plist 以包含新方案。您可能知道,该LSSetDefaultHandlerForURLScheme()函数将给定的 bundleID/scheme 添加到 Launch Services 数据库中。但是,我找不到等效的启动服务函数来从数据库中删除相同的 bundleID/scheme 对。

我知道我可以简单地忽略源自 URL 方案的任何外部事件,而不是应用程序主动注册的那个,但我觉得应该有一种简单的方法来完全消除系统对以前的知识方案。如果我的应用程序通过数百次注册新方案的过程,就会出现一个点,即大量无意义的部分在磁盘上占用大量空间(至少对于 Plist 而言)数据(即旧的启动服务条目)。

0 投票
3 回答
3689 浏览

macos - 枚举 OS X 上所有已安装的应用程序

基本问题

我正在寻找一种解决方案来枚举安装在(Mac)OS X 系统上的所有应用程序,即使用LaunchServices注册的所有应用程序包。

无效的简单方法

(请注意:lsregister可以在下面找到/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister)。

目前我正在使用 的输出lsregister -dump | grep -E '^.*[ \\t]*path:[ \\t]+(\/.*)$' | grep -Eo '\/.*',它有一些问题:

  • .app未正确处理带有换行符(\n在 UNIX 上有效)的捆绑包(此问题可以通过编写适当的解析器来解决)
  • lsregister不能正确处理奇怪的文件名(例如包含RTL 标记)。lsregister似乎只是忽略了名称中带有 RTL 标记的文件。如果您愿意,您可以通过运行以下命令创建一个名称中包含 RTL 的文件。

    这样做之后,lsregister -dump | grep ThisIsAWeird不会暴露了。但是,当您右键单击文本文件并转到“打开方式”时,您会发现 LaunchServices 和 Finder 仍然支持该文件。 看到自己

简单地枚举/Applications和其他目录中的所有文件是行不通的,因为 LaunchServices 知道任意文件夹中的应用程序包,我也需要这些应用程序。

我没有上班的其他方法

显然,有一个名为的私有 API 函数_LSFindApplications可以完全满足我的需要,但我无法让它工作,也没有在互联网上找到任何非官方文档。(证明它存在nm /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/LaunchServices | grep __LSFindApplications$:)

更新: system_profiler 方法似乎也不起作用

到目前为止,我虽然system_profiler@Anoop 建议的方法有效,但今天我发现它lsregister仍然可以获取更多二进制文件。在所有机器上都有一些或丢失,一些似乎只有在system_profiler您安装了另一个安装 OS X 的外部卷时才会丢失。这是我的一台机器上system_profiler(但存在于lsregister)输出中缺少的列表:

0 投票
1 回答
368 浏览

macos - 有没有办法区分启动服务在登录时或用户启动的应用程序?

Cocoa 应用程序可以将自己添加到 LSSharedFileList登录项列表中。这将允许在用户登录时启动应用程序。但是,有没有办法判断用户是启动应用程序还是应用程序在登录时自动启动?这很有用,因为在一种情况下,我们可以在另一种情况下显示用户界面,我们可以隐藏 UI 并将应用程序作为菜单栏应用程序在后台运行。

0 投票
2 回答
285 浏览

macos - 使用并存的旧版和现代 Mac 应用程序,无法将捆绑的文档全局关联到现代应用程序(启动服务?)

2013 年 4 月 9 日更新 这是对我之前问题的完全转发。随着我对启动服务、UTI 和贬值的创建者代码了解得更多,我觉得我最好从头开始问这个问题。

问题描述:

我们有一个专为 Legacy Mac 9.xx 设计的应用程序,它仍然在 Snow Leopard(带有 Rosetta)上运行。该应用程序使用捆绑文件我们为 Snow Leopard 及其他应用程序开发了我们的新应用程序。问题是启动服务没有根据我们当前使用的 plist 配置正确关联新应用程序,我需要知道我做错了什么。

如果我右键单击捆绑的文档并选择 GetInfo,我可以将捆绑的文件关联到旧应用程序或新应用程序,它会按我的预期工作。我相信那是因为雪豹仍然使用 Creator Code 技术进行这种关联。如果我告诉文件将自身与旧的旧应用程序关联并按“全部更改”,则启动服务将正确关联该类型的所有文件,并且它将按预期工作。如果我告诉文件将自己关联到新应用程序并选择“全部更改”,应用程序将打开,但文件不会。据我所知,启动服务正在为应用程序分配一个动态 UTI,当单击文件时,操作系统不知道要使用哪个应用程序。

我发现一些帖子似乎暗示苹果可能在新的 UTI 方法中犯了一些设计错误。这里的一篇文章展示了如何将一组字符串文件扩展名添加到新应用 pList 的 ExportedUTI 字典中。这会使应用程序正常运行,但这并不能解决问题;如果我们允许我们的用户为他们的文件命名,我们无法在数组中预测他们的文件扩展名将是什么。我们需要启动服务以严格使用 UTI 代码正确运行,或者如何让 OSType 代码正常工作。

关于尿路感染的帖子

一旦新应用程序决定它无法打开它的相关文件,我必须打开 LanchServices.plist,删除条目并重新启动 lsregister 数据库。然后我可以再次使用新应用程序打开一个文件(通过关联它而不按“全部更改”)。

我将一些图像附加到应用 plists 、捆绑的文档 plist 和 Launch Services 条目:

旧应用程序列表

新应用列表

捆绑文档中的 plist

新应用程序的启动服务条目

非常感谢任何帮助和我们的指导。

麦克风

更新日期:2013 年 4 月 16 日

我提供的关于 UTI 的帖子的链接还包括一个名为 RCDefault 应用程序的开源软件应用程序的链接。此应用程序将根据您选择的 UTI、文件扩展名、OSType 代码和文件类型将您的 APP 与给定文件相关联。奇怪的是,这个应用程序能够根据我们 plist 中提供的 UTI 结构将文件与应用程序相关联。

对于这种特定情况,这是否可能只是雪豹启动服务中的一个错误,而苹果此时选择忽略它(考虑到他们不再支持雪)?

0 投票
0 回答
342 浏览

objective-c - 如果应用程序未运行,则响应 GURL 苹果事件

我有一个应用程序从自定义注册的 URL 协议响应“GURL”(获取 URL)苹果事件。它已正确注册并且在应用程序已经运行时工作正常,但如果应用程序尚未运行,它将仅启动应用程序,但不会像 API 指示的那样响应 url。

我不太确定 Xcode 从外部源启动时如何立即附加到进程,所以我不确定应用程序是否使用指示 url 的参数启动?如果不是,有没有办法确定应用程序在启动时是从 GURL 苹果事件启动的?

我正在通过以下方式初始化处理程序:

0 投票
1 回答
414 浏览

c++ - 检查应用程序是否安装在 MAC OS X 上的替代方法?

我一直在使用启动服务函数 LSFindApplicationForInfo() 来检查是否安装了应用程序。

这工作正常,除非用户将应用程序发送到垃圾箱。此方法仍然在垃圾箱中找到它,但无法调用它。

是否有另一种方法来检查应用程序是否安装在 /Applications 中?或者我可以指定在调用 LSFindApplicationForInfo() 时我只想在 /Applications 下查看吗?

0 投票
1 回答
312 浏览

ios - Mac OS 框架头文件 MachineExceptions.h 错误:声明未声明任何内容

背景

我正在尝试使用LSGetApplicationForURLAPI 并在这里找到了一个非常有用的示例 -如何在 mac os x 上获取默认邮件客户端版本?

但是,当我尝试编译代码时,出现此错误:

/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Headers/MachineExceptions.h:53:错误:声明未声明任何内容

当我在第 53 行附近打开 MachineExceptions 时,我看到了unsignedwide一些MacTypes.h. 我发现这是碳核心框架的一部分。

对于初学者,我只在我的代码中包含顶级标题(实际上,使用上面示例中的确切示例代码)。所以,我不包括/接触MachineException.h或任何其他头文件。虽然,显然似乎存在一些最终导致此错误的依赖项。

我尝试/研究过的一些事情:

  1. 我发现 Carbon Core 在 10.8(我正在使用的版本)中已被弃用 - https://developer.apple.com/library/mac/#releasenotes/General/CarbonCoreDeprecations/ 结果,MacTypes.h在 Carbon Core框架相当贫乏,有条件地包含MacTypes.h在 /usr/include/
  2. 根据上面“已弃用”页面上的信息,我已尝试编辑MacTypes.h(在 Carbon Core 框架中)和 MachineExceptions.h 以包含 /usr/include 中的 MacTypes。
  3. 切换了包含头文件的顺序(在我研究这个时为其他人工作)。
  4. 我在我的 makefile 中包含了 CoreFoundation 和 ApplicationServices 框架(使用“-framework”选项)

非常感谢有关此问题的任何反馈,因为我花了很多时间试图解决这个问题。如果这里有什么是基本的/基本的,我提前道歉。我对 Mac OS 编程非常陌生,并试图了解框架是如何连接的,以及如何使用它们。

谢谢!