Domanda

Sto programmando un'app per iPhone e devo forzarne l'uscita a causa di determinate azioni dell'utente.Dopo aver ripulito la memoria allocata dall'app, qual è il metodo appropriato da chiamare per terminare l'applicazione?

È stato utile?

Soluzione

Hai provato a exit(0)?

In alternativa, [[NSThread mainThread] exit], anche se non ho provato che sembra che la soluzione più appropriata.

Altri suggerimenti

Su iPhone non esiste il concetto di smettere un app. L'unica azione che dovrebbe causare un app per uscire sta toccando il tasto Home sul telefono, e che non è qualcosa che gli sviluppatori hanno accesso.

Secondo Apple, la vostra applicazione non dovrebbe terminare da solo. Dal momento che l'utente non ha colpito il pulsante Home, qualsiasi ritorno alla schermata Home offre all'utente l'impressione che la vostra applicazione si è schiantato. Questo è fonte di confusione comportamento, non standard e dovrebbe essere evitato.

exit (0) sembra un utente come gli arresti, in modo da mostrare un messaggio di conferma all'utente. Dopo la conferma di sospensione (tasto home stampa di programmazione) e attendere 2 secondi mentre app sta sfondo con animazione quindi uscire Dietro la vista dell'utente

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

Il suo non è un modo per uscire dal programma, ma un modo per costringere la gente a smettere di fumare.

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

Controllare il Q & A qui: https://developer.apple.com /library/content/qa/qa1561/_index.html

  

D: Come faccio a livello di codice lasciato il mio applicazione iOS

     

Non c'è API fornito per terminare grazia un'applicazione iOS.

     

In iOS, l'utente preme il pulsante Home per chiudere le applicazioni. Nel caso la vostra applicazione avere condizioni in cui essa non può fornire la sua funzione prevista, l'approccio consigliato è quello di visualizzare un avviso per l'utente che indica la natura del problema e le possibili azioni che l'utente potrebbe richiedere - attivazione Wi-Fi, consentendo servizi di localizzazione, ecc Consente all'utente di terminare l'applicazione a propria discrezione.

     
    

ATTENZIONE: Non chiamare la funzione exit. Applicazioni che richiedono -applicationWillTerminate: apparirà all'utente di aver schiantato, invece di effettuare la terminazione graziosa e animare tornare alla schermata iniziale.

  
     

Inoltre, i dati non possono essere salvati, perché UIApplicationDelegate e metodi abort simili non saranno richiamati se si chiama uscita.

     

Se durante lo sviluppo o test, è necessario interrompere l'applicazione, la funzione assert, o <=> si raccomanda macro

Vai al tuo info.plist e controllare la "Applicazione non viene eseguito in background" chiave. Questa volta, quando l'utente fa clic sul pulsante Home, l'applicazione esce completamente.

Aggiungi UIApplicationExitsOnSuspend proprietà su application-info.plist a true.

Dopo alcuni test, posso dire quanto segue:

  • utilizzando l'interfaccia privato: [UIApplication sharedApplication] farà sì che l'applicazione guardando come si è schiantato, ma chiamerà - (void)applicationWillTerminate:(UIApplication *)application prima di farlo;
  • utilizzando exit(0); sarà anche terminare l'applicazione, ma avrà un aspetto "normale" (le icone del trampolino appare come previsto, con lo zoom out effetto), ma non chiamare il <=> metodo delegato.

Il mio consiglio:

  1. chiamare manualmente il <=> sul delegato.
  2. Chiama <=>.

Il tuo ApplicationDelegate viene avvisato di smettere intenzionale da parte dell'utente:

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

Quando ho questa notifica mi basta chiamare

        exit(0);

Il che fa tutto il lavoro. E la cosa migliore è, è l'useres intento di uscire, motivo per cui questo non dovrebbe essere un problema chiamando lì.

Sul mio Audio-App è stato necessario chiudere l'applicazione dopo che le persone sono stati sincronizzati loro dispositivo, mentre la musica continuava a suonare. Non appena la sincronizzazione è completa ricevo una notifica. Ma smettere l'applicazione giusta, dopo che sarebbe effettivamente sembrare un incidente.

Così, invece ho impostare un flag per uscire davvero l'app sulla prossima azione backgrounding. Che è bene per rinfrescare l'applicazione dopo una sincronizzazione.

My App è stato respinto di recente bc ho usato un metodo non documentato. Letteralmente:

"Purtroppo non può essere aggiunto ad App Store, perché sta usando un'API privato uso di API non pubbliche, che, come indicato nella sezione Developer Program Contratto di licenza iPhone 3.3.1 è vietato:.

"3.3.1 applicazioni possono utilizzare solo le API documentate nella maniera prescritta da Apple e non devono utilizzare o chiamare qualsiasi API private".

L'API non pubbliche che è incluso nella vostra applicazione è terminateWithSuccess "

di Apple dire:

"Attenzione:.. Non chiamare la funzione dell'operazione di uscita per l'utente applicazioni che richiedono l'uscita di aver schiantato, invece di effettuare la terminazione graziosa e animare indietro alla schermata Home"

Credo che questa è una cattiva ipotesi. Se l'utente tocca un tasto uscire e viene visualizzato un messaggio che dice qualcosa come: "L'applicazione ora smettere", non sembra essere andato in crash. Apple dovrebbe fornire un modo valido per uscire da un'applicazione (non uscire (0)).

Questo ha ottenuto una buona risposta, ma ha deciso di espandere un po ':

Non è possibile ottenere l'applicazione accettato all'AppStore senza leggere Linee Guida iOS umani interfaccia di Apple bene. (Essi conservano il diritto di rifiutare voi per fare niente contro di loro) La sezione "Do not Quit programmazione" http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices.html è una linea guida precisa nel modo in cui si dovrebbe trattare in questo caso.

Se avete mai avuto un problema con la piattaforma di Apple non si può facilmente trovare una soluzione per consultare HIG. E 'possibile di Apple semplicemente non vuole che tu lo faccia e di solito (io non sono di Apple quindi non posso garantire sempre) lo dico nella loro documentazione.

Non possiamo uscire dall'app utilizzando exit(0), abort() funzioni, poiché Apple sconsiglia vivamente l'uso di queste funzioni.Sebbene sia possibile utilizzare queste funzioni per scopi di sviluppo o test.

Se durante lo sviluppo o il test è necessario interrompere l'applicazione, si consiglia la funzione di abort o assert macro

Per favore, trova questa Apple Domande e risposte discussione per avere maggiori informazioni.

Quando si utilizza questa funzione, si crea l'impressione che l'applicazione si stia bloccando.Quindi ho ricevuto alcuni suggerimenti, ad esempio possiamo visualizzare un avviso con un messaggio di terminazione per avvisare l'utente della chiusura dell'app, a causa dell'indisponibilità di determinate funzionalità.

Ma le linee guida per l'interfaccia umana iOS per Avvio e arresto dell'app, suggerendo che Non utilizzare mai il pulsante Esci o Chiudi per terminare l'applicazione.Piuttosto che suggeriscano di visualizzare il messaggio adeguato per spiegare la situazione.

Un'app iOS non visualizza mai un'opzione Chiudi o Esci.Le persone smettono di utilizzare un'app quando passano a un'altra app, tornano alla schermata principale o mettono i loro dispositivi in ​​modalità Sleep.

Non chiudere mai un'app iOS in modo programmatico.Le persone tendono a interpretarlo come un incidente.Se qualcosa impedisce alla tua app di funzionare come previsto, devi raccontare agli utenti la situazione e spiegare cosa possono fare al riguardo.

In aggiunta a quanto sopra, bene, risposta che volevo solo aggiungere, pensare a ripulire la memoria.

Dopo le vostre uscite di applicazione, il sistema operativo iPhone sarà automaticamente ripulire qualsiasi cosa la vostra applicazione lasciato alle spalle, in modo da liberare manualmente tutta la memoria può solo aumentare la quantità di tempo necessaria l'applicazione per uscire.

Hm, si può 'avere a' chiudere l'applicazione se, per esempio, l'applicazione richiede una connessione a internet. Si potrebbe visualizzare un avviso e poi fare qualcosa di simile:

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

Ho usato la [[NSMutableArray nuovo] addObject: nil] approccio di cui sopra per forzare l'uscita (crash) l'applicazione senza fare un'uscita spia (0) chiamata di funzione

.

Perché? Perché la mia applicazione utilizza il certificato pinning su tutte le API di rete le chiamate per prevenire attacchi di tipo man-in-the-middle. Questi includono l'inizializzazione chiama il mio app finanziaria rende all'avvio.

Se l'autenticazione del certificato fallisce, tutta la mia inizializzazione chiama errore e lasciare la mia app in uno stato indeterminato. Lasciando l'utente andare a casa e poi di nuovo in applicazione non aiuta, come a meno che l'applicazione è stata eliminata dal sistema operativo è ancora inizializzato e inaffidabili.

Quindi, in questo caso, abbiamo ritenuto che la cosa migliore per far apparire un avviso che informa l'utente che l'applicazione è in funzione in un ambiente insicuro e poi, quando hanno colpito "Chiudi", forza di uscire dal app utilizzando il metodo di cui sopra.

[[UIApplication sharedApplication] terminateWithSuccess];

Ha funzionato bene e chiede automaticamente

- (void)applicationWillTerminateUIApplication *)application delegate.

per rimuovere avvertimento momento della compilazione aggiungere questo codice

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

L'utente deve decidere quando un app uscite. Io non penso che sia una buona interazione utente quando un app si chiude. Pertanto non v'è alcuna bello API per essa, solo il pulsante casa ha uno.

Se c'è un errore: attuarlo meglio o notificare l'utente. Se ci deve essere un riavvio:. Implementare meglio della Notifica l'utente

Sembra stupido, ma è cattiva pratica di uscire dall'applicazione senza lasciare che l'utente a decidere e non lo notifica. E poiché non v'è un pulsante home per l'interazione con l'utente, Apple afferma, non ci dovrebbero essere 2 cose per la stessa funzione (in uscita un app).

Si fa terminare un'applicazione altro modo che il tasto home è in realtà non-iOS-esque approccio.

Ho fatto questo helper, però, che non usano cose private:

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

Ma ancora non significava per la produzione nel mio caso. E 'per il test reportings incidente, o per il riavvio veloce dopo un reset Core Data. Appena fatto sicuro di non essere respinta se la funzione lasciata nel codice di produzione.

Swift 4.2 (o superiore)

libreria chiamata Darvin può essere utilizzato.

import Darwin

exit(0) // Here you go

NB: Questo non è recomanded nelle applicazioni iOS.

In questo modo si arriva crash log.

Non si dovrebbe chiamare direttamente la funzione exit(0) in quanto si chiuderà immediatamente l'applicazione e sarà simile a vostra applicazione è schiantato. Quindi meglio per mostrare agli utenti un avviso di conferma e lasciarli fare da soli.

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

Usage:

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

Esci un'applicazione altro modo

Ho fatto questo helper, però, che non usano cose private:

Exit (0);

Può essere opportuno per uscire un app se si tratta di un'applicazione vissuto a lungo che esegue anche in background, ad esempio per ottenere aggiornamenti sulla posizione (utilizzando il aggiornamenti sulla posizione capacità di sfondo per questo).

Per esempio, diciamo che l'utente dalla vostra posizione in base app, e spinge l'applicazione per lo sfondo utilizzando il tasto home. In questo caso la vostra applicazione può continuare a correre, ma potrebbe avere senso per uscire completamente. Sarebbe utile per l'utente (memoria stampa e altre risorse che non devono essere utilizzati), e buona stabilità app (cioè assicurandosi che l'applicazione sia periodicamente riavviato quando possibile è una rete di sicurezza contro perdite di memoria e l'altra memoria bassa problemi).

Questo potrebbe (anche se probabilmente non dovrebbe, vedi sotto :-) essere raggiunto con qualcosa di simile:

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

Dal momento che l'applicazione sarebbe poi uscita fuori del contesto sarà non guardare sbagliato per l'utente, e non assomiglierà ad un incidente, che fornisce l'interfaccia utente viene ripristinata la prossima volta che eseguire l'applicazione. In altre parole, per l'utente che non avrebbe un aspetto diverso ad una terminazione del sistema avviato dell'app quando l'applicazione è in background.

Ancora, sarebbe preferibile utilizzare un approccio più standard per consentire al sistema di sapere che l'applicazione può essere terminato. Per esempio, in questo caso, facendo in modo che il GPS non è in uso da un arresto che richiedono aggiornamenti di posizione, tra cui lo spegnimento mostra ubicazione corrente su una guarda la mappa se presente. In questo modo il sistema si prenderà cura di terminare l'applicazione in pochi minuti (vale a dire [[UIApplication sharedApplication] backgroundTimeRemaining]) dopo l'applicazione entra nel fondo. Questo sarebbe ottenere tutti gli stessi benefici senza dover utilizzare il codice per terminare l'applicazione.

- (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.
    }
}

E, naturalmente, utilizzando exit(0) non sarebbe mai essere appropriato per l'applicazione produzione media che viene eseguito in primo piano, come per altre risposte che fanno riferimento a http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top