2015-07-16 4 views
0

Я использую фреймворк 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.

ответ

0

Проблемы в том, что у меня было несколько различных копии приложения в моей системе (в частности, один на рабочем столе и в папке приложений). Удаление одного из этих экземпляров приложений разрешило мою проблему.