Когда процесс запускается, есть пара входных данных: аргументы командной строки и переменные окружения. Я посмотрел на запуск 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 .
Для проблемы, которую вы пытаетесь решить, я вижу пару решений:
- launchd (немного больше работы по обслуживанию и поддержке)
- Продолжайте использовать «Предметы входа» с некоторым умом.
Я думаю, что вариант 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