Pregunta

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

¿Fue útil?

Solución

¿Ha tratado exit(0)?

Como alternativa, [[NSThread mainThread] exit], aunque no he probado que parece la solución más adecuada.

Otros consejos

En el iPhone no existe el concepto de dejar de una aplicación. La única acción que debe causar una aplicación para dejar de fumar está tocando el botón Inicio en el teléfono, y eso no es algo que los desarrolladores tienen acceso a.

Según Apple, la aplicación debe no finaliza por sí sólo. Ya que el usuario no pulsa el botón de inicio, el retorno a la pantalla de inicio le da al usuario la impresión de que su aplicación se estrelló. Este es un comportamiento confuso, no estándar y debe ser evitado.

exit (0) aparece a un usuario como accidentes, por lo que muestra un mensaje de confirmación al usuario. Después de la confirmación de suspensión (botón de inicio de prensa mediante programación) y esperar 2 segundos, mientras que la aplicación va de fondo con la animación luego salir detrás de 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);
    }
}

No es realmente una manera de salir del programa, sino una manera de forzar a la gente a dejar de fumar.

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

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

Q:¿Cómo puedo programación dejar mi aplicación de iOS?

No hay ninguna API proporcionada por la gracia de terminación de una aplicación de iOS.

En iOS, el usuario presiona el botón de Inicio para cerrar las aplicaciones.En caso de que su aplicación tiene las condiciones en las que se puede proporcionar con su función, el enfoque recomendado es para mostrar una alerta para el usuario que indica la naturaleza del problema y las posibles acciones que el usuario puede tomar — encender WiFi, habilitar los Servicios de Ubicación, etc.Permitir al usuario terminar la aplicación, a su propia discreción.

ADVERTENCIA: No llame a la exit la función.Las aplicaciones de llamadas exit aparecerá al usuario se estrelló, en lugar de realizar una terminación correcta y animar de nuevo a la pantalla de Inicio.

Además, los datos no pueden ser salvados, porque -applicationWillTerminate: y similares UIApplicationDelegate métodos no será invocada si usted llame a la salida.

Si durante el desarrollo o pruebas de que es necesario terminar con su aplicación, el abort la función, o assert macro se recomienda

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

Añadir UIApplicationExitsOnSuspend propiedad en application-info.plist a true.

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

  • usando la interfaz privada: [UIApplication sharedApplication] hará que la aplicación que parece que se estrellara, pero va a llamar - (void)applicationWillTerminate:(UIApplication *)application antes de hacerlo;
  • usando exit(0); También habrá fin a la aplicación, pero se verá "normal" (iconos del trampolín aparece como espera, con el zoom a cabo efecto), pero no va a llamar a la <=> método delegado.

Mi consejo:

  1. llamada manualmente el <=> en el delegado.
  2. Llamar <=>.

Su ApplicationDelegate recibe una notificación de dejar de fumar intencionada por parte del usuario:

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

Cuando llego a esta notificación acabo de llamar

        exit(0);

Lo que hace todo el trabajo. Y lo mejor es, es la intención useres dejar de fumar, por lo que esto no debería ser un problema llamándolo allí.

En mi Audio-App había que salir de la aplicación después de que la gente se sincronizan sus dispositivos mientras la música seguía tocando. Tan pronto como la sincronización se ha completado recibo una notificación. Pero salir de la aplicación justo después de que en realidad se vería como un accidente.

Así que en lugar de eso establecer un indicador para dejar de fumar realmente la aplicación en la siguiente acción backgrounding. Que es aceptable para la actualización de la aplicación después de una sincronización.

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

"Por desgracia, no se puede añadir a la App Store porque está utilizando una API privada uso de las API no públicos, que como se indica en el Programa de Desarrolladores de la sección Contrato de licencia iPhone 3.3.1 está prohibido:.

"3.3.1 Las solicitudes sólo podrán utilizar las API documentadas en la forma prescrita por Apple y no debe usar o llamar a cualquier API privadas."

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

Apple dice:

"Advertencia:.. No llame a la función de salida aplicaciones que invocan a la salida aparecerá al usuario que se estrelló, en lugar de realizar una terminación elegante y animando de nuevo a la pantalla de inicio"

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

Esto ha conseguido una buena respuesta, pero decidido ampliar un poco:

Usted no puede obtener su solicitud aceptada al AppStore sin leer bien Human Interface Guidelines de Apple iOS. (Que retienen el derecho de rechazar por hacer lo en contra de ellos) La sección "No abandone programación" http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices.html es una guía exacta de cómo se debe tratar en este caso.

Si alguna vez tiene un problema con la plataforma de Apple no se puede encontrar fácilmente una solución para consultar HIG. Es posible que Apple simplemente no quiere que lo hagas y por lo general (no estoy de Apple así que no puedo garantizar siempre) permite decirlo en su documentación.

No podemos dejar de aplicación usando exit(0), abort() funciones, ya que Apple no recomendamos el uso de estas funciones. Aunque puede utilizar estas funciones para el desarrollo o el propósito de prueba.

  

Si durante el desarrollo o de prueba es necesario interrumpir el   se recomienda la aplicación, la función de anulación, o afirmar macro

Q y A hilo para obtener más información .

A medida que el uso de esta función de crear la impresión, como la aplicación se bloquea. Así que me dio algunos indicios de que podemos mostrar Alerta con el mensaje de terminación para el usuario consciente de cerrar la aplicación, debido a la falta de disponibilidad de determinadas funciones.

Pero iOS Human Interface Guidelines para Inicio y detención de Aplicación , lo que sugiere que No utilice nunca Salir o Cerrar el botón para terminar la aplicación. En lugar de que ellos están sugiriendo para mostrar el mensaje adecuado para explicar la situación.

  

Una aplicación para iOS no muestra una opción Cerrar o Salir. La gente deja de usar una   aplicación al cambiar a otra aplicación, volver a la pantalla de inicio, o poner   sus dispositivos en modo de suspensión.

     

Nunca salir de una aplicación de iOS mediante programación. La gente tiende a interpretar este   como un accidente. Si hay algo que impide su aplicación funcione como   la intención, es necesario indicar a los usuarios acerca de la situación y explicar lo   que pueden hacer al respecto.

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

Después de su aplicación acaba, el iPhone OS limpiará automáticamente cualquier cosa que su aplicación queda atrás, por lo que liberar toda la memoria manualmente solo puede aumentar la cantidad de tiempo que tarda su aplicación para salir.

Hm, es posible que 'tiene que' salir de la aplicación si, por ejemplo, su aplicación requiere una conexión a Internet. Se 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); 
}
- (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);
  }
}

He utilizado el [[NSMutableArray nuevo] addObject: nil] enfoque mencionado anteriormente para forzar el cierre (bloqueo) la aplicación sin hacer una salida de testigo (0) llamada a la función

.

¿Por qué? Debido a que mi aplicación utiliza los clavos certificado en todas las llamadas API de red para evitar ataques man-in-the-middle. Estos incluyen la inicialización llama mi aplicación financiera hace en el inicio.

Si la autenticación de certificados falla, todos los de mi llama inicialización de error y dejar mi aplicación en un estado indeterminado. Permitiendo al usuario ir a casa y luego de vuelta a la aplicación no ayuda, ya que a menos que la aplicación ha sido purgado por el sistema operativo que todavía no inicializado y poco fiables.

Por lo tanto, en éste caso, se considera que es mejor para hacer estallar una alerta informando al usuario que la aplicación está funcionando en un entorno inseguro y luego, cuando llegan a "Cerrar", la fuerza de salir de la aplicación usando el método antes mencionado.

[[UIApplication sharedApplication] terminateWithSuccess];

Se trabajó muy bien y pide automáticamente

- (void)applicationWillTerminateUIApplication *)application delegate.

para eliminar la advertencia tiempo de compilación añadir este código

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

El usuario debe decidir cuando un salidas de aplicaciones. No creo que es una buena interacción con el usuario cuando una aplicación se cierra. Por lo tanto no hay ninguna API agradable para él, sólo el botón de inicio tiene uno.

Si hay un error: implementarlo bien o para notificar al usuario. Si tiene que haber un reinicio:. Implementar mejor de Notificar al usuario

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

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

Lo hice ayudante, sin embargo, que no use cosas privadas:

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

Sin embargo, todavía no significaba para la producción en mi caso. Es para probar los reportajes de choque, o para el reinicio rápido después de un restablecimiento de Datos Básicos. Acaba de hacer a lo seguro no debe ser rechazada si la función deja en el código de producción.

Swift 4.2 (o más)

biblioteca llamada Darvin se puede utilizar.

import Darwin

exit(0) // Here you go

Nota: Esto no se recomanded en aplicaciones de iOS.

Hacer esto te llevará registro de bloqueo.

No debe llamar directamente a la función exit(0) ya que salir de la aplicación de inmediato y se verá como se estrelló su aplicación. Así que es mejor para mostrar a los usuarios una alerta de confirmación y para 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()
     }
}

Salir de una aplicación de otra manera

Lo hice ayudante, sin embargo, que no use cosas privadas:

Salir (0);

Puede ser apropiado para salir de una aplicación, si se trata de una larga vida de la aplicación, que también se ejecuta en segundo plano, por ejemplo, para obtener las actualizaciones de ubicación (mediante el las actualizaciones de ubicación antecedentes de la capacidad de para que).

Por ejemplo, digamos que el usuario cierra la sesión de su basados en la ubicación de la aplicación, y empuja la aplicación para el fondo con el botón de inicio.En este caso, su aplicación puede seguir funcionando, pero podría tener sentido para salir de ella.Sería bueno para el usuario (libera de la memoria y otros recursos que no deben ser utilizados), y bueno para la estabilidad de la aplicación (es decir,asegurarse de que la aplicación periódicamente se reinicia cuando sea posible es una red de seguridad contra fugas de memoria y otros de baja de los problemas de memoria).

Esto podría (aunque probablemente no debería, ver más abajo :-) lograrse con algo como:

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

Desde la aplicación, a continuación, salir de de los antecedentes no será malo para el usuario, y no se parecen a un accidente, proporcionando la interfaz de usuario se restablecerán la próxima vez que ejecute la aplicación.En otras palabras, para que el usuario no se verá diferente a un sistema de iniciarse la terminación de la aplicación cuando la aplicación está en segundo plano.

Aún así, sería preferible utilizar un enfoque estándar para informar al sistema de que la aplicación puede ser terminado.Por ejemplo, en este caso, asegurarse de que el GPS no está en uso por la detención de solicitar actualizaciones de ubicación, incluyendo la desactivación de mostrar la ubicación actual en un mapa, si está presente.De esa manera el sistema se encargará de poner fin a la aplicación de un par de minutos (es decir, [[UIApplication sharedApplication] backgroundTimeRemaining]) después de la aplicación entra en el fondo.Esto podría obtener 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, el uso de exit(0) nunca sería apropiado para el promedio de producción de la aplicación que se ejecuta en primer plano, como por otras respuestas que hacen referencia a http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top