使用帮助程序启用mac os app的自动登录时出错

时间:2015-01-10 12:07:43

标签: objective-c macos

我正在尝试按照Tim的教程在登录后自动启动我的应用:http://blog.timschroeder.net/2012/07/03/the-launch-at-login-sandbox-project/

我按照说明写了这封信,但是当我重新登录计算机时出现错误,如下所示:

Jan 10 12:55:01 pc61 com.apple.xpc.launchd[1] (com.myApp.macgap.helper[25725]): Could not resolve CFBundleIdentifier specified by service: -10814: com.myApp.macgap.helper
Jan 10 12:55:01 pc61 com.apple.xpc.launchd[1] (com.myApp.macgap.helper): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.

概述:

  • 我的主应用名为“myApp”(ID:com.myApp.macgap)
  • 在那个应用程序中,我有一个ID为的帮助应用程序:com.myApp.macgap.helper
  • 当您启动主应用程序并转到首选项时,您可以选择启用自动登录(以符合Apple合规性规则)
  • 我退出计算机,重新登录并查看控制台,看看发生了什么(这就是我上面的代码)

值得一提的另一点是,当我在应用程序上显示“显示包内容”并双击帮助应用程序时,它会启动主应用程序......

7 个答案:

答案 0 :(得分:10)

这一切都归结为launchd和launchctl的工作原理,正如已经回答的那样,常规用例通常可以通过重新安装应用程序并确保应用程序位于应用程序文件夹中来解决。但是@byb正在讨论的另一种情况是,当你的开发机器上发生这种情况时 - 这可能是由无效的启动配置引起的。

当您运行SMLoginItemSetEnabled时,它会在launchd服务中注册您的包标识符以及其他信息。稍后,当您的应用更改,清理或发生其他事情(由launchd接收)时,launchd可能会禁用该特定登录项。显然,有时这并不顺利,SMLoginItemSetEnabled的连续呼叫将无法按预期工作,或者代理/帮助应用程序根本无法启动。

首先要尝试的是更改启动器的包标识符。如果这样可以解决问题,请尝试弄清楚原件有什么问题。运行launchctl print-disabled "user/$(id -u)"以显示已禁用的服务和登录项关联。如果输出包含令人不安的捆绑标识符 - 您很幸运。

我没有找到使用launchctl按名称删除已禁用服务的方法,必须通过手动编辑配置文件来实现。因为它们是系统所有的,所以您无法单击并编辑,而是以root身份启动Xcode并删除必要的引用。

sudo /Applications/Xcode.app/Contents/MacOS/Xcode "/private/var/db/com.apple.xpc.launchd/loginitems.$(id -u).plist"
sudo /Applications/Xcode.app/Contents/MacOS/Xcode "/private/var/db/com.apple.xpc.launchd/disabled.$(id -u).plist"

重新启动,运行launchctl print-disabled "user/$(id -u)"以确认已删除的项目不再在列表中。再次尝试SMLoginItemSetEnabled,希望现在可以按预期工作。

答案 1 :(得分:9)

我刚才遇到完全相同的问题,在寻找解决方案时发现了这个(未答复的)问题。

至少在我的情况下,当我将应用程序(从Xcode作为dev-id签名.app)导出到一个新的OS X安装/帐户而没有我的所有开发内容时,这个所需的功能正常工作。当然,它也必须在/ Applications中,如问题中提到的教程中所述。

我不确定为什么这个应用程序的功能在我的开发机器上不起作用。也许问题可能是由于某种形式的冲突与我在磁盘上的应用程序的所有其他几乎完全相同的副本(我有一个不同版本的应用程序的存档,加上Xcode存储本身的副本),都有相同的捆绑当然。

希望这有助于这种或那种方式!

答案 2 :(得分:5)

我遇到了同样的问题,删除了应用程序的其他副本,除了/ Applications中的一个为我解决了问题。要删除Xcode生成的.app文件,您可以运行Product-> Clean。

答案 3 :(得分:1)

我几个小时都在苦苦挣扎。我有许多自动登录的应用程序,但新的只是不想工作。 奇怪的是,这是在开发机器上工作的:

1: Build App as normal
2: Move it to Application directory
3. Clean Xcode (CMD+k)!!
4. Enable auto login in the app.
5. Logout Login

当我清理Xcode时,我意外地注意到系统启动了应用程序(它每10秒尝试一次):)

答案 4 :(得分:0)

我无法找到副本,但确实发现您可以删除该服务:

在终端窗口中:

launchctl remove com.annoying.service

答案 5 :(得分:0)

如前所述,如果启动的机器上有多个服务包副本,则无法解析哪个必须由包标识符启动。

我建议您查找服务的所有副本,然后删除不需要的服务。

为此你需要运行以下Swift代码(它甚至可以在Swift Playground中运行):

import Cocoa

let bundleId = "com.your.bundleId"
let paths = LSCopyApplicationURLsForBundleIdentifier(bundleId as CFString, nil)
print("Available service instances by bundle id: \(paths)")

在我的情况下,它产生:

Available service instances by bundle id:
Optional(Swift.Unmanaged<__ObjC.CFArray>(_value: <__NSArrayI 0x6000002234a0>(
file:///Applications/MyApp.app/Contents/Library/LoginItems/MyService.app/,
file:///Users/igor/Library/Developer/Xcode/Archives/2017-12-27/MyApp%2027-12-2017,%2016.06.xcarchive/Products/Applications/MyService.app/
)
))

所以我轻松地确定要删除的副本:

file:///Users/igor/Library/Developer/Xcode/Archives/2017-12-27/MyApp%2027-12-2017,%2016.06.xcarchive/Products/Applications/MyService.app/

希望有所帮助。

答案 6 :(得分:0)

假设你跟随Tim Schroeder的食谱:http://blog.timschroeder.net/2012/07/03/the-launch-at-login-sandbox-project/

实际上最终为我工作的是,在Xcode中,将我的主项目的内部版本号从1更改为2.我还尝试了1000的内部版本,并且工作正常。

在Xcode中,选择您的主项目目标。然后,选择&#39; General&#39;标签。如果您看到Build设置为1,请将其更改为2,然后重新构建,重新部署并查看是否能解决问题。

这可能是我遇到的最棘手的错误之一。