Я использую фреймворк ServiceManagement
, чтобы добавить элемент входа в систему, который запустит приложение-помощник, которое запустит основное приложение, когда пользователь войдет в систему. Методыи disableLoginItem
вызывается, если пользователь выбирает или отменяет «Запуск при входе в систему» с NSButton
выключателя типа:Login Helper App, создающий несколько экземпляров приложения OS X
//Add the Helper app as a login item
- (void)addLoginItem
{
NSLog(@"Enable login item");
if (!SMLoginItemSetEnabled((__bridge CFStringRef)kLoginHelperBundleIdentifier, true)) {
}
}
//Disable the Helper app as a login item
- (void)disableLoginItem
{
NSLog(@"Disable login item");
if (!SMLoginItemSetEnabled((__bridge CFStringRef)kLoginHelperBundleIdentifier, false)) {
}
}
код для хелперов приложение является довольно простой ...
- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
[[NSWorkspace sharedWorkspace] launchApplication: @"My App"];
[[NSApplication sharedApplication] terminate:self];
}
проблема заключается в том что когда М Приложение ain работает, если пользователь повторно выбирает и отклоняет кнопку «Запуск при входе», будет запущен второй экземпляр основного приложения. . Принимая во внимание, что я хочу, чтобы это произошло, что Main App будет запущен только после входа пользователя обратно в
После глядя на SMLoginItem.h
, я увидел, что в документации говорится следующее:
* @param enabled
* The Boolean enabled state of the helper application. This value is effective
* only for the currently logged in user. If true, the helper application will
* be started immediately (and upon subsequent logins) and kept running. If
* false, the helper application will no longer be kept running.
Итак, похоже, что приложение-помощник запускается каждый раз, когда вызывается addLoginItem
. Зная это, я изменил приложение Helper, чтобы проверить, запущено ли мое основное приложение. Если это так, то мы прекратим приложение-помощник. В противном случае мы запустим экземпляр основного приложения, а затем завершим приложение-помощник.
- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
if ([NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.myCompany.MyApp"]){
[[NSApplication sharedApplication] terminate:self];
}
else {
[[NSWorkspace sharedWorkspace] launchApplication: @"My App"];
[[NSApplication sharedApplication] terminate:self];
}
}
Однако, если пользователь выбирает и отменяет «Запуск при входе в систему» кнопку несколько раз, то будет создан второй экземпляр главного приложения. Кто-нибудь знает, как убедиться, что второй экземпляр основного приложения не создан приложением Helper, если пользователь несколько раз переключает «Запуск при входе»?
EDIT Приложение не распространяется через Mac App Store, поэтому у меня нет кода подпись или песочница включена согласно инструкции в this tutorial.