Как добавить изолированное приложение к элементам входа в систему
Я хочу, чтобы мое приложение автоматически запускалось, если пользователь выбирает эту опцию. Методы, которые я использовал, больше не разрешены в изолированных приложениях.
Я знаю, что мне нужно создать помощника для достижения этого? Есть ли простой учебник с примером кода для этого?
Я нашел этот учебник, но он не работает для меня: http://www.delitestudio.com/2011/10/25/start-dockless-apps-at-login-with-app-sandbox-enabled/
Это довольно стандартная вещь, я не понимаю, почему нет доступного проекта.
UPDATE:
Я загрузил образец проекта: http://ge.tt/6DntY4K/v/0?c
Ответы
Ответ 1
Вам следует воспользоваться этим (отказ от ответственности: my) учебник, включая образец проекта.
Обновление:. Я протестировал тестовый проект, который вы загрузили: он отлично работает со мной, без каких-либо изменений, и запуск при успешном входе в систему. Единственный трюк заключается в том, что файл AutoStart.app должен быть помещен в папку /Applications или ~/Applications, которая будет успешно запущена при входе в систему. Это необходимо независимо от того, изолировано ли приложение или нет. Однако, боюсь, официальной документации на это нет.
Ответ 2
Я только что переделал около 100 проб на Тим учебник. Наконец, я сделал это. Хотя я клянусь, что это сработало, когда я впервые попробовал это.
В моей ситуации, когда я переключаю "Запуск при входе" в "Вкл.", Я вижу только приложение-помощник, запущенное всего на одну секунду сразу после входа в систему. Потом он исчез.
Вручную запустив приложение, я увидел, что переключатель выключен.
Вот что я нашел:
- идентификатор моего пакета уже был в списке
NSArray *running = [[NSWorkspace sharedWorkspace] runningApplications]
- статус
NSRunningApplication *app (bundle name equal to my app)
:
[app isActive] == NO
, [app isHidden] == NO
, [app isTerminated] = NO
Итак, я внесла некоторые изменения в код, например:
BOOL alreadyRunning = NO;
BOOL isActive = NO; // my modification
NSArray *running = [[NSWorkspace sharedWorkspace] runningApplications];
for (NSRunningApplication *app in running) {
if ([[app bundleIdentifier] isEqualToString:@"com.mybundleidentifier"]) {
alreadyRunning = YES;
isActive = [app isActive]; // my modification
}
}
if (!alreadyRunning || !isActive) { // my modification
....
Ответ 3
Вы можете попробовать использовать Service Management Framework
http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLoginItems.html#//apple_ref/doc/uid/10000172i-SW5-SW1
Как указано из http://developer.apple.com/library/mac/#documentation/Security/Conceptual/AppSandboxDesignGuide/DesigningYourSandbox/DesigningYourSandbox.html...
Чтобы создать элемент входа для вашего изолированного приложения, используйте функцию SMLoginItemSetEnabled
(объявленную в ServiceManagement/SMLoginItem.h
), как описано в Adding Login Items Using the Service Management Framework
в "Демоны" и Services Programming Guide
.
(С помощью приложения Sandbox вы не можете создать элемент входа, используя функции в заголовочном файле LSSharedFileList.h
. Например, вы не можете использовать функцию LSSharedFileListInsertItemURL
. Вы также не можете манипулировать состоянием служб запуска, например, используя функция LSRegisterURL
).