Forma correcta de salir de la aplicación iPhone?


Estoy programando una aplicación para iPhone y necesito forzarla a salir debido a ciertas acciones del usuario. Después de limpiar la memoria de la aplicación asignada, ¿cuál es el método apropiado para llamar para terminar la aplicación?

Author: GameLoading, 2008-12-10

22 answers

¿has probado exit(0)?

Alternativamente, [[NSThread mainThread] exit], aunque no he intentado que parezca la solución más apropiada.

 209
Author: Brett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-09 18:48:41

En el iPhone no hay ningún concepto de salir de una aplicación. La única acción que debe hacer que una aplicación salga es tocar el botón de inicio en el teléfono, y eso no es algo a lo que los desarrolladores tengan acceso.

Según Apple, tu app no debe terminar por sí sola. Dado que el usuario no pulsó el botón de inicio, cualquier retorno a la pantalla de inicio le da al usuario la impresión de que su aplicación se bloqueó. Esto es un comportamiento confuso y no estándar y debe evitarse.

 265
Author: August,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-10 14:54:06

Exit(0) aparece al usuario como un bloqueo, así que muestra un mensaje de confirmación al usuario. Después de la confirmación suspender (botón de inicio pulse programáticamente) y espere 2 segundos mientras la aplicación va en segundo plano con animación y luego salir detrás de la vista del usuario

-(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);
    }
}
 46
Author: Salim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-23 05:54:32

No es realmente una manera de salir del programa, sino una manera de obligar a la gente a salir.

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];
 38
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-04 00:59:29

Vaya a su información.plist y compruebe la clave "La aplicación no se ejecuta en segundo plano". Esta vez, cuando el usuario hace clic en el botón de inicio, la aplicación se cierra por completo.

 37
Author: Kalyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-01 04:47:38

Compruebe las preguntas y respuestas aquí: https://developer.apple.com/library/content/qa/qa1561/_index.html

P: ¿Cómo salgo de mi aplicación iOS mediante programación?

No se proporciona ninguna API para terminar con gracia una aplicación iOS.

En iOS, el usuario presiona el botón de inicio para cerrar las aplicaciones. Si su aplicación tiene condiciones en las que no puede proporcionar la función prevista, el enfoque recomendado es mostrar una alerta para el usuario eso indica la naturaleza del problema y las posibles acciones que el usuario podría tomar: activar WiFi, habilitar Servicios de ubicación, etc. Permitir al usuario terminar la aplicación, a su propia discreción.

ADVERTENCIA: No llame a la función exit. Las aplicaciones que llaman a exit parecerán que el usuario se ha bloqueado, en lugar de realizar una terminación elegante y animar de nuevo a la pantalla de inicio.

Además, los datos no se pueden guardar, porque -applicationWillTerminate: y métodos similares UIApplicationDelegate no serán invocados si llamas a exit.

Si durante el desarrollo o las pruebas es necesario finalizar su aplicación, se recomienda la función abort, o la macro assert

 37
Author: Wagh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-31 13:28:13

Agregue la propiedad UIApplicationExitsOnSuspend en application-info.plist a true

 15
Author: Aman Agarwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-07 08:14:39

Después de algunas pruebas, puedo decir lo siguiente:

  • usando la interfaz privada: [UIApplication sharedApplication] hará que la aplicación parezca que se bloqueó, PERO llamará a - (void)applicationWillTerminate:(UIApplication *)application antes de hacerlo;
  • el uso de exit(0); también terminará la aplicación, pero se verá "normal" (los iconos del trampolín aparecen como se esperaba, con el efecto de alejamiento), PERO no llamará al método delegado - (void)applicationWillTerminate:(UIApplication *)application.

Mi consejo:

  1. Llame manualmente al - (void)applicationWillTerminate:(UIApplication *)application en el delegado.
  2. Llamar exit(0);.
 13
Author: rchampourlier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-17 17:00:54

Su ApplicationDelegate recibe una notificación de abandono intencional por parte del usuario:

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

Cuando recibo esta notificación, simplemente llamo

        exit(0);

Que hace todo el trabajo. Y lo mejor es que es la intención de los usuarios de dejar de fumar, por lo que esto no debería ser un problema llamarlo allí.

En mi Aplicación de audio era necesario salir de la aplicación después de que las personas estaban sincronizando su dispositivo mientras la música todavía estaba reproduciendo. Tan pronto como se complete la sincronización, recibo una notificación. Pero salir de la aplicación justo después de eso en realidad se vería como un accidente.

Así que en su lugar, establecí una bandera para salir realmente de la aplicación en la siguiente acción de fondo. Lo cual está bien para actualizar la aplicación después de una sincronización.

 8
Author: L'g,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-12 10:41:15

Mi aplicación ha sido rechazada recientemente bc He utilizado un método indocumentado. Literalmente:

"Desafortunadamente no se puede agregar a la App Store porque está utilizando una API privada. El uso de API no públicas, que como se describe en la sección 3.3.1 del Acuerdo de Licencia del Programa para Desarrolladores de iPhone, está prohibido:

"3.3.1 Las aplicaciones solo pueden usar API documentadas de la manera prescrita por Apple y no deben usar ni llamar a ninguna API privada."

La API no pública que se incluye en su aplicación es terminateWithSuccess "

 6
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-02 17:44:36

Apple dice:

"Advertencia: No llame a la función exit. Las aplicaciones que llaman a exit parecerán que el usuario se ha bloqueado, en lugar de realizar una terminación elegante y animar de nuevo a la pantalla de inicio."

Creo que esta es una mala suposición. Si el usuario toca un botón salir y aparece un mensaje que dice algo como: "La aplicación ahora se cerrará.", no parece que se estrelló. Apple debe proporcionar una forma válida de salir de una aplicación (no exit (0)).

 6
Author: AGPX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-23 12:01:23

Esto ha recibido una buena respuesta pero decidió expandirse un poco:

No puede obtener su aplicación aceptada en AppStore sin leer bien las Pautas de la interfaz humana de iOS de Apple. (se reservan el derecho de rechazarte por hacer cualquier cosa en su contra) La sección "No salir Programáticamente" http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices.html es una pauta exacta en cómo debe tratar en este caso.

Si alguna vez tiene un problema con la plataforma de Apple para el que no puede encontrar una solución fácilmente, consulte HIG. Es posible que Apple simplemente no quiera que lo hagas y por lo general (no soy Apple, así que no puedo garantizar siempre) lo dicen en su documentación.

 4
Author: nanonyme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-03 15:23:48

No podemos salir de la aplicación usando exit(0), abort() funciones, ya que Apple desaconseja fuertemente el uso de estas funciones. Aunque puede usar estas funciones para fines de desarrollo o prueba.

Si durante el desarrollo o las pruebas es necesario terminar su se recomienda la aplicación, la función abortar o la macro assert

Por favor, encuentre este hilo de preguntas y respuestas de Apple para obtener más información.

Como uso de esta función crear impresión como aplicación es estrellar. Así que tengo alguna sugerencia como podemos mostrar Alerta con mensaje de terminación al usuario consciente sobre el cierre de la aplicación, debido a la falta de disponibilidad de cierta funcionalidad.

Pero la Guía de Interfaz Humana de iOS para Iniciar Y Detener la Aplicación, lo que sugiere que Nunca use el botón Salir o Cerrar para terminar la Aplicación. En lugar de que están sugiriendo para mostrar el mensaje adecuado para explicar la situación.

Una aplicación iOS nunca muestra una opción Cerrar o Salir. La gente deja de usar un app cuando cambian a otra app, vuelven a la pantalla de inicio o ponen sus dispositivos en modo de suspensión.

Nunca salga de una aplicación iOS mediante programación. La gente tiende a interpretar esto como un accidente. Si algo impide que su aplicación funcione como destinado, es necesario informar a los usuarios sobre la situación y explicar lo que pueden hacerlo.

 3
Author: technerd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-28 13:21:24

Además de lo anterior, bueno, respuesta que solo quería añadir, pensar en la limpieza de su memoria.

Después de que su aplicación salga, el iPhone OS limpiará automáticamente todo lo que su aplicación deje atrás, por lo que liberar toda la memoria manualmente solo puede aumentar la cantidad de tiempo que tarda su aplicación en salir.

 2
Author: Chris Jefferson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-10 14:04:15

Hm, es posible que 'tenga que' salir de la aplicación si, por ejemplo, su aplicación requiere una conexión a Internet. Usted podría mostrar una alerta y luego hacer algo como esto:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}
 2
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-11 01:55:15
- (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);
  }
}
 2
Author: Prabhu Natarajan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-05 09:11:01

Utilicé el enfoque [[NSMutableArray new] addObject:nil] mencionado anteriormente para forzar la salida (crash) de la aplicación sin hacer una llamada a la función de salida(0).

¿Por qué? Porque mi aplicación utiliza la fijación de certificados en todas las llamadas a la API de red para evitar ataques de intermediario. Estas incluyen las llamadas de inicialización que mi aplicación financiera realiza al inicio.

Si la autenticación del certificado falla, todas mis llamadas de inicialización se saldrán con un error y dejarán mi aplicación en un estado indeterminado. Dejar que el ir a casa del usuario y luego volver a la aplicación no ayuda, ya que a menos que la aplicación haya sido purgada por el sistema operativo, todavía no está inicializada y no es de confianza.

Por lo tanto, en este caso, consideramos que lo mejor es hacer estallar una alerta informando al usuario que la aplicación está operando en un entorno inseguro y luego, cuando presionan "Cerrar", forzar el cierre de la aplicación utilizando el método mencionado anteriormente.

 2
Author: Michael Long,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-24 23:44:08

Salir de una aplicación de otra manera que el botón de inicio es realmente no iOS-esque enfoque.

Hice este ayudante, sin embargo, que no usa cosas privadas:

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

Pero todavía no está destinado a la producción en mi caso. Es para probar informes de fallos, o para reiniciar rápidamente después de un restablecimiento de datos del núcleo. Solo lo hizo seguro para no ser rechazado si la función queda en el código de producción.

 1
Author: Geri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-27 14:57:13

El usuario debe decidir cuándo sale una aplicación. No creo que sea una buena interacción del usuario cuando una aplicación se cierra. Por lo tanto, no hay una buena API para ello, solo el botón de inicio tiene una.

Si hay un error: Implementarlo mejor o Notificar al usuario. Si tiene que haber un reinicio: Implementarlo mejor de Notificar al usuario.

Suena tonto, pero es una mala práctica salir de la aplicación sin dejar que el usuario decida y no notificarle. Y ya que hay un botón de inicio para el usuario interacción, afirma Apple, no debe haber 2 cosas para la misma función (salir de una aplicación).

 0
Author: Binarian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-30 09:53:07

Salir de una aplicación de otra manera

Hice este ayudante, sin embargo, que no usa cosas privadas:

Exit (0);

 0
Author: iOS.j,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-07 13:11:41

Puede ser apropiado salir de una aplicación si es una aplicación de larga duración que también se ejecuta en segundo plano, por ejemplo, para obtener actualizaciones de ubicación (utilizando la capacidad de segundo plano actualizaciones de ubicación para eso).

Por ejemplo, supongamos que el usuario cierra sesión en su aplicación basada en la ubicación y la coloca en segundo plano usando el botón de inicio. En este caso, su aplicación puede seguir funcionando, pero podría tener sentido salir por completo de ella. Sería bueno para el usuario (libera memoria y otros recursos que no necesitan ser utilizados), y bueno para la estabilidad de la aplicación (es decir, asegurarse de que la aplicación se reinicie periódicamente cuando sea posible es una red de seguridad contra las fugas de memoria y otros problemas de memoria baja).

Esto podría (aunque probablemente no debería, ver a continuación :-) lograrse con algo como:

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

Dado que la aplicación entonces saldría del fondo no se verá mal para el usuario, y no se parecerá a un bloqueo, siempre que la interfaz de usuario se restaure el siguiente es hora de que ejecuten la aplicación. En otras palabras, para el usuario no se vería diferente a una terminación iniciada por el sistema de la aplicación cuando la aplicación está en segundo plano.

Aún así, sería preferible usar un enfoque más estándar para que el sistema sepa que la aplicación se puede terminar. Por ejemplo, en este caso, al asegurarse de que el GPS no está en uso al detener la solicitud de actualizaciones de ubicación, incluida la desactivación de mostrar la ubicación actual en una vista de mapa si está presente. De esa manera el sistema tomará cuidado de terminar la aplicación unos minutos (es decir, [[UIApplication sharedApplication] backgroundTimeRemaining]) después de que la aplicación entre en segundo plano. Esto obtendría todos los mismos beneficios sin tener que usar código para terminar la aplicación.

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

Y por supuesto, usar exit(0) nunca sería apropiado para la aplicación de producción promedio que se ejecuta en primer plano, según otras respuestas que hacen referencia a http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html

 0
Author: frankodwyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-12 16:55:35
[[UIApplication sharedApplication] terminateWithSuccess];

Funcionó bien y llama automáticamente

- (void)applicationWillTerminateUIApplication *)application delegate.

Para eliminar la advertencia de tiempo de compilación, agregue este código

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 
 0
Author: shiva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-05 13:44:35