11

我有一个沙盒应用程序,并包含一个显示一些 UI 的助手(作为全屏窗口,但也可以是状态项或类似项)。

这工作......大部分时间。但有时它不会;它只是默默地无法启动助手。

由于助手有 UI,我用SMLoginItemSetEnabled它来加载它,然后NSXPCConnection与它通信。但有时SMLoginItemSetEnabled无法启动它,但仍然返回 YES。

这似乎是由于机器上某处应用程序的旧版本所致;这似乎混淆了登录机制。删除旧应用程序可以修复它,但我不能合理地期望用户这样做(有些人喜欢保留旧版本)。

我可以通过将结果与应用程序包中帮助程序的 URL 进行比较来检测这种情况-[NSWorkspace URLForApplicationWithBundleIdentifier:],但是必须要求用户删除其他应用程序并不是一个非常优雅的解决方案。

有什么方法可以使SMLoginItemSetEnabled始终使用当前应用程序包中的登录项,而不是磁盘上其他地方的随机登录项?

或者在最近的操作系统版本中是否有任何改变以支持更优雅的 UI 助手机制?

我已经在这里和其他地方阅读了关于这个主题的许多其他问题,看起来这种笨重的机制仍然是最好的解决方案,但也许我错过了一些东西。

4

3 回答 3

7

有什么方法可以让 SMLoginItemSetEnabled 始终使用当前应用程序包中的登录项,而不是磁盘上其他地方的随机登录项?

SMLoginItemSetEnabled 中似乎存在错误。当我测试我的应用程序时,可执行文件位于 Xcode 的 DerivedData 文件夹中。

当我构建版本时,我将应用程序及其助手放在 /Applications 文件夹中。但是由于一些明显的原因,启动的助手是 DeriveData 文件夹中的助手。这就是为什么我习惯于在 /Applications 中启动主应用程序之前删除此文件夹中的所有内容。

于 2015-01-18T06:58:55.340 回答
1

突出显示评论中发布的来源/解释:

如果多个应用程序(例如,来自同一家公司的多个应用程序)包含具有相同捆绑标识符的帮助应用程序,则仅启动捆绑版本号最大的一个。任何包含帮助应用程序副本的应用程序都可以启用和禁用它。

https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLoginItems.html#//apple_ref/doc/uid/10000172i-SW5-SW1

因此,此问题的潜在解决方法是增加帮助应用程序的捆绑版本号。具有最大版本号的新版本将成为启动的版本。

于 2018-11-01T22:18:43.947 回答
0

如果您从活动监视器强制退出登录项,它将重新启动并记录一些信息。

检查下面的控制台日志以确定正在启动的新实例的位置:

LSApplicationCheckIn(),正在注册的应用程序是:“/Applications/YourApp.app/Contents/Library/LoginItems/YourLoginItem.app/Contents/MacOS/YourLoginItem”

于 2018-11-01T23:36:34.017 回答