Запуск вспомогательного приложения Mac OS X (LoginItem) из основного приложения

У меня есть приложение Main.app и приложение Helper.app в папке Main.app/Library/LoginItems. Приложение Main.app может быть запущено пользователем, а затем пользователь может установить Helper.app в качестве элемента входа. (используя SMLoginItemSetEnabled()), это работает отлично. Когда пользователь устанавливает Helper.app в качестве элемента входа, он также запускается.

Однако также должна быть возможность запустить Helper.app, не устанавливая его в качестве элемента входа. Я пытался сделать это с

[[NSWorkspace sharedWorkspace] launchApplication: newPath];

который выдает ошибку lsboxd: Not Allowing Process to Launch..., и с

[NSTask launchedTaskWithLaunchPath:newPath arguments: [NSArray array]];

который выдает ошибку запретить повторную инициализацию песочницы. (предположительно потому, что Helper.app находится внутри Main.app?)

новый путь находится следующим образом:

NSMutableArray *pathComponents = [NSMutableArray arrayWithArray:[[[NSBundle mainBundle] bundlePath] pathComponents]];
[pathComponents addObject:@"Contents"];
[pathComponents addObject:@"Library"];
[pathComponents addObject:@"LoginItems"];
[pathComponents addObject:@"Helper.app"];
[pathComponents addObject:@"Contents"];
[pathComponents addObject:@"MacOS"];
[pathComponents addObject:@"Helper"];
NSString *newPath = [NSString pathWithComponents:pathComponents];

Как я могу это исправить? :)

Спасибо,


person jeppeb    schedule 06.03.2013    source источник
comment
stackoverflow.com/ questions/12971549/ – это может быть проблемой подписи, которая исчезнет, ​​как только приложение появится в магазине приложений.   -  person Petesh    schedule 12.03.2013
comment
Кажется, что 1Password (с процессом 1Password Helper) может это сделать, и они находятся в песочнице. Мне действительно интересно, как они этого добиваются.   -  person Remy Vanherweghem    schedule 22.09.2013
comment
Я также искал это, и я просто попробовал это так, как вы это описали (за исключением того, что я как бы жестко запрограммировал путь, я действительно не понимаю, почему вы делаете это так, как делаете), и это сработало сразу. Я не знаю, что вы делаете неправильно (или я делаю что-то неправильно, что заставляет меня работать).   -  person Sitses    schedule 11.10.2013
comment
взгляните на stackoverflow.com/questions/12594380/   -  person Parag Bafna    schedule 21.10.2013
comment
@RemyVanherweghem, мы используем SMLoginItemSetEnabled в 1Password.   -  person roustem    schedule 08.01.2014


Ответы (1)


Вы также можете использовать NSTask и launchctl. Пример Или вы можете использовать NSTask и скрипт bash. Пример:

#Run Menu
if [ $(ps -u $USERNAME | grep -v grep | grep -m1 '/Library/Menu/Menu.app/Contents/MacOS/Menu' | awk '{print $5}') ]; then 
    echo "Menu already  running";
else 
    echo "Menu not  running"
    if [ $(users $USERNAME ) == $USERNAME ]; then
        echo "User logined"
        echo "running menu for user $USERNAME"
        sudo -u $USERNAME /Library/Menu/Menu.app/Contents/MacOS/Menu&
    else
        echo "User not logined"
    fi
fi
person user1502383    schedule 22.10.2013