2013-03-06 12 views
5

Ho un'applicazione Main.app e un'applicazione Helper.app all'interno della cartella Main.app/Library/LoginItems. L'app Main.app può essere avviata dall'utente e l'utente può quindi impostare Helper.app come elemento di accesso. (usando SMLoginItemSetEnabled()), funziona perfettamente. Quando l'utente imposta Helper.app come elemento di accesso, viene avviato anche.Il lancio di un app aiuto di Mac OS X (LoginItem) dall'applicazione principale

Tuttavia, dovrebbe essere anche possibile avviare Helper.app senza impostarlo come elemento di accesso. Ho provato a fare questo con

[[NSWorkspace sharedWorkspace] launchApplication: newPath]; 

che dà una lsboxd: Non permettere processo di lanciare ... errore, e con

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

Wich dà un negare forbidden-Sandbox reinizializza l'errore. (? Presumibilmente perché il Helper.app è all'interno Main.app)

Newpath si trova come segue:

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]; 

Come posso risolvere questo problema? :)

Grazie,

+0

http://stackoverflow.com/questions/12971549/mac-os-sandbox-launching-main-application-from-helper - è * potrebbe * essere un problema di firma che va via una volta che il app è nell'app store – Petesh

+0

1Password (con il processo 1Password Helper) sembra essere in grado di farlo e sono in modalità sandbox. Mi chiedo davvero come lo realizzano. –

+0

Anche io stavo cercando questo e l'ho appena provato nel modo in cui lo hai descritto (eccetto che ho un po 'di hardcoded nel percorso, non riesco davvero a capire perché lo fai nel modo in cui lo fai) e ha funzionato subito. Non so cosa tu stia sbagliando (o se sto facendo qualcosa di sbagliato, che lo fa funzionare per me). – Sitses

risposta

0

È inoltre possibile utilizzare NSTask e launchctl. Esempio Oppure è possibile utilizzare NSTask e lo script di bash. Esempio:

#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