我的应用有时会设置为在登录时启动。
如果由于登录而自动启动,我不想显示它的窗口。
该应用有一个状态栏项,将在用户登录时运行,但用户不希望每次登录时都弹出该窗口。
如何在我的应用程序启动期间判断这是一个自动启动,以便窗口可以隐藏?
答案 0 :(得分:3)
当启动进程时,有几个输入:命令行参数和环境变量。我看了一下从Dock中启动Alfred.app并通过登录。参数或环境中没有任何内容可以指示启动的来源。
有几种方法可以在登录时启动应用程序。可以通过用户的“系统偏好设置”中的“登录项”或通过其中一个Library / LaunchAgent中的LaunchAgent实现。从我可以告诉“登录项目”是用户友好的方式添加一些东西在启动时启动(并在将来禁用它),但它看起来相当于从dock或应用程序目录启动它。因此,我们没有足够的信息来通过这种方法确定发射源。
使用launchd,我们可以在用户的〜/ Library / LaunchAgents目录中指定一个XML文件,该目录将使用一组特定的命令行参数启动程序。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<false/>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>info.evanlong.apps.sandbox</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/your/app</string>
<string>--this-started-via-login</string>
</array>
</dict>
</plist>
启动时有许多配置选项,包括为进程设置环境变量的功能。所有这些都可以在launchd.plist手册页上找到。
对于您要解决的问题,我可以看到一些解决方案:
我认为选项2是最好的方法,更符合其他应用程序的工作方式。聪明的是,首次启动应用程序时,您不会显示主窗口。仅在状态栏中显示图标。如果应用程序启动,正在运行的应用程序应该在应用程序委托上获得applicationWillBecomeActive / applicationDidBecomeActive。如果在首次启动后发生这种情况,您将需要显示应用程序窗口。请记住,将在应用程序首次启动时调用将要/确实成为活动回调。因此,您需要使用以下内容检查:
static BOOL IS_FIRST_CALL = YES;
@implementation LWAppDelegate
@synthesize window = _window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
}
- (void)applicationWillBecomeActive:(NSNotification *)notification {
if (IS_FIRST_CALL) {
NSLog(@"first call");
IS_FIRST_CALL = NO;
}
else {
// Display the application window
NSLog(@"subsequent calls");
}
}
@end