2012-09-26 15 views
9

Chciałbym uruchomić inną własną aplikację przez LSOpenApplication() w Sandbox na komputerze Mac.Jak uruchomić inny proces w piaskownicy na komputerze Mac?

Oczywiście dodałem wiersz do "com.apple.security.temporary-exception.files.absolute-path.read-write" w pliku uprawnień do uruchomienia.

Jednak po uruchomieniu konsola wypowiedziała błąd, który uniemożliwia procesowi xxxx uruchomienie "foo.app", ponieważ nie został on wcześniej uruchomiony przez użytkownika. Jest w stanie uruchomić bez błędów po uruchomieniu procesu ręcznie raz.

Jak uruchomić proces, nawet jeśli nie został wcześniej uruchomiony? Czy to nie jest związek z piaskownicą?

+0

Jeśli podanie nazwy (lub być może identyfikator pakietu) zamiast FSRef jest dopuszczalne, spróbuj tego: http://stackoverflow.com/a/7311283/30461 –

+0

Dzięki. Ale nie może uruchomić żadnego, nawet jeśli zamiast tego jest używana funkcja launchApplication z nazwą aplikacji. Prawdopodobnie aplikacja docelowa może wymagać uruchomienia przez użytkownika co najmniej raz wcześniej, aby uruchomić normalnie w systemie OS X Lion i Mountain Lion. – noridon

Odpowiedz

0

Zastosowanie osascript

osascript -e 'tell application "foo" to open' 
+0

Dzięki Parag. Czy oznacza to użycie osascript zamiast wywoływania funkcji? – noridon

+0

Nie wiem, dlaczego funkcja LSOpenApplication() nie działa w aplikacji Sandbox. ale osascript zadziała. –

14

Istnieje bardzo niewiele warunki, w których będzie można uruchomić inną aplikację i mieć pożądany efekt. com.apple.security.temporary-exception.files.absolute-path.read-write nie zyskuje nic w odniesieniu do LaunchServices, więc możesz usunąć to uprawnienie.

Jako aplikacja piaskownicy jest dość ograniczona pod względem tego, co można faktycznie uruchomić, jest to celowe zachowanie, ponieważ uruchomienie innej aplikacji jest technicznie naruszeniem modelu piaskownicy. sposoby dostępne dla Ciebie są:

  1. obejmują usługi XPC w aplikacji i mieć launchd uruchomić go dla Ciebie
  2. można uruchomić aplikację za pośrednictwem NSTask, co spowoduje ten wniosek, aby odziedziczyć swoją piaskownicę, kiedy rozpoczęła
  3. można uruchomić aplikację po nazwie, ale z tego, co widziałem to zwykle działa tylko wtedy, gdy aplikacja znajduje się w folderze/Applications, tj. - [NSWorkspace launchApplication:]
  4. można uruchomić aplikację, która otacza Twoją aplikację , ale tylko jeśli byłeś SMLoginItemSetEnabled()

Powiedziałbym, że wywołanie osascriptowe działa, ponieważ jego działanie jest mniej więcej takie samo jak - [NSWorkspace launchApplication:]. żadne z wywołań LS, które akceptują identyfikatory pakietów lub ścieżki absolutne/względne, nie zadziała.

+1

Dzięki! Udało się uruchomić z usług XPC! – noridon

+0

, które powinno działać tak długo, jak długo nie zamierzasz przesyłać do MacAppStore i nie są piaskownicą usługi XPC. Jeśli przesyłasz do sklepu z aplikacjami, zmuszą Cię do piaskowania usługi XPC. – rudy

Powiązane problemy