有没有办法告诉Cocoa应用程序是作为日志项启动而不是双击它?
答案 0 :(得分:14)
如果在没有要打开或打印的文档的情况下启动应用程序,它将收到'oapp'
(a.k.a。kAEOpenApplication
)Apple事件。该事件可能具有属性数据(keyAEPropData
)参数。对于普通启动,该参数不存在或为0.对于从登录项启动,它是keyAELaunchedAsLogInItem
。 (当您的应用启动以提供服务时,它是keyAELaunchedAsServiceItem
。)
您可以使用-applicationWill/DidFinishLaunching:
方法中的以下代码进行检查:
NSAppleEventDescriptor* event = [[NSAppleEventManager sharedAppleEventManager] currentAppleEvent];
if ([event eventID] == kAEOpenApplication &&
[[event paramDescriptorForKeyword:keyAEPropData] enumCodeValue] == keyAELaunchedAsLogInItem)
{
// you were launched as a login item
}
斯威夫特3:
let event = NSAppleEventManager.shared().currentAppleEvent
let launchedAsLogInItem =
event?.eventID == kAEOpenApplication &&
event?.paramDescriptor(forKeyword: keyAEPropData)?.enumCodeValue == keyAELaunchedAsLogInItem
答案 1 :(得分:2)
据我所知,没有正确的方法来检查这个,但有一些想法:
最佳解决方案:
创建两个不同的应用程序,例如TheApp和TheAppLauncher 将TheApp添加到应用程序文件夹,将TheAppLaucher添加到启动项目 启动TheAppLauncher时,只需使用特定标志启动TheApp 我希望这很清楚:))
其他'丑'选项:
检查应用程序是否实际列在登录项中:
https://github.com/carpeaqua/Shared-File-List-Example/
让应用程序记录它启动的确切时间 然后将其与用户上次登录时进行比较 finger 命令提供此信息(使用NSTask) 当差异很小时,它作为登录项启动了很好的改变 但是,是的,这并不完全可靠:)
答案 2 :(得分:2)
Chromium项目有some code to do this。按照此处拼写的方法,检查父进程和登录项列表。
答案 3 :(得分:1)
如果作为登录项启动,也许您可以使用选项启动应用程序。例如,当用作启动项时将其称为MyApp.app --startupItem
,并在定期启动时调用它而不使用该选项。
命令行选项可以检查经典的C方式,因为它们作为参数传递给main
函数。
答案 4 :(得分:1)
设置登录项,以便在启动应用程序时(awakeFromNib或init)检查“隐藏”,检查应用程序是否隐藏。
答案 5 :(得分:0)
根据您正在做的事情,NSApplicationLaunchIsDefaultLaunchKey
在这里可能会有用。这是发送给NSNotification
的{{1}}中包含的密钥。来自the documentation:
此键的值是包含布尔值的NSNumber。如果应用程序启动以打开或打印文件,执行服务操作,应用程序已保存将要还原的状态,或者应用程序启动是否在某种其他意义上不是默认启动,则值为NO。否则其值为YES。
除了上述案例外,如果应用程序在登录时自动启动,它也会设置为applicationDidFinishLaunching:
。因此,如果您决定是否显示某些界面元素,例如,这可能足以让您完成所需的信息。
如果您想知道应用是否在选中“隐藏”框的情况下启动,则检查NO
也可能很有用。
编辑:在进一步测试中,我不确定这是否属实。正常打开应用时,[[NSApplication sharedApplication] isHidden]
通常为NSApplicationLaunchIsDefaultLaunchKey
。当它自动启动时,似乎通常是YES
,在我到目前为止所做的测试中。但两者都不是真的,所以看来这个关键字可能没用。