2012-07-02 10 views
19

Ich möchte, dass meine App automatisch gestartet wird, wenn der Benutzer die Option auswählt. Die Methoden, die ich verwendet habe, sind in Sandbox-Apps nicht mehr erlaubt.So fügen Sie den Anmeldeelementen eine Sandbox-App hinzu

Ich weiß, ich muss einen Helfer erstellen, um das zu erreichen? Gibt es ein einfaches Tutorial mit Beispielcode, um das zu aktivieren?

fand ich dieses Tutorial, aber es für mich nicht funktioniert: http://www.delitestudio.com/2011/10/25/start-dockless-apps-at-login-with-app-sandbox-enabled/

Es ist ein ziemlich Standard, was zu tun, ich verstehe nicht, warum gibt kein Beispielprojekt ist.

UPDATE:

ich ein Beispielprojekt hochgeladen: http://ge.tt/6DntY4K/v/0?c

+0

Verwenden Sie Apple-Ereignisse? –

+0

Eigentlich tue ich das, aber warum ist es wichtig? – Tibidabo

+0

Können Sie weitere Informationen dazu bereitstellen, was mit dem Lernprogramm nicht funktioniert hat? Wurden beispielsweise Sandbox-Beschränkungen noch erzwungen oder waren andere Fehlermeldungen vorhanden? –

Antwort

17

Sie sollten erfolgreich mit diesem (Disclaimer: meine) tutorial, Beispielprojekt enthalten.

Update: Ich habe jetzt das Beispielprojekt, das Sie hochgeladen haben, getestet: Es funktioniert ganz gut mit mir, ohne irgendwelche Änderungen, und startet bei der Anmeldung erfolgreich. Der einzige Trick besteht darin, dass die AutoStart.app-Datei im Ordner/Applications oder ~/Applications abgelegt werden muss, damit sie bei der Anmeldung erfolgreich gestartet werden kann. Dies ist unabhängig davon erforderlich, ob die App Sandboxed ist oder nicht. Allerdings gibt es dafür keine offizielle Dokumentation, fürchte ich.

+0

Ihre Lösung funktioniert, meine aus irgendeinem Grund nicht auf meiner Maschine. Tolles Tutorial, Danke! – Tibidabo

+0

Dieses Tutorial ist großartig. Gibt es jedoch eine Möglichkeit, das Element auch den Login-Elementen für den Benutzer in den Systemeinstellungen hinzuzufügen? Von jetzt an ist es nicht da. Ich weiß, dass das möglich ist, weil ich ein paar andere Apps von MAS habe, die das können. –

+0

Sie können dies tun, indem Sie die (schlecht dokumentierten) Methoden in der LSSharedFileList-API verwenden, die Teil der Launch Services ist. Die API funktioniert jedoch nicht, wenn die app, die sie aufruft, sandboxed ist: [Mit App Sandbox können Sie kein Login-Element mithilfe von Funktionen in der Headerdatei LSSharedFileList.h erstellen.] (Http://developer.apple.com/library /mac/#documentation/Security/Conceptual/AppSandboxDesignGuide/DesigningYourSandbox/DesigningYourSandbox.html#//apple_ref/doc/uid/TP40011183-CH4-SW1) MAS-Anwendungen, die dies tun, werden wahrscheinlich nicht sandboxed. – Tim

1

Sie könnten versuchen, die Service Management Framework

http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLoginItems.html#//apple_ref/doc/uid/10000172i-SW5-SW1

Wie aus http://developer.apple.com/library/mac/#documentation/Security/Conceptual/AppSandboxDesignGuide/DesigningYourSandbox/DesigningYourSandbox.html verwiesen mit ...

To Erstellen Sie ein Login-Element für Ihre Sandbox-App, verwenden Sie die -Funktion (in ServiceManagement/SMLoginItem.h deklariert) wie in Adding Login Items Using the Service Management Framework in Daemons und Services Programming Guide beschrieben.

(Mit App Sandbox können Sie keine Login Element mit Funktionen in der LSSharedFileList.h Header-Datei. Zum Beispiel erstellen Sie nicht die Funktion LSSharedFileListInsertItemURL verwenden können. Ebenso wenig können Sie den Zustand der Startdienste, wie zum Beispiel mit der Funktion manipulieren LSRegisterURL).

9

Ich habe gerade über 100 Versuche auf Tim's tutorial wieder gemacht. Endlich habe ich es zum Laufen gebracht. Obwohl ich schwöre, es hat funktioniert, als ich es das erste Mal versucht habe. In meiner Situation ist, wenn ich "Start bei der Anmeldung" auf "Ein", ich kann nur sehen, die Helfer-App für nur eine Sekunde nach dem Login gestartet. Dann war es weg. Manuell die App starten, sah ich den Schalter ausgeschaltet war.

war hier, was ich gefunden:

  1. mein Bündel Kennung bereits in der Liste der NSArray *running = [[NSWorkspace sharedWorkspace] runningApplications]
  2. der Status des NSRunningApplication *app (bundle name equal to my app) ist war: [app isActive] == NO, [app isHidden] == NO, [app isTerminated] = NO

So Ich habe einige Änderungen am Code vorgenommen:

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 
    .... 
+0

Mein System info: Mac OS X 10.8.2, XCODE 4.6 –

+1

Sie möchten vielleicht ein hinzufügen 'break;' kurz nach 'isActive = [app ...'. –