Обнаружить, что приложение OS X было запущено как элемент входа? - PullRequest
2 голосов
/ 30 декабря 2011

Мое приложение иногда запускается при входе в систему.

Если оно запускается автоматически при входе в систему, я не хочу показывать его окно.

В приложении есть элемент строки состоянияон запускается, когда пользователь входит в систему, но пользователь не хочет, чтобы окно появлялось при каждом входе в систему.

Как я могу сказать при запуске моего приложения, что это был автоматический запуск, так чтоокно можно сделать невидимым?

1 Ответ

3 голосов
/ 31 декабря 2011

Когда процесс запускается, есть пара входных данных: аргументы командной строки и переменные окружения. Я посмотрел на запуск Alfred.app из дока и через логин. В аргументах или окружении не было ничего, что указывало бы на источник запуска.

Существует несколько способов запуска приложения при входе в систему. Либо через «Элементы входа» в Системных настройках пользователя, либо через LaunchAgent в одном из Library / LaunchAgents. Из того, что я могу сказать, «Элементы входа» - это самый удобный способ добавить что-либо для запуска при запуске (и отключить это в будущем), но это выглядит как эквивалент запуска из док-станции или каталога приложения. В результате у нас недостаточно информации, чтобы определить источник запуска этим методом.

Используя launchd , мы можем указать файл XML в каталоге пользователя ~ / Library / LaunchAgents, который запустит программу с определенным набором аргументов командной строки.

<?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. Продолжайте использовать «Предметы входа» с некоторым умом.

Я думаю, что вариант 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...