SMLoginItemSetEnabled有时无声地无法启动沙盒化的UI助手。

11

我有一个应用程序,它是被沙盒化的,并且包含了一个帮助程序,该帮助程序呈现一些UI(作为全屏窗口,但也可以是状态栏或类似的东西)。

这个应用程序大部分时间都可以正常工作。 但有时候它不起作用; 它只是默默地无法启动助手程序。

由于助手程序具有UI界面,因此我使用SMLoginItemSetEnabled加载它,然后使用NSXPCConnection与其通信。 但有时候SMLoginItemSetEnabled无法启动它,但仍然返回YES。

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

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

是否有任何方法使SMLoginItemSetEnabled始终使用来自当前应用程序包的登录项,而不是其他地方随机的登录项?

或者最近的操作系统版本是否有任何更优雅的机制支持带有UI的助手程序?

我已经阅读了许多关于此主题的其他问题,以及其他地方的信息,似乎这个不太好的机制仍然是最好的解决方案,但也许我错过了什么。

3个回答

7
有没有办法使 SMLoginItemSetEnabled 始终使用当前应用程序捆绑包中的登录项,而不是磁盘上其他位置的任意一个登录项?
似乎 SMLoginItemSetEnabled 存在一个 bug。当我测试我的应用程序时,可执行文件位于 Xcode 的 DerivedData 文件夹中。
当我构建发布版本时,我将应用程序和其辅助工具放在 /Applications 文件夹中。但出于一些明显的原因,启动的辅助工具是在 DeriveData 文件夹中的辅助工具。这就是为什么我习惯于在启动 /Applications 中的主应用程序之前删除该文件夹中的所有内容。

感谢您的回复,@Lionel_A!这对我非常有帮助。另外一个我发现的事情是,至少有一个教程建议删除MainMenu.xib和ViewController.swift文件。这是一个非常糟糕的想法,因为我的辅助应用程序只是崩溃了。Xcode在编译时没有抱怨缺少xib文件。 - drootang
1
实际上,这个“bug”有点文档化如果多个应用程序(例如,来自同一公司的几个应用程序)包含具有相同捆绑标识符的助手应用程序,则仅启动具有最大捆绑版本号的应用程序。 我想,如果多个应用程序的助手具有相同的捆绑版本号,则启动哪一个将是未定义的。 - Jerry Krinock

1

在评论中发布的源代码/解释需要突出显示:

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

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

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

我认为你应该将两个答案合并。没有理由让它们分开。 - jvarela

0
如果您从活动监视器中强制退出登录项,它将被重新启动并记录一些信息。
请检查下面的控制台日志以确定新实例被启动的位置:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接