检测OS X应用程序是否作为登录项启动?

时间:2011-12-30 05:46:56

标签: objective-c macos login

我的应用有时会设置为在登录时启动。

如果由于登录而自动启动,我不想显示它的窗口。

该应用有一个状态栏项,将在用户登录时运行,但用户不希望每次登录时都弹出该窗口。

如何在我的应用程序启动期间判断这是一个自动启动,以便窗口可以隐藏?

1 个答案:

答案 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手册页上找到。

对于您要解决的问题,我可以看到一些解决方案:

  1. launchd(维护和支持的更多工作)
  2. 继续使用“登录项目”,有些聪明。
  3. 我认为选项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