Frage

Ich programmiere eine iPhone App, und ich brauche es zu zwingen, aufgrund bestimmter Benutzeraktionen zu beenden. Nach Reinigung Speicher der App zugewiesen, was ist die entsprechende Methode aufrufen, die Anwendung zu beenden?

War es hilfreich?

Lösung

Haben Sie versucht, exit(0)?

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

Andere Tipps

Auf dem iPhone gibt es kein Konzept, eine App zu verlassen. Die einzige Aktion, die eine App verursachen sollte beenden berührt die Home-Taste am Telefon, und das ist nicht etwas, Entwickler Zugriff hat.

Laut Apple App sollte nicht alleine beenden. Da der Benutzer nicht die Home-Taste getroffen hat, eine Rückkehr zum Home-Bildschirm gibt dem Benutzer den Eindruck, dass Ihre App abgestürzt. Dies ist verwirrend, Nicht-Standard-Verhalten und soll vermieden werden.

exit (0) erscheint einen Benutzer als abstürzt, so eine Bestätigungsnachricht an Benutzern zeigen. Nach der Bestätigung (Home-Taste drückt programmatisch) suspendieren und 2 Sekunden warten, während app Hintergrund mit Animation geht dann Ausfahrt hinter Benutzer Ansicht

-(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);
    }
}

Es ist nicht wirklich eine Möglichkeit, das Programm zu beenden, sondern einen Weg, um Menschen zu zwingen, zu beenden.

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

Überprüfen Sie die Q & A hier: https://developer.apple.com /library/content/qa/qa1561/_index.html

  

F: Wie kann ich meine programmatisch iOS-Anwendung beenden

     

Es gibt keine API für ordnungsgemäß beendet eine iOS-Anwendung zur Verfügung gestellt.

     

In iOS, drückt der Benutzer die Home-Taste Anwendungen zu schließen. Sollte Ihre Anwendung Bedingungen, unter denen er seine vorgesehene Funktion nicht zur Verfügung stellen kann, die empfohlene Vorgehensweise ist eine Warnung für den Benutzer angezeigt werden, die die Art des Problems und mögliche Aktionen gibt der Benutzer nehmen könnte - auf WiFi drehen, so dass die Standortdienste usw. Hiermit kann der Anwender die Anwendung nach eigenem Ermessen beenden.

     
    

ACHTUNG: Sie die exit Funktion nicht aufrufen. Anwendungen exit Aufruf wird den Benutzer angezeigt abgestürzt sein, anstatt eine anmutige Beendigung der Durchführung und zum Startbildschirm Animieren zurück.

  
     

Darüber hinaus können Daten nicht gespeichert werden, weil -applicationWillTerminate: und ähnlichen UIApplicationDelegate Methoden nicht aufgerufen werden, wenn Sie Ausgang nennen.

     

Wenn während der Entwicklung oder Erprobung es notwendig ist, Ihre Anwendung zu beenden, die abort Funktion oder assert Makro wird empfohlen

Gehen Sie zu Ihrem info.plist und überprüfen Sie die Taste „Anwendung nicht im Hintergrund laufen“. Dieses Mal, wenn der Benutzer die Home-Taste klickt, wird die Anwendung beendet vollständig.

In UIApplicationExitsOnSuspend Eigenschaft auf application-info.plist true.

Nach einigen Tests kann ich folgendes sagen:

  • die private Schnittstelle: [UIApplication sharedApplication] die App suchen verursacht wie es abgestürzt ist, aber es wird - (void)applicationWillTerminate:(UIApplication *)application rufen, bevor Sie so;
  • exit(0); verwendet, wird auch die Anwendung beenden, aber es aussehen wird „normal“ (die Sprungbrett-Ikonen wie erwartet angezeigt wird, mit dem Zoom-out-Effekt), aber es wird die - (void)applicationWillTerminate:(UIApplication *)application Delegatmethode nicht nennen.

Mein Rat:

  1. rufen Sie manuell die - (void)applicationWillTerminate:(UIApplication *)application auf den Delegaten.
  2. Anruf exit(0);.

Ihre ApplicationDelegate absichtlichen Aufhören durch den Benutzer informiert werden:

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

Wenn ich diese Meldung bekomme ich einfach anrufen

        exit(0);

Welche macht die ganze Arbeit. Und das Beste ist, es ist die useres Absicht ist, zu verlassen, weshalb dies kein Problem sein sollte dort anrufen.

Auf meinem Audio-App war es notwendig, die App zu beenden, nachdem die Menschen ihr Gerät synchronisieren wurden, während die Musik noch spielt. Sobald die Synchronisierung abgeschlossen ist erhalte ich eine Benachrichtigung. Aber verlassen Sie die App direkt danach aussehen würde, tatsächlich wie ein Absturz.

Also anstatt stelle ich eine Flagge um wirklich die App auf der nächsten Backgrounding Aktion zu beenden. Die für die Aktualisierung der App nach einer Synchronisierung in Ordnung ist.

Meine App wurde kürzlich abgelehnt bc ich eine nicht dokumentierte Methode verwendet haben. Wörtlich:

"Leider kann es nicht in den App Store hinzugefügt werden, da es eine private API verwendet Verwenden von nicht-öffentlichen APIs, die wie im iPhone Developer Program License Agreement Abschnitt skizzierten 3.3.1 verboten ist.

„3.3.1 Anwendungen nur dokumentierte APIs in der vorgeschriebenen Art und Weise von Apple verwenden kann und darf keine privaten APIs verwenden, oder rufen Sie.“

Die nicht-öffentliche API, die in der Anwendung enthalten ist, ist terminateWithSuccess "

Apple-sagen:

„Warnung:.. Setzen Sie die Exit-Funktion nicht aufrufen Anwendungen Ausgang Aufruf an den Benutzer angezeigt werden abgestürzt, anstatt eine anmutige Beendigung der Durchführung und zurück zum Startbildschirm Animieren“

ich glaube, dass dies eine schlechte Annahme ist. Wenn der Benutzer auf eine Schaltfläche beenden tippen und eine Meldung erscheint, dass so etwas sagen wie: „Die Anwendung wird nun verlassen“, scheint es nicht abgestürzt zu sein. Apple soll eine gültige Art und Weise bietet eine Anwendung (nicht verlassen (0)) zu beenden.

Das ist eine gute Antwort bekommen, aber beschlossen, ein wenig zu erweitern:

Sie können nicht Ihre Anwendung App Store akzeptiert, ohne zu lesen und iOS Human Interface Guidelines von Apple. (Sie behalten das Recht, die Sie ablehnen zu tun alles gegen sie) Der Abschnitt "Programmatische Do not Quit" http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices.html in ist eine genaue Richtlinie, wie Sie in diesem Fall behandeln sollen.

Wenn Sie jemals ein Problem mit Apple-Plattform haben Sie nicht einfach eine Lösung für, konsultiert HIG finden. Es ist möglich, von Apple einfach nicht, dass Sie es zu tun haben will und sie in der Regel (ich bin nicht von Apple, so kann ich nicht garantieren, immer) so sagen darf in ihrer Dokumentation.

Wir können nicht aufhören App exit(0), abort() Funktionen, wie die von Apple dringend die Verwendung dieser Funktionen entmutigen. Auch wenn Sie diese Funktionen für die Entwicklung oder Testzwecke verwenden können.

  

Wenn während der Entwicklung oder Erprobung es notwendig ist, zu beenden Ihre   Anwendung, die Abbruchfunktion oder behaupten Makro wird empfohlen

Sie finden diese Apple- Q & A Faden weitere Informationen zu erhalten .

Wie die Verwendung dieser Funktion erstellen Eindruck wie Anwendung abstürzt. Also habe ich einen Vorschlag machen, wie wir Alarm mit Abbruchmeldung zu beachten Benutzer über Schließen der App angezeigt werden kann, aufgrund der Nichtverfügbarkeit bestimmter Funktionalität.

Aber iOS Human Interface Guideline für Starten und Stoppen der App , was darauf hindeutet, dass verwenden Sie niemals beenden oder Schließen-Taste Anwendung zu beenden. Vielmehr dann, dass sie die richtige Nachricht anzuzeigen vorschlagen Situation zu erklären.

  

Eine iOS App zeigt nie Schließen oder Beenden Option. Menschen stoppen ein mit   app, wenn sie zu einer anderen App wechseln, zurück zum Startbildschirm oder setzen   ihre Geräte im Sleep-Modus.

     

beenden Kein iOS-App programmatisch. Menschen neigen dazu, diese zu interpretieren   als Crash. Wenn etwas verhindert, dass Ihre App aus, die als   bestimmt sind, müssen Sie die Benutzer über die Situation erzählen und erklären, was   sie dagegen tun können.

Zusätzlich zu den oben genannten, gut, Antwort, die ich wollte nur hinzufügen, denken Sie an Ihre Speicher aufzuräumen.

Nach der Anwendung beendet wird, wird das iPhone OS automatisch aufzuräumen alles Ihre Anwendung hinter sich gelassen, so dass alle Speicherfreigabe manuell erhöhen kann nur die Menge an Zeit, die Ihre Anwendung nimmt zu beenden.

Hm, man kann ‚müssen‘ die Anwendung beenden, wenn, sagen wir, Ihre Anwendung erfordert eine Internetverbindung. Sie könnten eine Warnung angezeigt werden und dann so etwas tun:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}
- (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);
  }
}

ich verwenden, um das [[NSMutableArray neu] addObject: nil] Ansatz oben erwähnt zwang beenden (Absturz) die App ohne eine verräterische Ausfahrt zu machen (0) Funktionsaufruf

.

Warum? Weil meine App-Zertifikat Pinning auf alle Netzwerk-API verwendet, nennt man-in-the-Middle-Angriffe zu verhindern. Dazu gehört die Initialisierung ruft meine finanzielle App macht beim Start.

Wenn die Zertifikatsauthentifizierung fehlschlägt, alle meine Initialisierung ruft Fehler und meine app in einem unbestimmten Zustand verlassen. Loslassen der Benutzer nach Hause und dann in die App zurück hilft nicht, wie es sei denn, die Anwendung vom Betriebssystem gelöscht wurde es noch nicht initialisiert und nicht vertrauenswürdig ist.

Also, in diesem Fall, als wir es am besten, einen Alarm informiert den Benutzer Pop, dass die App in einer unsicheren Umgebung betrieben wird, und dann, wenn sie auf „Schließen“ getroffen, Kraft verlassen die App des oben genannten Verfahrens verwendet wird.

[[UIApplication sharedApplication] terminateWithSuccess];

Es funktionierte gut und ruft automatisch

- (void)applicationWillTerminateUIApplication *)application delegate.

Kompilierung Warnung fügen Sie diesen Code entfernen

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 

Der Benutzer sollte entscheiden, wann eine App beendet wird. Ich glaube nicht, es ist eine gute Interaktion mit dem Benutzer ist, wenn eine Anwendung beendet wird. Deshalb gibt es keine schöne API ist, nur die Home-Taste hat einen.

Wenn es ein Fehler: Implementieren es besser oder den Benutzer benachrichtigen. Wenn ein Neustart sein müssen. Implement es besser, den Benutzer benachrichtigen,

Es klingt dumm, aber es ist eine schlechte Praxis die Anwendung zu beenden, ohne dass der Benutzer entscheiden, und benachrichtigen ihn nicht. Und da gibt es eine Home-Taste für die Interaktion mit dem Benutzer ist, heißt es von Apple, sollte es nicht sein 2 Dinge für die gleiche Funktion (Verlassen einer App).

Verlassen Sie eine App andere Art und Weise als die Home-Taste ist wirklich nicht-iOS-esque Ansatz.

Ich habe diese Helfer aber, dass keine privaten Dinge verwenden:

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

Aber immer noch nicht für die Produktion in meinem Fall bedeutet. Es ist für die Crash-Reportings zu testen oder zu schnellen Neustart nach einem Core Data zurückgesetzt. Nur machte es sicher nicht abgelehnt werden, wenn die Funktion in der Produktion Code links.

Swift 4.2 (oder älter)

In der Bibliothek genannt Darvin verwendet werden.

import Darwin

exit(0) // Here you go

Hinweis: Dies ist in iOS-Anwendungen nicht recomanded.

Dadurch wird Sie Crashlog erhalten.

Sie sollten die Funktion exit(0) nicht direkt aufrufen, da sie die Anwendung sofort beenden und wird aussehen wie Ihre Anwendung abgestürzt ist. Also besser Benutzer eine Bestätigung Alarm zu zeigen 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)
}

Verbrauch:

self.askForQuit { (canQuit) in
     if canQuit {
         self.quit()
     }
}

Beenden einer App andere Art und Weise

Ich habe diese Helfer aber, dass keine privaten Dinge verwenden:

Exit (0);

Es kann zweckmäßig sein, eine App zu verlassen, wenn es eine lange gelebt Anwendung, die auch im Hintergrund ausgeführt wird, beispielsweise Standort-Updates zu erhalten (mit der Standortaktualisierungen Hintergrund-Fähigkeit für diese).

Zum Beispiel, sagen wir mal der Benutzer abmeldet von Ihrem Standort-basierte Anwendung, und schiebt die App auf dem Hintergrund mit der Home-Taste. In diesem Fall kann die App weiterlaufen, aber es könnte sinnvoll sein, sich vollständig zu beenden. Es wäre für den Benutzer (releases Speicher und andere Ressourcen, die verwendet wird, müssen nicht) gut sein, und gut für die App-Stabilität (dh sicherstellen, dass die App in regelmäßigen Abständen neu gestartet werden, wenn möglich, ein Sicherheitsnetz gegen Speicherlecks und anderen Low-Speicher Ausgaben).

Dies könnte (wenn auch wahrscheinlich nicht, siehe unten :-) mit so etwas wie erreicht werden:

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

Da die App würde dann die Ausfahrt aus dem Hintergrund es wird nicht an den Benutzer falsch aussehen, und wird nicht zu einem Absturz ähneln, die Bereitstellung der Benutzeroberfläche wiederhergestellt wird das nächste Mal, wenn sie die App laufen. Mit anderen Worten, für den Benutzer wäre es nicht anders aussieht auf ein System initiiert Beendigung der App, wenn die App im Hintergrund ist.

Dennoch wäre es besser, einen Standardansatz zu verwenden, das System zu informieren, dass der App beendet werden kann. Zum Beispiel in diesem Fall, indem sie sicher, dass die GPS im Einsatz nicht durch Anhalte anfordernden Standort-Updates, einschließlich Dreh zeigt aktuelle Position auf einer Karte, falls vorhanden aus. Auf diese Weise das System darauf achten, wird die App ein paar Minuten (das heißt [[UIApplication sharedApplication] backgroundTimeRemaining]) nach der Anwendung des Beendens tritt in den Hintergrund. Dies würde alle die gleichen Vorteile erhalten, ohne Code zu verwenden, um die Anwendung zu beenden.

- (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) Verwendung würde nie für die durchschnittliche Produktion App, die im Vordergrund ausgeführt wird, wie pro anderen Antworten angemessen sein, die http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top