2014-04-29 4 views
6

Ich möchte, dass meine Anwendung vor dem Beenden eine Bestätigung verlangt, außer, wenn es vom System während des Herunterfahrens oder Neustarts beendet wird (weil OS X versucht, Sicherheitsupdates um Mitternacht anzuwenden, bleibt es auf der "Sind Sie sicher? " Nachrichtenbox).Wie unterscheidet man verschiedene Ursachen für die Beendigung von Apps in Cocoa?

Wie kann ich herausfinden, was die Beendigung initiiert hat? In [NSApp terminate:sender] ist der Absender immer nil.

Mein erster Gedanke war, nur zu fragen, wenn der Hauptmenüpunkt "Quit" aktiviert ist, aber der Benutzer kann die Anwendung auch über das Dock-Menü beenden oder Cmd + Q drücken, während Cmd + Tab gedrückt wird auch in diesen Fällen um Bestätigung bitten.

Antwort

2

Sie können eine Benachrichtigung erhalten, wenn das System gerade ausgeschaltet wird, neu gestartet wird oder sich der Benutzer gerade abmeldet. Dies ist keine gewöhnliche Benachrichtigung, sondern eine Arbeitsbereichsbenachrichtigung.

Sie können für die Meldung wie folgt registrieren:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    //...more code... 

    self.powerOffRequestDate = [NSDate distantPast]; 
    NSNotificationCenter *wsnCenter = [[NSWorkspace sharedWorkspace] notificationCenter]; 
    [wsnCenter addObserver:self 
        selector:@selector(workspaceWillPowerOff:) 
         name:NSWorkspaceWillPowerOffNotification 
        object:nil]; 
} 

in der Benachrichtigungs-Handler, sollten Sie nur das Datum sparen weg:

- (void)workspaceWillPowerOff:(NSNotification *)notification 
{ 
    self.powerOffRequestDate = [NSDate new]; 
} 

hinzufügen

@property (atomic,strong,readwrite) NSDate *powerOffRequestDate; 

auf die geeigneter Ort.

Wenn Ihre App zum Beenden aufgefordert wird, sollten Sie dieses Datum abrufen und überprüfen, ob der Computer gerade ausgeschaltet wird.

if([self.powerOffRequestDate timeIntervalSinceNow] > -60*5) { 
    // shutdown immediately 
} else { 
    // ask user 
} 

wählte ich ein intervall von 5 Minuten für den folgenden Rand Fall: der Computer ausgeschaltet ist, aber ein andere app bricht das. Ihre App wird noch ausgeführt. 10 Minuten später schließt der Nutzer Ihre App. In diesem Fall sollte die App den Benutzer fragen. Das ist ein bisschen wie ein Hack, aber es ist kein "verrückter Hack", denke ich ...

Hoffe, das hilft.

Verwandte Themen