2014-10-29 5 views
4

У меня есть меню в виде песочницы (без значка док-станции), которое в окне настроек пользователя позволяет пользователю установить флажок, чтобы запуск приложения при входе в систему. Я использовал LSSharedFileList api, но поскольку это больше не разрешено для изолированных приложений, я перешел на использование SMLoginItemSetEnabled. То, что я нашел, заключается в том, что, хотя приложение будет запускаться при входе в систему, как и ожидалось, если я вернусь к настройкам и сниму галочку и заново проверю флажок запуска при регистрации, я получаю второй экземпляр моего приложения для меню.Установить приложение MacOS X menubar для запуска при запуске

Вот мой помощник приложение код (в приложении делегата):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 

    NSString * path = [[[[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] 
            stringByDeletingLastPathComponent] 
              stringByDeletingLastPathComponent] 
                stringByDeletingLastPathComponent]; 


    [[NSWorkspace sharedWorkspace] launchApplication:path]; 
    [NSApp terminate:nil]; 

}

Вот код в моем окне настроек (главное приложение):

- (IBAction)toggleLoginStatus:(NSButton*)sender{ 


    if(!SMLoginItemSetEnabled((__bridge CFStringRef)@"myAppBundleIdentifier", (BOOL)[sender state])){ 
      NSLog(@"Dagnabit!"); 
    } 

}

После запуска второго экземпляра флажок снятия или повторной проверки флажка не запускается экземпляров. Кто-нибудь знает, что происходит? Спасибо

ответ

1

Я нашел ответ. Ни один из уроков, на которые я смотрел, не упоминал об этом, но в документах для SMLoginItemEnabled говорится следующее:

Булево состояние включенного вспомогательного приложения. Это значение равно , действующим только для зарегистрированных пользователей. Если значение true, приложение-помощник будет запущено немедленно (и после последующих логинов) и будет работать. Если false, вспомогательное приложение больше не будет работать .

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

+0

Crap! Кажется, что проблема немного глубже, чем она первоначально появилась. На моем новом MB Pro 15, работающем с Yosemite, снятие/проверка запуска при входе в систему вызывает запуск второго экземпляра, тогда как на моем старшем 2008 MB Pro 15, также работающем с Yosemite, не запускается второй экземпляр. Я добавил код, чтобы проверить, запущено ли приложение. В обоих случаях приложение запускается при входе в систему, но новый показывает это странное поведение. У кого-нибудь есть идеи. – Lazloman

1

Я провел почти два дня, выяснив это. Наконец, идея отказалась от поддержки при входе в систему. Хотя это всего лишь случай «Да» или «нет» на лицевой стороне, разработчик с другой стороны должен потратить огромное количество времени (добавление вспомогательного приложения и выполнение всех этих параметров проекта в обоих приложениях). Процесс в первые дни (перед песочницей) был намного проще, чем сейчас.
Также, когда приложение добавляется в список «запуск при входе», невозможно проверить, потому что приложение не указано в системных настройках -> пользователи -> элементы входа, как это было до песочного бокса.

У меня также возникла странная проблема, когда я добавил вспомогательное приложение к запуску при входе в систему, а затем удалил помощника, но при каждом перезагрузке монитор активности по-прежнему показывает вспомогательное приложение в списке.
Надеюсь, что яблоко добавит что-то вроде LaunchAtLoginController в ближайшее будущее.

+0

Действительно, это сосать. У меня тоже был отличный рабочий код для автоматического запуска. – Lazloman