问题标签 [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 回答
805 浏览

macos - LSMinimumSystemVersion 的默认值是什么?

macOS 应用程序可以通过在其文件中包含LSMinimumSystemVersion密钥来指定所需的最低操作系统版本。Info.plist如果此密钥不存在,应该会发生什么?

0 投票
0 回答
43 浏览

macos - 如何启动新实例而不是专注于点击应用程序图标

如果单击应用程序的图标,有没有办法让应用程序启动一个新实例而不是关注现有应用程序?LaunchServices 可能有一种方法,它是属性文件 info.plist。

EG 如果您在 Dock 中有 TextEdit,第一次单击它会启动一个新应用程序。但第二次点击关注的是现有的。

只有终端中的直接调用总是启动一个新实例:

0 投票
0 回答
809 浏览

ios - 处理 URL 的 iOS 应用程序未显示在“打开方式...”菜单中(例如在 Safari 中)

当单击 iOS Safari 中的“共享”按钮(从工具栏或长按链接)时,我希望我的应用程序显示为“在...中打开”选项(例如“在新闻中打开"),这样我的应用程序(另一种类型的网络浏览器)就可以打开Safari 共享的任何内容http://或URL。https://

我已经在我的文件中注册了文档类型“URL”(我认为它是正确的类型——如果这个假设是错误的,请纠正我!)我可以从 Apple 的“注册应用程序支持的文件类型”文档info.plist中猜到。 ,他们的技术问答,以及这些相关的 StackOverflow 帖子1 2 3CFBundleDocumentTypes

我还写了这个存根方法AppDelegate.swift(尽管我认为它实际上与让我的应用程序显示为“在...中打开”选项的第一阶段的成功无关):

...但是,我的应用程序仍未显示为“在...中打开”选项。我必须补充一点,应用程序图标与应用程序正确绑定,并且info.plist文件在 Xcode 中打开正常,所以我可以确认它没有损坏。

所以我有三个问题:

  1. 长按链接并点击“共享...”按钮后,Safari 共享的文档类型确实是“URL”吗?

  2. 按下 Safari 工具栏中的图形按钮后,看起来像(混淆地也称为“共享”按钮),Safari 共享的文档类型是否像以前一样,“URL”?

  3. CFBundleDocumentTypes是否为 URL 类型的文档编写了正确的文档?或者如果 Safari 共享其他内容,它是什么(以及我应该如何编写它)?

0 投票
0 回答
273 浏览

macos - OSX LaunchAgent LaunchDaemon 通过 XPC 通信

我正在尝试从 LaunchDaemon 传达我的 xpc 服务。

LaunchDaemon 是命令行可执行文件,LaunchAgent 是 xpc 服务。

从主服务(LaunchDaemon)启动我的连接,如下所示:

Xpc-service 监听如下:

在我的情况下,我收到连接无效错误,我的 xpc 甚至无法启动。

LaunchAgent & LaunchDaemon 加载完美,代码签名也完成。帮我找出可能导致问题的原因?提前致谢。

0 投票
0 回答
99 浏览

objective-c - 封装和生成另一个应用程序并注入参数

我的问题是我有一个孩子.app,我想在注入一些参数后运行它。想要做的是将应用程序作为父应用程序运行(启动它同步并将焦点/激活事件传播到子应用程序)。

我的目标是创建一个启动另一个应用程序的“父应用程序”,例如OtherApp.app. 它应该看起来好像“父应用程序” OtherApp.app(即不在扩展坞中显示为单独的应用程序,但窗口OtherApp.app应该包含在“父应用程序”中)。我想这样做的原因是我可以在OtherApp.app不修改.app自身的情况下传递一些初始化变量。


我采取的方法

  1. 第一种方法是最简单的。只需使用system(@"VAR=VALUE /Applications/OtherApp.app"). 然而,这样做的问题是“父应用程序”将立即退出并OtherApp.app在 Dock 中作为单独的应用程序打开。

  2. 第二种方法:我尝试过使用NSWorkspacewithNSRunningApplication但是它不是同步的,问题是“父应用程序”将再次立即死亡:

    /li>
  3. 第三种方法是使用启动服务。然而,这就是我的问题所在——我找不到任何不推荐使用的 API 可以让我传递环境变量或“启动服务密钥”(例如 LSUIElement),也找不到让我传递环境变量的方法。这也立即退出(我不熟悉 Launch Services 的内部结构,也许有人可以启发我?)

    /li>

可能的解决方案

  1. 创建一个NSApplication与之通信的OtherApp.app“父应用程序”不会立即退出。这里的问题是,现在它们是 Dock 中的两个应用程序,而且保持焦点同步似乎是一项更复杂的任务。
  2. 弄清楚如何将环境变量传递给LS(启动服务)API,并以某种方式控制生成的应用程序的焦点。
  3. 以某种方式访问​​捆绑包并动态加载虽然我通常不能与可执行文件一起使用NSApplicationMain(它会抛出一个错误)。OtherApp.appNSBundle

现在,#2 感觉是最好的选择,尽管我们将不胜感激对替代解决方案的任何帮助。

0 投票
1 回答
65 浏览

macos - macOS `ps` 为某些 XPC 服务提供包标识符而不是路径

Contents/Library/LoginItemsApple 文档中所述,我的 macOS 应用程序可以使用 Apple 的服务管理框架启动一个不露面的帮助应用程序。有趣的是,当我请求 unixps程序给我命令/路径时,对于这个助手进程,它会给出包标识符。例子:

它给了我相同的答案,无论是否-c选择ps.

因为我的应用程序有多种风格和版本,每个版本都包含不同的帮助程序,并且因为用户可能有多个安装,并且由于启动服务有时奇怪的行为,出于自我测试和诊断目的,我想获得路径正在运行的助手的包或可执行文件。

为什么要ps给出捆绑标识符?我怎样才能得到路径?

0 投票
1 回答
234 浏览

macos - 查找启动 OS X 应用程序的文件名

设置文件信息,您可以将应用程序与特定文件类型相关联,以便在单击时启动应用程序。我的问题是应用程序如何发现导致它启动的文件的完整文件名。

0 投票
1 回答
104 浏览

macos - 确定是否允许在 macOS 中启动应用程序

有没有办法以编程方式确定是否允许在 macOS 的安全和隐私设置中启动应用程序?

我正在尝试以静默方式启动从 Cocoa 应用程序中从 Web 下载的 .app,但如果用户不允许来自 Mac App Store 外部的应用程序,我的应用程序将无法启动,并出现一个建议用户更改的对话框他们的设置。我想知道该应用程序是否会成功启动,如果不会,请自行打开安全和隐私设置,以便用户更改它们。

基本上,我正在寻找函数 AppIsAllowedToLaunch:

我尝试了什么:

  • open(2) 总是返回零退出代码,无论应用程序是否成功启动
  • [NSWorkspace.sharedWorkpace launchApplicationAtURL:options:configuration:error]返回 的实例NSRunningApplication。这个对象不仅不允许我检查应用程序是否已成功启动,而且它还要求我尝试启动应用程序以查看发生了什么,而不是事先执行检查,这是我需要的
  • 开源的 open(2) 替代方案大多已过时,并且不反映允许用户阻止非 Mac App Store 应用程序启动的安全和设置更改。不幸的是,原来的 open(2) 不是开源的。
  • spctl -a /path/to/app.app如果根据安全和隐私设置不允许应用程序启动,将正确返回 3。但是,如果应用程序需要 root 权限才能运行(并且我正在启动的应用程序需要),它也会返回 3,所以我不能使用这种方法。

为了检查应用程序是否可以成功启动,必须​​查询一些系统框架(可能是LaunchServicesSecurity)或系统数据库(类似于)。/var/db/SystemPolicyConfiguration/KextPolicy

我的应用程序没有经过沙盒处理,也没有通过 Mac App Store 分发。它以用户权限运行。

0 投票
1 回答
122 浏览

swift - MIME 类型的所有应用程序 URL

此外LSCopyDefaultApplicationURLForURL,还有LSCopyApplicationURLsForURL获取所有应用程序的功能,而不仅仅是默认应用程序。

如果您只想获取 MIME 类型的默认应用程序,可以使用LSCopyDefaultApplicationURLForContentType,但它似乎没有获取所有支持的应用程序的等价物。

如何在磁盘上没有实际文件的情况下获取 MIME 类型的所有受支持应用程序?

0 投票
0 回答
102 浏览

swift - 无法从 Catalina 上的 Today 小部件启动包含应用程序

macOS Catalina 10.15.2

Xcode 11.3 斯威夫特 5

在 Widget 中执行的以下代码在完成时始终返回“false”:

包含小部件扩展的主应用程序位于 Applications 文件夹中,可以通过 Automator 工作流程中的“打开 URL”启动。系统日志中没有错误消息。在小部件模拟器和实时 Today/Notification 应用程序下启动尝试失败。否则,主应用程序和 wiidget 将按预期工作。

这个问题看起来很像这个

任何建议表示赞赏。

我在 Mojave 系统上得到了相同的结果。在进一步搜索中,我发现了这篇2014 年的文章。此代码有效:

Apple 似乎从未在 OSX 中添加代码来支持最新的 Today Widget Extension 文档。