Richtige Möglichkeit, die iPhone-Anwendung zu beenden?

277

Ich programmiere eine iPhone-App und muss sie aufgrund bestimmter Benutzeraktionen zum Beenden zwingen. Welche Methode kann nach dem Bereinigen des von der App zugewiesenen Speichers aufgerufen werden, um die Anwendung zu beenden?

user21293
quelle
34
Es gibt nur einen richtigen Weg - Home-Taste ..
Beryllium
5
Die einzige Situation, die ich mir vorstellen kann, wenn jemand erwägt, programmgesteuert zu beenden, ist das folgende Szenario: App startet, zeigt Nutzungsbedingungen an, verweigert die Annahme und beendet die App. Dies ist etwas, wozu Marken den Entwickler manchmal unter Druck setzen. Aber es ist falsch.
Daniel
6
@Daniel Normalerweise setzen Sie Ihren Haftungsausschluss / Ihre Nutzungsbedingungen (EULA) auf iTunes Connect, wenn Sie die App hochladen. Wenn der Benutzer Ihre App herunterlädt, bedeutet dies, dass er Ihre EULA akzeptiert hat
Paul de Lange
8
Es gibt völlig gültige Gründe dafür, dass das Beenden einer iOS-App erzwungen werden muss. Mein Fall ist, dass ich Beta-Versionen meiner App vor dem Start verteile. Die Beta-Versionen öffnen alle IAPs kostenlos. Diese sind zeitlich begrenzt und müssen nach einigen Wochen ablaufen. Ich benutze die Antwort unten, um die App nach Ablauf der Beta-Phase zu beenden. Ich werde dies in der LIVE-Version entfernen. Trotzdem hat mir die Antwort geholfen und ist richtig!
Badweasel
5
Ein triftiger Grund zum Beenden einer App ist, wenn es sich um eine langlebige App handelt, die im Hintergrund ausgeführt wird, und die App in einen Zustand wechselt, in dem sie nicht mehr im Hintergrund ausgeführt werden muss. Beispielsweise meldet sich der Benutzer ab. In diesem Fall ist es sinnvoll, das Programm zu beenden, damit die App beim nächsten Start sauber gestartet wird. Dies würde unter anderem als Sicherheitsnetz gegen Speicherlecks dienen. Beachten Sie, dass in diesem Fall die App außerhalb des Hintergrunds beendet wird , sodass der Benutzer nichts Falsches bemerkt.
Frankodwyer

Antworten:

217

Hast du es versucht exit(0)?

Alternativ, [[NSThread mainThread] exit]obwohl ich nicht versucht habe, dass es die geeignetere Lösung zu sein scheint.

Brett
quelle
85
Da dies ein Apple-Nein-Nein ist (kann dazu führen, dass Ihre App im App-Store für nicht standardmäßige Benutzeroberflächen abgelehnt wird), betrachten Sie die Antwort von August als "die richtige". Zu Ihrer Information, diese Antwort (Bretts) ist für ALLE C-Programme korrekt und NSThread für alle Cocoa-Programme.
Olie
21
In den technischen Fragen und Antworten QA1561 rät Apple dringend von der Verwendung von exit ab, da die App anscheinend abgestürzt ist. developer.apple.com/iphone/library/qa/qa2008/qa1561.html
Progrmr
8
[[NSThread mainThread] exit] führt zum Absturz Ihrer Anwendung, da exit keine Instanzmethode ist. exit (0) sendet die App in iOS 4 in den Hintergrund. Wenn Sie exit (0) erneut aufrufen, stürzt sie ab. Zumindest im Simulator.
user123444555621
10
Ich verstehe, warum so viele Leute davon abraten, aber wie wäre es, wenn wir Entwicklern etwas Anerkennung zollen? Wir sind alle Erwachsene hier und möchten etwas über diese Funktion wissen. Ich finde es sehr nützlich für interne QS-Builds und war froh, als ich das erste Mal danach suchte, diese "falsche" Antwort zu sehen.
Evansflash
7
@ Kevin "Tu das nicht" ist nie die richtige Antwort. Geben Sie Warnungen und Haftungsausschlüsse, wenn Sie möchten, aber die einzig richtige Antwort auf "Wie mache ich das?" Ist "Hier ist, wie es geht". Wenn ich nach einer Möglichkeit suche, etwas zu tun (vielleicht möchte ich es beim Debuggen zum Beenden zwingen), erklären die Leute zu Recht "Sie tun es nicht!" und zu versuchen, die Antwort zu begraben, die ich brauche, ist Zeitverschwendung. Auch wenn viele Menschen schlechte Gründe haben, etwas zu tun, ist die richtige StackOverflow-Antwort diejenige, die die Frage beantwortet, da auch Menschen mit guten Gründen ihren Weg dorthin suchen.
Glenn Maynard
274

Auf dem iPhone gibt es kein Konzept zum Beenden einer App. Die einzige Aktion, die dazu führen sollte, dass eine App beendet wird, ist das Berühren der Home-Taste auf dem Telefon. Darauf haben Entwickler keinen Zugriff.

Laut Apple sollte Ihre App nicht von alleine beendet werden. Da der Benutzer die Home-Taste nicht gedrückt hat, vermittelt jede Rückkehr zum Startbildschirm den Eindruck, dass Ihre App abgestürzt ist. Dies ist verwirrendes, nicht standardmäßiges Verhalten und sollte vermieden werden.

August
quelle
13
Wie gesagt, es ist nicht standardmäßiges Verhalten und sollte vermieden werden. iPhone Apps sind keine Desktop Apps. Behandle sie nicht als solche.
10.
8
Ich kann Apples Meinung verstehen, aber ich habe eine ähnliche Situation. Meine Anwendung erfordert einen Internetzugang. Wenn sie nicht verfügbar ist, sollten sie die App verlassen können, anstatt nur eine Fehlermeldung zu erhalten
Anthony Main
22
Wir haben Apps, die Menschen beim Schlafen helfen. Sie möchten, dass die App nach einer festgelegten Zeit beendet wird, um den Batterieverbrauch zu verringern. Ich denke, dieser Fall ist akzeptabel - da der Benutzer hoffentlich schläft und die App nicht manuell beenden kann.
JamesSugrue
36
Ich würde immer noch nicht zustimmen. Wenn sie aufwachen, ist die App "weg" und der Benutzer kann sich fragen, was passiert ist. Stellen Sie stattdessen einen Timer in Ihrer App ein. Wenn die Zeit abgelaufen ist, lassen Sie die App inaktiv - keine Aktivität. Eine App, die absolut nichts tut, wird den Akku nicht entladen. Das Springboard ist auch eine App - es wird nicht heruntergefahren, nur um Energie zu sparen. Stattdessen wartet es einfach auf Benutzereingaben.
10.
8
Dies beantwortet die Frage nicht wirklich. Es ist 100% genau, aber ich denke, im Idealfall wäre es ein Kommentar entweder zur Frage des OP oder zur akzeptierten Antwort gewesen.
Ben Zotto
49

exit (0) wird einem Benutzer als Absturz angezeigt. Zeigen Sie dem Benutzer daher eine Bestätigungsmeldung an. Nach der Bestätigung aussetzen (Home-Taste programmgesteuert drücken) und 2 Sekunden warten, während die App mit Animation im Hintergrund angezeigt wird, dann hinter der Ansicht des Benutzers beenden

-(IBAction)doExit
{
    //show confirmation message to user
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Confirmation"
                                                 message:@"Do you want to exit?"
                                                delegate:self
                                       cancelButtonTitle:@"Cancel"
                                       otherButtonTitles:@"OK", nil];
    [alert show];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex != 0)  // 0 == the cancel button
    {
        //home button press programmatically
        UIApplication *app = [UIApplication sharedApplication];
        [app performSelector:@selector(suspend)];

        //wait 2 seconds while app is going background
        [NSThread sleepForTimeInterval:2.0];

        //exit app when app is in background
        exit(0);
    }
}
MaxEcho
quelle
1
Wird Apple diesen "Exit (0)" genehmigen? Weil einige Leute sagen, dass Apple Ihre App ablehnt, wenn Sie Exit 0 verwenden.
Gajendra K Chauhan
2
@ GajendraKChauhan exit(0)spielt keine Rolle. Punkt ist, dass Ihre App "Beendigungsverhalten" hat. Das Beenden des Verhaltens selbst ist im AppStore verboten, mit Ausnahme einiger Apps, die von sehr wichtigen Drittanbietern erstellt wurden. Die Nachahmung des Verhaltens der Home-Taste kann ebenfalls abgelehnt werden.
Eonil
41

Überprüfen Sie die Fragen und Antworten hier: https://developer.apple.com/library/content/qa/qa1561/_index.html

F: Wie beende ich meine iOS-Anwendung programmgesteuert?

Es ist keine API zum ordnungsgemäßen Beenden einer iOS-Anwendung verfügbar.

Unter iOS drückt der Benutzer die Home-Taste, um Anwendungen zu schließen. Sollte Ihre Anwendung Bedingungen haben, unter denen sie ihre beabsichtigte Funktion nicht bereitstellen kann, wird empfohlen, dem Benutzer eine Warnung anzuzeigen, die die Art des Problems und mögliche Maßnahmen angibt, die der Benutzer ergreifen könnte - Einschalten von WLAN, Aktivieren von Ortungsdiensten usw. Ermöglichen Sie dem Benutzer, die Anwendung nach eigenem Ermessen zu beenden.

WARNUNG: Rufen Sie die exitFunktion nicht auf. Anwendungen, die aufrufen exit, scheinen dem Benutzer abgestürzt zu sein, anstatt eine ordnungsgemäße Beendigung durchzuführen und zum Startbildschirm zurückzukehren.

Darüber hinaus werden Daten möglicherweise nicht gespeichert, da -applicationWillTerminate:ähnliche UIApplicationDelegateMethoden nicht aufgerufen werden, wenn Sie exit aufrufen.

Wenn es während der Entwicklung oder des Testens erforderlich ist, Ihre Anwendung zu beenden, wird die abortFunktion oder das assertMakro empfohlen

Wagh
quelle
2
Fügte gerade eine AlertView ohne Schaltflächen hinzu, um dies zu erfüllen. Einfach.
Schultz9999
Tolle Antwort, habe gerade mit exit (0) gearbeitet und wusste nicht, dass es zur privaten API gehört
Alex Cio
39

Es ist nicht wirklich eine Möglichkeit, das Programm zu beenden, sondern eine Möglichkeit, die Leute zum Beenden zu zwingen.

UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Hit Home Button to Exit" message:@"Tell em why they're quiting" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
[anAlert show];

quelle
2
Wenn Sie dies tun, bleibt die Warnung zumindest im Simulator erhalten, wenn der Benutzer die App erneut öffnet. Daher schlage ich vor, ihnen mindestens einen Knopf zu geben.
Cheshirekow
Verwenden Sie die Antwort von Kalyan, damit die App beendet wird, wenn die Home-Taste gedrückt wird.
Timur Kuchkarov
Das Problem dabei ist, dass die App nicht tatsächlich beendet wird. Alles, was der Entwickler durch Beenden (Löschen einer ungültigen / alten Benutzeroberfläche, Löschen von Konstanten usw.) erreichen möchte, wird nur ausgeführt, wenn der Benutzer die Anwendung wischt geschlossen.
Ben Leggiero
Dies tötet die App nicht.
Dustin
38

Gehen Sie zu Ihrer info.plist und aktivieren Sie den Schlüssel "Anwendung läuft nicht im Hintergrund". Dieses Mal, wenn der Benutzer auf die Home-Schaltfläche klickt, wird die Anwendung vollständig beendet.

Kalyan
quelle
1
Aber Hintergrundprozess wird auch entlassen.
Gajendra K Chauhan
17

UIApplicationExitsOnSuspendEigenschaft hinzufügen application-info.plistzu true.

Aman Agarwal
quelle
Kann diese Einstellung zur Laufzeit geändert werden? Ich meine, ich möchte im Hintergrund leben, außer wenn meine App beim nächsten Suspend das Beenden wählt - in dieser Zeit möchte ich UIApplicationExitsOnSuspend einführen. Ist das möglich?
Motti Shneor
13

Nach einigen Tests kann ich Folgendes sagen:

  • Verwenden der privaten Schnittstelle: [UIApplication sharedApplication]Die App sieht aus, als wäre sie abgestürzt, ABER sie wird - (void)applicationWillTerminate:(UIApplication *)applicationvorher aufgerufen .
  • Mit using exit(0);wird auch die Anwendung beendet, sie sieht jedoch "normal" aus (die Symbole des Sprungbretts werden wie erwartet mit dem Verkleinerungseffekt angezeigt), ABER die - (void)applicationWillTerminate:(UIApplication *)applicationDelegate-Methode wird nicht aufgerufen .

Mein Rat:

  1. Rufen Sie - (void)applicationWillTerminate:(UIApplication *)applicationden Delegierten manuell an.
  2. Rufen Sie an exit(0);.
rchampourlier
quelle
Apple empfiehlt, exit nicht zu verwenden, da "Anwendungen, die exit aufrufen, dem Benutzer als abgestürzt erscheinen, anstatt eine ordnungsgemäße Beendigung durchzuführen und zum Startbildschirm zurückzukehren". Developer.apple.com/library/ios/#qa/qa2008/ qa1561.html
MickyD
8

Ihr ApplicationDelegate wird vom Benutzer über das absichtliche Beenden informiert:

- (void)applicationWillResignActive:(UIApplication *)application {

Wenn ich diese Benachrichtigung erhalte, rufe ich einfach an

        exit(0);

Welches macht die ganze Arbeit. Und das Beste ist, es ist die Absicht des Benutzers, das Programm zu beenden, weshalb dies kein Problem sein sollte, es dort aufzurufen.

In meiner Audio-App musste die App beendet werden, nachdem Benutzer ihr Gerät synchronisiert hatten, während die Musik noch abgespielt wurde. Sobald die Synchronisierung abgeschlossen ist, erhalte ich eine Benachrichtigung. Aber das Beenden der App gleich danach würde tatsächlich wie ein Absturz aussehen.

Also habe ich stattdessen ein Flag gesetzt, um die App bei der nächsten Hintergrundaktion WIRKLICH zu beenden. Welches ist in Ordnung, um die App nach einer Synchronisierung zu aktualisieren.

L'g
quelle
1
Dies ist keine gute Lösung, da die Anwendung aus anderen Gründen, z. B. aufgrund eines eingehenden Anrufs, aktiv zurücktritt.
Frankodwyer
Die Lösung besteht darin, eine Prüfung hinzuzufügen, die nur beendet wird, wenn dies sinnvoll ist. Zum Beispiel, wenn sich der Benutzer auf dem Startbildschirm befindet. Dann ist es auch dann in Ordnung, wenn ein Telefonanruf eingeht. Apple hat dies seit iOS 2 in meinen Apps nicht abgelehnt. stackoverflow.com/a/43906936/712124
Katze
6

Meine App wurde kürzlich abgelehnt, da ich eine undokumentierte Methode verwendet habe. Buchstäblich:

"Leider kann es nicht zum App Store hinzugefügt werden, da eine private API verwendet wird. Die Verwendung nicht öffentlicher APIs ist gemäß Abschnitt 3.3.1 der Lizenzvereinbarung für das iPhone Developer Program verboten:

"3.3.1 Anwendungen dürfen dokumentierte APIs nur in der von Apple vorgeschriebenen Weise verwenden und dürfen keine privaten APIs verwenden oder aufrufen."

Die nicht öffentliche API, die in Ihrer Anwendung enthalten ist, lautet terminateWithSuccess. "


quelle
6

Apple sagt:

"Warnung: Rufen Sie die Exit-Funktion nicht auf. Anwendungen, die exit aufrufen, scheinen dem Benutzer abgestürzt zu sein, anstatt eine ordnungsgemäße Beendigung durchzuführen und zum Startbildschirm zurückzukehren."

Ich denke, dass dies eine schlechte Annahme ist. Wenn der Benutzer auf eine Schaltfläche zum Beenden tippt und eine Meldung mit dem Titel "Die Anwendung wird jetzt beendet." Angezeigt wird, scheint sie nicht abgestürzt zu sein. Apple sollte eine gültige Möglichkeit zum Beenden einer Anwendung bereitstellen (nicht beenden (0)).

AGPX
quelle
3
Sie rufen die Home-Taste auf, die sich unten in jedem iDevice befindet. Aus diesem Grund ist es nie erforderlich, einen eigenen Beendigungsknopf einzubauen.
Popeye
4

Dies hat eine gute Antwort bekommen, aber beschlossen, ein wenig zu erweitern:

Sie können Ihre Bewerbung nicht in den AppStore aufnehmen, ohne die Richtlinien für die iOS-Benutzeroberfläche von Apple gut gelesen zu haben. (Sie behalten sich das Recht vor, Sie abzulehnen, wenn Sie etwas gegen sie unternehmen. ) Der Abschnitt "Nicht programmgesteuert beenden" http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices. html ist eine genaue Richtlinie, wie Sie in diesem Fall behandeln sollten.

Wenn Sie jemals ein Problem mit der Apple-Plattform haben, für das Sie keine einfache Lösung finden können, wenden Sie sich an HIG. Es ist möglich, dass Apple einfach nicht möchte, dass Sie es tun, und sie sagen dies normalerweise (ich bin nicht Apple, daher kann ich nicht immer garantieren) in ihrer Dokumentation.

Nanonyme
quelle
3

Hm, möglicherweise müssen Sie die Anwendung beenden, wenn Ihre Anwendung beispielsweise eine Internetverbindung erfordert. Sie könnten eine Warnung anzeigen und dann Folgendes tun:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}
rauben
quelle
9
Nein, Sie müssen es nicht beenden. Wenn die iTunes-App beispielsweise keine ordnungsgemäße Verbindung erkennt, wird einfach ein Bildschirm angezeigt, auf dem angegeben wird, dass keine Verbindung besteht. Es wird nicht beendet, sondern der Benutzer wird einfach darüber informiert, was gerade passiert. Der Benutzer wird dann durch Tippen auf die Home-Taste beendet.
August
1
Die Kompass-App wird jedoch beendet, wenn sie nicht funktioniert.
Josh Lee
3

Wir können nicht aufhören App exit(0), abort()Funktionen, wie die von Apple dringend die Verwendung dieser Funktionen entmutigen. Sie können diese Funktionen jedoch zu Entwicklungs- oder Testzwecken verwenden.

Wenn es während der Entwicklung oder des Testens erforderlich ist, Ihre Anwendung zu beenden, wird die Abbruchfunktion oder das Assert-Makro empfohlen

Weitere Informationen finden Sie in diesem Apple Q & A- Thread.

Wenn Sie diese Funktion verwenden, entsteht der Eindruck, als würde die Anwendung abstürzen. Daher habe ich einen Vorschlag erhalten, wie wir dem aufmerksamen Benutzer eine Benachrichtigung über die Beendigung der App anzeigen können, da bestimmte Funktionen nicht verfügbar sind.

Die iOS-Benutzeroberfläche für das Starten und Stoppen der App empfiehlt jedoch, niemals die Schaltfläche Beenden oder Schließen zu verwenden, um die Anwendung zu beenden. Eher als dass sie vorschlagen, die richtige Nachricht anzuzeigen, um die Situation zu erklären.

Eine iOS-App zeigt niemals die Option Schließen oder Beenden an. Benutzer verwenden eine App nicht mehr, wenn sie zu einer anderen App wechseln, zum Startbildschirm zurückkehren oder ihre Geräte in den Ruhemodus versetzen.

Beenden Sie eine iOS-App niemals programmgesteuert. Die Leute neigen dazu, dies als Absturz zu interpretieren. Wenn etwas Ihre App daran hindert, wie beabsichtigt zu funktionieren, müssen Sie den Benutzern die Situation mitteilen und erklären, was sie dagegen tun können.

technerd
quelle
2

Zusätzlich zu der obigen, guten Antwort, die ich nur hinzufügen wollte, denken Sie darüber nach, Ihr Gedächtnis aufzuräumen.

Nach dem Beenden Ihrer Anwendung bereinigt das iPhone-Betriebssystem automatisch alles, was Ihre Anwendung zurückgelassen hat. Wenn Sie also den gesamten Speicher manuell freigeben, kann sich die Zeit, die Ihre Anwendung zum Beenden benötigt, nur verlängern.

Chris Jefferson
quelle
Bitte ändern Sie Ihre Antwort im aktuellen Szenario von IOS4.0 und UP ..: P
rptwsthi
2
- (IBAction)logOutButton:(id)sender
{
   //show confirmation message to user
   CustomAlert* alert = [[CustomAlert alloc] initWithTitle:@"Confirmation" message:@"Do you want  to exit?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
   alert.style = AlertStyleWhite;
   [alert setFontName:@"Helvetica" fontColor:[UIColor blackColor] fontShadowColor:[UIColor clearColor]];
   [alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

   if (buttonIndex != 0)  // 0 == the cancel button
   {
      //home button press programmatically
      UIApplication *app = [UIApplication sharedApplication];
      [app performSelector:@selector(suspend)];
      //wait 2 seconds while app is going background
      [NSThread sleepForTimeInterval:2.0];
      //exit app when app is in background
      NSLog(@"exit(0)");
      exit(0);
  }
}
Prabhu Natarajan
quelle
1

Ich habe den oben erwähnten Ansatz [[NSMutableArray new] addObject: nil] verwendet, um die App zu beenden (abzustürzen), ohne einen verräterischen Funktionsaufruf zum Beenden (0) auszuführen.

Warum? Weil meine App bei allen Netzwerk-API-Aufrufen das Anheften von Zertifikaten verwendet, um Man-in-the-Middle-Angriffe zu verhindern. Dazu gehören die Initialisierungsaufrufe, die meine Finanz-App beim Start ausführt.

Wenn die Zertifikatauthentifizierung fehlschlägt, rufen alle meine Initialisierungsfehler auf und lassen meine App in einem unbestimmten Zustand. Es hilft nicht, den Benutzer nach Hause und dann zurück in die App zu lassen, da die App, sofern sie nicht vom Betriebssystem gelöscht wurde, immer noch nicht initialisiert und nicht vertrauenswürdig ist.

In diesem Fall halten wir es für am besten, eine Warnung auszulösen, die den Benutzer darüber informiert, dass die App in einer unsicheren Umgebung ausgeführt wird, und dann, wenn er auf "Schließen" klickt, das Beenden der App mit der oben genannten Methode zu erzwingen.

Michael Long
quelle
Ich kann nicht sehen, was Sie davon abhält, eine einzige weltliche Vollbildwarnung anzuzeigen, die dem Benutzer mitteilt, dass die App aus Gründen des "Anheftens von Zertifikaten" nicht verwendet werden kann, und das war's. Der Benutzer wird die App schließlich schließen. Sie wissen es vielleicht nicht, aber iOS behält sich das Recht vor, Ihren Prozess abzubrechen (seinen Status beizubehalten) und ihn später wiederherzustellen, und der "Lebenszyklus" der iOS-Anwendung liegt nicht wirklich in Ihren Händen. Ihr Absturz - ist einfach ein Absturz, und das Betriebssystem kann die App trotzdem wiederbeleben.
Motti Shneor
Wow, drei Jahre alter Beitrag. Wie auch immer, die neue App-Architektur macht das so ziemlich mit einer Wiederholungsschaltfläche, die die API erneut versucht und entweder den Blockbildschirm löscht oder sie mit einem neuen Fehler zum Blockbildschirm zurückbringt.
Michael Long
Die alte App-Struktur erlaubte so gut wie keine gute Möglichkeit, die Start-API-Aufrufe erneut zu versuchen, und die App befand sich ohne sie in einem inkonsistenten Zustand. Wir hätten einen permanenten Sperrbildschirm verwenden können, aber dafür musste der Benutzer die App selbst zwangsweise beenden, und es wurde entschieden, dass nicht jeder Benutzer wusste, wie er doppelklicken und das Beenden von Apps erzwingen sollte. Heute einfacher, aber vor drei Jahren ziemlich versteckt.
Michael Long
1
[[UIApplication sharedApplication] terminateWithSuccess];

Es hat gut funktioniert und ruft automatisch an

- (void)applicationWillTerminateUIApplication *)application delegate.

Fügen Sie diesen Code hinzu, um die Warnung zur Kompilierungszeit zu entfernen

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 
Shiva
quelle
5
Dies ist eine private Methode, Diego Mercado hat oben erklärt, dass seine App abgelehnt wurde, warum dann ein solches Risiko eingehen.
RVN
Bei Verwendung einer privaten API wird die App von Apple abgelehnt.
ZYiOS
2
für Enterprise App - dies kann eine Lösung sein.
user1140780
- (IBAction) exitApp: (id) Absender {SEL selector = NSSelectorFromString (@ "terminateWithSuccess"); [self performSelector: selector withObject: [UIApplication sharedApplication]]; }
Unom
@unmircea hat das die Bewertung bestanden?
Awesome-o
1

Sie sollten die Funktion nicht direkt aufrufen exit(0) da sie die Anwendung sofort beendet und so aussieht, als wäre Ihre App abgestürzt. Zeigen Sie den Benutzern daher besser eine Bestätigungsbenachrichtigung und lassen Sie sie dies selbst tun.

Swift 4.2

func askForQuit(_ completion:@escaping (_ canQuit: Bool) -> Void) {
    let alert = UIAlertController(title: "Confirmation!", message: "Do you want to quit the application", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(true)
    }))
    alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.cancel, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(false)
    }))
    self.present(alert, animated: true, completion: nil)
}

/// Will quit the application with animation
func quit() {
    UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
    /// Sleep for a while to let the app goes in background
    sleep(2)
    exit(0)
}

Verwendungszweck:

self.askForQuit { (canQuit) in
     if canQuit {
         self.quit()
     }
}
Der Tiger
quelle
0

Der Benutzer sollte entscheiden, wann eine App beendet wird. Ich denke nicht, dass es eine gute Benutzerinteraktion ist, wenn eine App beendet wird. Daher gibt es keine nette API dafür, nur die Home-Schaltfläche hat eine.

Wenn ein Fehler auftritt: Implementieren Sie ihn besser oder benachrichtigen Sie den Benutzer. Wenn ein Neustart erforderlich ist: Implementieren Sie ihn besser, indem Sie den Benutzer benachrichtigen.

Es klingt dumm, aber es ist eine schlechte Praxis, die App zu beenden, ohne den Benutzer entscheiden zu lassen und ihn nicht zu benachrichtigen. Und da es laut Apple eine Home-Taste für die Benutzerinteraktion gibt, sollte es nicht zwei Dinge für dieselbe Funktion geben (Beenden einer App).

Binarian
quelle
0

Das Beenden einer App auf eine andere Weise als die Home-Schaltfläche ist ein nicht iOS-ähnlicher Ansatz.

Ich habe diesen Helfer gemacht, der keine privaten Sachen benutzt:

void crash()
{ [[NSMutableArray new] addObject:NSStringFromClass(nil)]; }

Aber in meinem Fall immer noch nicht für die Produktion gedacht. Es dient zum Testen von Absturzberichten oder zum schnellen Neustart nach einem Zurücksetzen der Kerndaten. Ich habe es nur sicher gemacht, nicht abgelehnt zu werden, wenn die Funktion im Produktionscode verbleibt.

Geri Borbás
quelle
0

Swift 4.2 (oder älter)

Die aufgerufene Bibliothek Darvinkann verwendet werden.

import Darwin

exit(0) // Here you go

Hinweis: Dies wird in iOS-Anwendungen nicht empfohlen.

Wenn Sie dies tun, erhalten Sie ein Absturzprotokoll.

Saranjith
quelle
0

In iPadOS 13 können Sie jetzt alle Szenensitzungen wie folgt schließen:

for session in UIApplication.shared.openSessions {
    UIApplication.shared.requestSceneSessionDestruction(session, options: nil, errorHandler: nil)
}

Dadurch wird applicationWillTerminate(_ application: UIApplication)Ihr App-Delegierter aufgerufen und die App am Ende beendet.

Aber Vorsicht vor zwei Dingen:

Weitere Informationen zu Szenen in iOS / iPadOS 13: https://developer.apple.com/documentation/uikit/app_and_environment/scenes

Klaas
quelle
-1

Beenden Sie eine App auf andere Weise

Ich habe diesen Helfer gemacht, der keine privaten Sachen benutzt:

Beenden Sie (0);

iOS.j.
quelle
-1

Es kann angebracht sein, eine App zu beenden, wenn es sich um eine langlebige App handelt, die auch im Hintergrund ausgeführt wird, z. B. um Standortaktualisierungen abzurufen (mithilfe der Standortaktualisierungen) Hintergrundfunktion für ).

Angenommen, der Benutzer meldet sich von Ihrer standortbasierten App ab und schiebt die App mithilfe der Home-Schaltfläche in den Hintergrund. In diesem Fall läuft Ihre App möglicherweise weiter, es kann jedoch sinnvoll sein, sie vollständig zu beenden. Dies ist gut für den Benutzer (gibt Speicher und andere Ressourcen frei, die nicht verwendet werden müssen) und ist gut für die Stabilität der App (dh es muss sichergestellt werden, dass die App regelmäßig neu gestartet wird, wenn dies möglich ist. Dies ist ein Sicherheitsnetz gegen Speicherlecks und anderen geringen Speicher Probleme).

Dies könnte (sollte aber wahrscheinlich nicht, siehe unten :-) mit etwas erreicht werden wie:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
        exit(0);
    } else {
       // normal handling.
    }
}

Da die App dann aus dem Hintergrund beendet wird, sieht sie für den Benutzer nicht falsch aus und ähnelt keinem Absturz, vorausgesetzt, die Benutzeroberfläche wird beim nächsten Ausführen der App wiederhergestellt. Mit anderen Worten, für den Benutzer würde es nicht anders aussehen als eine vom System initiierte Beendigung der App, wenn sich die App im Hintergrund befindet.

Es wäre jedoch vorzuziehen, einen Standardansatz zu verwenden, um das System darüber zu informieren, dass die App beendet werden kann. In diesem Fall können Sie beispielsweise sicherstellen, dass das GPS nicht verwendet wird, indem Sie die Anforderung von Standortaktualisierungen beenden, einschließlich des Deaktivierens der Anzeige des aktuellen Standorts in einer Kartenansicht, falls vorhanden. Auf diese Weise sorgt das System dafür, dass die App einige Minuten (dh [[UIApplication sharedApplication] backgroundTimeRemaining]) nach dem Eintritt der App in den Hintergrund beendet wird. Dies würde dieselben Vorteile bringen, ohne dass Code zum Beenden der App verwendet werden müsste.

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
       // stop requesting location updates if not already done so
       // tidy up as app will soon be terminated (run a background task using beginBackgroundTaskWithExpirationHandler if needed).
    } else {
       // normal handling.
    }
}

Und natürlich exit(0)wäre die Verwendung niemals für die durchschnittliche Produktions-App geeignet, die im Vordergrund ausgeführt wird, wie aus anderen Antworten hervorgeht, die auf http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html verweisen

frankodwyer
quelle