¿Forma correcta de salir de la aplicación para iPhone?

277

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

user21293
fuente
34
Solo hay una manera correcta: botón de inicio ...
berilio
55
La única situación que puedo imaginar es que alguien considere abandonar la programación mediante el siguiente escenario: la aplicación se inicia, muestra los términos de uso, se niega a aceptar y luego cierra la aplicación. Esto es algo que las marcas a veces presionan al desarrollador para que haga. Pero está mal.
Daniel
66
@Daniel Normalmente, usted coloca su descargo de responsabilidad / términos de uso (EULA) en iTunes Connect cuando carga la aplicación. Si el usuario descarga su aplicación, significa que ha aceptado su EULA
Paul de Lange
8
Hay razones completamente válidas para tener que forzar el cierre de una aplicación ios. Mi caso es que estoy distribuyendo versiones beta previas al lanzamiento de mi aplicación. Las versiones beta abren todos los IAP de forma gratuita. Estos tienen un límite de tiempo y deben expirar después de algunas semanas. Así que estoy usando la respuesta a continuación para eliminar la aplicación después de que termine el período beta. Eliminaré esto en la versión EN VIVO. ¡Pero aún así la respuesta me ayudó y es correcta!
badweasel
55
Una razón válida para salir de una aplicación es si es una aplicación de ejecución en segundo plano de larga duración, y la aplicación entra en un estado en el que ya no necesita ejecutarse en segundo plano. Por ejemplo, el usuario cierra sesión. En este caso, tendría sentido salir para que la próxima vez que la aplicación se inicie, comience limpiamente. Esto actuaría como una red de seguridad contra pérdidas de memoria, entre otras razones. Tenga en cuenta que, en este caso, la aplicación saldría del fondo , por lo que el usuario no notaría nada malo.
frankodwyer

Respuestas:

217

¿Lo has intentado exit(0)?

Alternativamente, [[NSThread mainThread] exit]aunque no lo he intentado, parece ser la solución más adecuada.

Brett
fuente
85
Como esto es un no-no de Apple (puede hacer que su aplicación sea rechazada en la tienda de aplicaciones por una interfaz no estándar), considere la respuesta de agosto como "la correcta". Para su información, esta respuesta (Brett's) es correcta para TODOS los programas de C, y NSThread para todos los programas de Cocoa.
Olie
21
En Tech Q&A QA1561, Apple desaconseja el uso de la salida, ya que hace que la aplicación parezca haberse bloqueado. developer.apple.com/iphone/library/qa/qa2008/qa1561.html
programa
8
[[NSThread mainThread] exit] hace que su aplicación se bloquee, porque exit no es un método de instancia. exit (0) enviará la aplicación a segundo plano en iOS 4. Llamar a exit (0) nuevamente la bloqueará. Al menos en el simulador.
user123444555621
10
Entiendo por qué tanta gente desaconseja esto, pero ¿qué tal si nos da algo de crédito a los desarrolladores? Todos somos adultos aquí, y queremos saber acerca de esta característica. Lo encuentro muy útil para las compilaciones de control de calidad internas y, cuando lo busqué por primera vez, me alegró ver esta respuesta "incorrecta".
evanflash
77
@ Kevin "No hagas eso" nunca es la respuesta correcta. Si lo desea, brinde advertencias y exenciones de responsabilidad, pero la única respuesta correcta a "cómo hago esto" es "así es como lo hago". Si estoy buscando cómo hacer algo (tal vez quiero forzarlo a salir mientras se depura), la gente declara con justicia "¡no lo haces!" e intentar enterrar la respuesta que necesito es una pérdida de tiempo. Sin embargo, muchas personas pueden tener malas razones para hacer algo, la respuesta correcta de StackOverflow es la que responde a la pregunta, porque las personas con buenas razones también buscarán su camino.
Glenn Maynard
274

En el iPhone no existe el concepto de salir de una aplicación. La única acción que debería hacer que una aplicación se cierre es tocar el botón Inicio en el teléfono, y eso no es algo a lo que los desarrolladores tengan acceso.

Según Apple, su aplicación no debe finalizar por sí sola. Dado que el usuario no presionó el botón de Inicio, cualquier regreso a la pantalla de Inicio le da la impresión de que su aplicación se bloqueó. Este es un comportamiento confuso, no estándar y debe evitarse.

agosto
fuente
13
Como dije, es un comportamiento no estándar y debe evitarse. Las aplicaciones de iPhone no son aplicaciones de escritorio. No los trates como tal.
Agosto
8
Puedo entender Manzanas opinión, pero tengo una situación similar, mi aplicación requiere acceso a Internet, si no se dispone de ellos deben ser capaces de salir de la aplicación en lugar de sólo tener un mensaje de error
Anthony principal
22
Tenemos aplicaciones que ayudan a las personas a dormir. Quieren que la aplicación finalice después de un período establecido para reducir el consumo de batería. Creo que este caso es aceptable, ya que es de esperar que el usuario esté dormido y no pueda salir de la aplicación manualmente.
JamesSugrue
36
Todavía no estoy de acuerdo. Cuando se despiertan, la aplicación se ha "ido" dejando al usuario preguntándose qué pasó. En su lugar, configure un temporizador en su aplicación, luego, cuando se acabe el tiempo, inactive la aplicación, sin actividad. Una aplicación que no hace absolutamente nada no agota la batería. El Springboard también es una aplicación, no se cierra solo para ahorrar energía. En cambio, simplemente espera la entrada del usuario.
Agosto
8
Esto realmente no responde la pregunta. Es 100% preciso, pero creo que idealmente habría sido un comentario sobre la pregunta del OP o sobre la respuesta aceptada.
Ben Zotto
49

La salida (0) aparece ante un usuario como bloqueos, por lo que debe mostrar un mensaje de confirmación al usuario Después de la confirmación, suspenda (presione el botón de inicio mediante programación) y espere 2 segundos mientras la aplicación pasa a segundo plano con animación y luego salga 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);
    }
}
MaxEcho
fuente
1
¿Apple aprobará esta "salida (0)"? Debido a que algunas personas dicen que Apple rechazará su aplicación cuando use la salida 0.
Gajendra K Chauhan
2
@GajendraKChauhan exit(0)no importa. El punto es que su aplicación tiene "comportamiento de abandono". El comportamiento de abandono en sí está prohibido en AppStore, excepto en algunas aplicaciones creadas por terceros muy importantes. Además, imitar el comportamiento del botón de inicio también está sujeto a ser rechazado.
Eonil
41

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

P: ¿Cómo salgo programáticamente de mi aplicación iOS?

No se proporciona una API para finalizar con gracia una aplicación de 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 que indique la naturaleza del problema y las posibles acciones que el usuario podría tomar: encender WiFi, habilitar los servicios de ubicación, etc. Permita que el usuario finalice la aplicación a su propia discreción.

ADVERTENCIA: no llame a la exitfunción. Las aplicaciones que llaman exitparecerán que el usuario se ha bloqueado, en lugar de realizar una finalización elegante y volver a la pantalla de inicio.

Además, es posible que los datos no se guarden porque no se invocarán métodos -applicationWillTerminate:similares UIApplicationDelegatesi llama a exit.

Si durante el desarrollo o las pruebas es necesario finalizar su aplicación, se recomienda la abortfunción o assertmacro

Wagh
fuente
2
Acabo de agregar un AlertView sin botones para cumplir con esto. Fácil.
Schultz9999
Gran respuesta, simplemente trabajé con la salida (0) y no sabía que pertenece a la API privada
Alex Cio
39

No es realmente una forma de abandonar el programa, sino una forma de obligar a las personas a renunciar.

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

fuente
2
Al menos en el simulador, si hace esto, la alerta seguirá allí cuando el usuario vuelva a abrir la aplicación. Por lo tanto, sugiero darles al menos un botón.
Cheshirekow
Use la respuesta de Kalyan para que la aplicación se cierre cuando se presiona el botón de inicio.
Timur Kuchkarov
El problema con esto es que en realidad no sale de la aplicación, por lo que cualquier cosa que el desarrollador quiera lograr al salir (desechar la interfaz de usuario no válida / antigua, borrar constantes, etc.) no se realizará a menos que el usuario deslice la aplicación cerrado.
Ben Leggiero
Esto no mata la aplicación.
Dustin
38

Vaya a su info.plist y verifique 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.

Kalyan
fuente
1
Pero el proceso en segundo plano también se descarta.
Gajendra K Chauhan
17

Agregar UIApplicationExitsOnSuspendpropiedad application-info.plista true.

Aman Agarwal
fuente
¿Se puede cambiar esta configuración en tiempo de ejecución? Quiero decir, quiero vivir en segundo plano, excepto cuando mi aplicación ELIGE salir en la próxima suspensión; en ese momento, querré presentar UIApplicationExitsOnSuspend. es posible?
Motti Shneor
13

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

  • usando la interfaz privada: [UIApplication sharedApplication]hará que la aplicación parezca bloqueada, PERO llamará - (void)applicationWillTerminate:(UIApplication *)applicationantes de hacerlo;
  • el uso 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 - (void)applicationWillTerminate:(UIApplication *)applicationmétodo de delegado.

Mi consejo:

  1. Llamar manualmente - (void)applicationWillTerminate:(UIApplication *)applicational delegado.
  2. Llamar exit(0);.
rchampourlier
fuente
Apple dice que no use la salida debido a que "Las aplicaciones que llaman a la salida parecerán que el usuario se ha bloqueado, en lugar de realizar una finalización elegante y volver a la pantalla de inicio" developer.apple.com/library/ios/#qa/qa2008/ qa1561.html
MickyD
8

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

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

Cuando recibo esta notificación solo llamo

        exit(0);

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

En mi aplicación de audio, era necesario cerrar la aplicación después de que las personas sincronizaran su dispositivo mientras la música todavía estaba sonando. Tan pronto como se completa 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 bloqueo.

Entonces, en su lugar, configuré una bandera para REALMENTE salir 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.

L'g
fuente
1
Esta no es una buena solución ya que la aplicación renunciará activa por otros motivos, como una llamada telefónica entrante.
frankodwyer
La solución es agregar un cheque que salga solo si es útil hacerlo. Por ejemplo, si el usuario está en la pantalla de inicio. Entonces está bien incluso si entra una llamada telefónica. Apple no ha rechazado esto desde iOS 2 en mis aplicaciones. stackoverflow.com/a/43906936/712124
gato
6

Mi aplicación ha sido rechazada recientemente porque he usado un método no documentado. Literalmente:

"Desafortunadamente no se puede agregar a la tienda de aplicaciones porque está usando 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 "


fuente
6

Apple dice:

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

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

AGPX
fuente
3
Lo hacen es llamar al botón de Inicio, puede ubicarse en la parte inferior de cualquier iDevice. Por eso, nunca hay necesidad de crear su propio botón para dejar de fumar.
Popeye
4

Esto obtuvo una buena respuesta pero decidió expandirse un poco:

No puede hacer que su aplicación sea aceptada en AppStore sin leer bien las Directrices de interfaz humana iOS de Apple. (se reservan el derecho de rechazarlo por hacer algo en contra de ellos) La sección "No salga programáticamente" http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices. HTML es una guía exacta sobre cómo debe tratar en este caso.

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

nanonyme
fuente
3

Hm, es posible que "tenga que" cerrar la aplicación si, por ejemplo, su aplicación requiere una conexión a Internet. Puede mostrar una alerta y luego hacer algo como esto:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}
Robar
fuente
9
No, no tienes que terminarlo. La aplicación iTunes, por ejemplo, cuando no puede detectar una conexión adecuada, simplemente muestra una pantalla que dice que no están conectados. No se cierra, simplemente informa al usuario de lo que está sucediendo. El usuario se cierra tocando el botón de inicio.
Agosto
1
Sin embargo, la aplicación de la brújula se cierra si no puede funcionar.
Josh Lee el
3

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

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

Encuentre este hilo de preguntas y respuestas de Apple para obtener más información.

A medida que el uso de esta función crea impresión, la aplicación se está bloqueando Así que recibí algunas sugerencias, como que podemos mostrar Alerta con mensaje de finalización al usuario consciente sobre el cierre de la aplicación, debido a la falta de disponibilidad de ciertas funciones.

Pero la directriz de interfaz humana de iOS para iniciar y detener la aplicación sugiere que nunca use el botón Salir o Cerrar para finalizar la aplicación. Más bien que están sugiriendo mostrar un mensaje apropiado para explicar la situación.

Una aplicación iOS nunca muestra una opción Cerrar o Salir. Las personas dejan de usar una aplicación cuando cambian a otra aplicación, regresan a la pantalla de inicio o ponen sus dispositivos en modo de suspensión.

Nunca salga de una aplicación de iOS mediante programación. La gente tiende a interpretar esto como un accidente. Si algo impide que su aplicación funcione según lo previsto, debe informar a los usuarios sobre la situación y explicar qué pueden hacer al respecto.

technerd
fuente
2

Además de lo anterior, buena respuesta que solo quería agregar, piensa en limpiar tu memoria.

Después de que su aplicación se cierre, el sistema operativo iPhone limpiará automáticamente todo lo que su aplicación dejó atrás, por lo que liberar toda la memoria manualmente puede aumentar la cantidad de tiempo que le toma a su aplicación salir.

Chris Jefferson
fuente
Modifique su respuesta en el escenario actual de IOS4.0 y 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
fuente
1

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

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

Si la autenticación del certificado falla, todas mis llamadas de inicialización tienen un error y dejan mi aplicación en un estado indeterminado. Dejar que el usuario vaya a casa 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 se ha inicializado y no es confiable.

Entonces, en este caso, consideramos que es mejor 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 usando el método mencionado anteriormente.

Michael Long
fuente
No puedo ver qué le impide mostrar una sola alerta mundana de pantalla completa, diciéndole al usuario que la aplicación no es utilizable por esas razones de "fijación de certificados", y eso es todo. El usuario eventualmente cerrará la aplicación. Puede que no lo sepas, pero iOS se reserva el derecho de eliminar tu proceso (manteniendo su estado) y restaurarlo más tarde, y el "ciclo de vida" de la aplicación iOS no está realmente en tus manos. Su bloqueo: es simplemente un bloqueo, y el sistema operativo puede optar por revivir la aplicación de todos modos.
Motti Shneor
Wow, post de tres años. De todos modos, la nueva arquitectura de la aplicación hace más o menos eso, con un botón de reintento que reintenta la API y deja caer la pantalla de bloqueo o los devuelve a la pantalla de bloqueo con un nuevo error.
Michael Long
La antigua estructura de la aplicación prácticamente no permitía ninguna buena manera de volver a intentar las llamadas API de inicio y la aplicación estaba en un estado inconsistente sin ellas. Podríamos haber usado una pantalla de bloqueo permanente, pero eso requería que el usuario cerrara la aplicación por sí mismo y se decidió que no todos los usuarios sabían CÓMO hacer doble clic y forzar el cierre de las aplicaciones. Más fácil hoy, pero bastante escondido hace tres años.
Michael Long
1
[[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 
shiva
fuente
55
Este es un método privado, Diego Mercado ha explicado anteriormente que su aplicación fue rechazada, entonces, ¿por qué correr ese riesgo?
RVN
Usar API privada hará que Apple rechace la aplicación.
ZYiOS
2
para aplicaciones empresariales: esta puede ser una solución.
user1140780
- (IBAction) exitApp: (id) remitente {SEL selector = NSSelectorFromString (@ "terminateWithSuccess"); [self performSelector: selector withObject: [UIApplication sharedApplication]]; }
unom
@unmircea ¿eso pasó la revisión?
Awesome-o
1

No debe llamar directamente a la función, exit(0)ya que cerrará la aplicación inmediatamente y parecerá que su aplicación está bloqueada. Por lo tanto, es mejor mostrar a los usuarios una alerta de confirmación y dejar que lo hagan ellos mismos.

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

Uso:

self.askForQuit { (canQuit) in
     if canQuit {
         self.quit()
     }
}
El Tigre
fuente
0

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

Si hay un error: impleméntelo mejor o notifique al usuario. Si tiene que reiniciarse: impleméntelo 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 notificarlo. Y dado que hay un botón de inicio para la interacción del usuario, Apple afirma que no debería haber 2 cosas para la misma función (salir de una aplicación).

Binario
fuente
0

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

Sin embargo, hice este ayudante 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 fallas o para reiniciar rápidamente después de un reinicio de Core Data. Solo aseguré que no se rechazara si la función quedaba en el código de producción.

Geri Borbás
fuente
0

Swift 4.2 (o anterior)

DarvinSe puede usar la biblioteca llamada .

import Darwin

exit(0) // Here you go

NB: esto no se recomienda en aplicaciones iOS.

Hacer esto te dará un registro de bloqueo.

Saranjith
fuente
0

En iPadOS 13 ahora puede cerrar todas las sesiones de escena como esta:

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

Esto llamará applicationWillTerminate(_ application: UIApplication)a su delegado de aplicación y terminará la aplicación al final.

Pero cuidado con dos cosas:

Más información sobre escenas en iOS / iPadOS 13: https://developer.apple.com/documentation/uikit/app_and_environment/scenes

Klaas
fuente
-1

Salir de una aplicación de otra manera

Sin embargo, hice este ayudante que no usa cosas privadas:

Salida (0);

iOS.j
fuente
-1

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 fondo de 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 empuja la aplicación a un segundo plano con el botón de inicio. En este caso, su aplicación puede seguir ejecutándose, pero podría tener sentido salir por completo. Sería bueno para el usuario (libera memoria y otros recursos que no es necesario usar), 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 pérdidas de memoria y otra poca memoria) cuestiones).

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 saldría del fondo , el usuario no se verá mal y no se parecerá a un bloqueo, siempre que la interfaz de usuario se restablezca la próxima vez que ejecute la aplicación. En otras palabras, para el usuario no se vería diferente a la terminación de la aplicación iniciada por el sistema cuando la aplicación está en segundo plano.

Aún así, sería preferible utilizar un enfoque más estándar para que el sistema sepa que la aplicación se puede finalizar. Por ejemplo, en este caso, al asegurarse de que el GPS no esté en uso, deje de solicitar 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 se encargará de finalizar la aplicación unos minutos (es decir [[UIApplication sharedApplication] backgroundTimeRemaining]) después de que la aplicación ingrese al fondo. Esto obtendría los mismos beneficios sin tener que usar el código para finalizar 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, el uso 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

frankodwyer
fuente