otros - liberar espacio en iphone 6
¿La forma correcta de salir de la aplicación de iPhone? (22)
Estoy programando una aplicación para iPhone, y debo forzarla a salir debido a ciertas acciones del usuario. Después de limpiar la memoria asignada a la aplicación, ¿cuál es el método apropiado para llamar para terminar la aplicación?
Además de lo anterior, bueno, responda que solo quería agregar, piense en limpiar su memoria.
Después de que se cierre la aplicación, el sistema operativo del iPhone limpiará automáticamente todo lo que la aplicación haya dejado atrás, por lo que liberar toda la memoria manualmente puede aumentar la cantidad de tiempo que demora su aplicación en salir.
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 terminación elegante y volver a animar 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 se cerrará ahora", no parece haberse bloqueado. Apple debería proporcionar una forma válida de salir de una aplicación (no exit (0)).
Consulte las preguntas y respuestas aquí: https://developer.apple.com/library/content/qa/qa1561/_index.html
P: ¿Cómo cierro programáticamente mi aplicación iOS?
No se proporciona una API para terminar con gracia una aplicación iOS.
En iOS, el usuario presiona el botón Inicio para cerrar aplicaciones. Si su aplicación tiene condiciones en las que no puede cumplir su 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: activar 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 función de
exit
. Las aplicaciones que llaman a laexit
aparecerán ante el usuario como bloqueado, en lugar de realizar una terminación elegante y animar de nuevo a la pantalla de inicio.Además, es posible que los datos no se guarden, porque no se invocarán los métodos
UIApplicationDelegate
-applicationWillTerminate:
yUIApplicationDelegate
si llama a exit.Si durante el desarrollo o la prueba es necesario terminar su aplicación, se recomienda la función de anulación o
assert
macro
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á- (void)applicationWillTerminate:(UIApplication *)application
antes de hacerlo; - utilizando
exit(0);
también terminará la aplicación, pero se verá "normal" (los íconos del trampolín aparecen como se esperaba, con el efecto de- (void)applicationWillTerminate:(UIApplication *)application
), PERO no llamará el método de delegado de la- (void)applicationWillTerminate:(UIApplication *)application
.
Mi consejo:
- Manualmente llame a la aplicación
- (void)applicationWillTerminate:(UIApplication *)application
en el delegado. -
exit(0);
llamadaexit(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 API agradable para ella, 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 lo notifique. Y como Apple tiene un botón de inicio para la interacción con el usuario, no debería haber 2 cosas para la misma función (salir de una aplicación).
En el iPhone no hay 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 de Inicio en el teléfono, y eso no es algo a lo que los desarrolladores tengan acceso.
Según Apple, su aplicación no debería terminar por sí sola. Dado que el usuario no presionó el botón de Inicio, cualquier retorno a la pantalla de Inicio le da la impresión de que su aplicación se bloqueó. Esto es confuso, comportamiento no estándar y debe evitarse.
Esto ha recibido una buena respuesta, pero decidió expandirse un poco:
No puede hacer que su aplicación sea aceptada en AppStore sin leer bien las Pautas de la interfaz humana de iOS de Apple. (se reservan el derecho de rechazarlo por hacer algo en contra de ellos) La sección "No renunciar programáticamente" http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices.html es una guía exacta sobre cómo debe tratarse en este caso.
Si alguna vez tiene un problema con la plataforma Apple, no puede encontrar una solución fácilmente, consulte a HIG. Es posible que Apple simplemente no quiera que lo hagas y generalmente (yo no soy Apple, así que no puedo garantizarte siempre) lo dicen en su documentación.
Hm, puede ''tener que'' salir de la aplicación si, por ejemplo, su aplicación requiere una conexión a Internet. 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);
}
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, tal 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 las 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 "
No es realmente una forma de abandonar el programa, sino una forma de obligar a las personas a que lo abandonen.
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];
No podemos salir de la aplicación usando las funciones exit(0)
, abort()
, ya que Apple no recomienda el uso de estas funciones. Aunque puede utilizar estas funciones para fines de desarrollo o prueba.
Si durante el desarrollo o la prueba es necesario terminar su aplicación, se recomienda la función de anulación o afirmación de macro
Por favor, encuentre este hilo de Q&A Apple para obtener más información.
Como el uso de esta función, crear una impresión como la aplicación está fallando. Así que recibí una sugerencia, como que podemos mostrar Alert con un mensaje de finalización para que un usuario conciente 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 , sugiriendo que nunca use el botón Salir o Cerrar para terminar la aplicación. En lugar de eso, están sugiriendo mostrar un mensaje adecuado para explicar la situación.
Una aplicación de 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 salgas de una aplicación de iOS programáticamente. La gente tiende a interpretar esto como un choque. Si algo impide que su aplicación funcione correctamente, debe informar a los usuarios sobre la situación y explicar qué pueden hacer al respecto.
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 (usando la capacidad de fondo de las actualizaciones de ubicación para eso).
Por ejemplo, supongamos que el usuario cierra sesión en su aplicación basada en 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 funcionando, pero podría tener sentido salir por completo. 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 otras memorias de poca memoria). cuestiones).
Esto podría (aunque probablemente no debería, ver más abajo :-) se puede lograr con algo como:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
if (/* logged out */) {
exit(0);
} else {
// normal handling.
}
}
Dado que la aplicación saldrá del fondo , no se verá mal para el usuario y no parecerá una falla, siempre que la interfaz de usuario se restaure la próxima vez que se ejecute la aplicación. En otras palabras, para el usuario no se vería diferente a la terminación iniciada por el sistema de la aplicación cuando ésta se encuentra 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, asegurándose de que el GPS no esté en uso al dejar de solicitar actualizaciones de ubicación, incluido desactivar 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 en segundo plano. Esto obtendría los mismos beneficios sin tener que usar el 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 developer.apple.com/iphone/library/qa/qa2008/qa1561.html
Salir de una aplicación de otra manera
Hice este ayudante, sin embargo, que no usa cosas privadas:
Salida (0);
Salir de una aplicación que no sea el botón de inicio es realmente un enfoque que no es para iOS .
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 Core Data. Simplemente lo hizo seguro para no ser rechazado si la función queda en el código de producción.
Su ApplicationDelegate recibe una notificación de renuncia 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 de dejar de fumar, por lo que esto no debería ser un problema al llamarlo allí.
En mi aplicación de audio, era necesario salir de la aplicación después de que las personas sincronizaban su dispositivo mientras la música seguía reproduciéndose. Tan pronto como se completa la sincronización recibo una notificación. Pero abandonar la aplicación justo después de eso realmente parecería un bloqueo.
Entonces, en lugar de eso, establezco una marca para REALMENTE salir de la aplicación en la siguiente acción de fondo. Lo que está bien para actualizar la aplicación después de una sincronización.
Utilicé el enfoque [[NSMutableArray new] addObject: nil] mencionado anteriormente para forzar el cierre (bloqueo) de la aplicación sin realizar una llamada de función de salida (0).
¿Por qué? Debido a que mi aplicación utiliza el anclaje de certificados en todas las llamadas a la API de la red para evitar ataques de intermediarios. Estos incluyen las llamadas de inicialización que hace mi aplicación financiera en el inicio.
Si la autenticación del certificado falla, todas mis llamadas de inicialización fallan y dejan mi aplicación en un estado indeterminado. Dejar que el usuario se vaya a casa y luego volver a la aplicación no ayuda, ya que, a menos que la aplicación haya sido borrada por el sistema operativo, todavía no está inicializada y no es confiable.
Entonces, en este caso, consideramos que es mejor hacer una alerta para informar al usuario de que la aplicación está funcionando en un entorno inseguro y luego, cuando presionan "Cerrar", forzar la salida de la aplicación utilizando el método mencionado anteriormente.
Vaya a su info.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 sale por completo.
agregue la propiedad UIApplicationExitsOnSuspend en application-info.plist a true
exit (0) aparece a un usuario cuando se bloquea, así que muestre un mensaje de confirmación al usuario. Después de la confirmación, suspenda (presione el botón de inicio programáticamente) y espere 2 segundos mientras la aplicación está en 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);
}
}
¿Has intentado exit(0)
?
Alternativamente, [[NSThread mainThread] exit]
, aunque no he intentado que parezca la solución más apropiada.
- (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);
}
}
[[UIApplication sharedApplication] terminateWithSuccess];
Funcionó bien y automáticamente llama.
- (void)applicationWillTerminateUIApplication *)application delegate.
para eliminar el tiempo de compilación de advertencia añadir este código
@interface UIApplication(MyExtras)
- (void)terminateWithSuccess;
@end