ios - segundo - como cerrar pestañas abiertas en iphone
¿IOS lanzará mi aplicación en segundo plano si fue forzada por el usuario? (6)
En realidad, si necesita probar la obtención de fondos, debe habilitar una opción en el esquema:
Otra forma en que puedes probarlo:
Aquí hay información completa sobre esta nueva función: http://www.objc.io/issue-5/multitasking.html
Estoy activando una búsqueda en segundo plano mediante el uso del indicador de content-available
en una notificación de inserción. Tengo habilitados los UIBackgroundModes
fetch
y remote-notification
UIBackgroundModes
.
Aquí está la implementación que estoy usando en mi AppDelegate.m:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSLog(@"Remote Notification Recieved");
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Looks like i got a notification - fetch thingy";
[application presentLocalNotificationNow:notification];
completionHandler(UIBackgroundFetchResultNewData);
}
Cuando la aplicación se ejecuta en segundo plano, funciona bien. (Se recibe la notificación y la aplicación activó la notificación local "parece que recibí una notificación", como debería hacer el código anterior).
Sin embargo, cuando la aplicación no se está ejecutando y se recibe una notificación de inserción con el indicador de content-available
, la aplicación no se inicia y el método del delegado didRecieveRemoteNotification
nunca se llama.
El video de la WWDC Qué hay de nuevo con la multitarea (# 204 de la WWDC 2013) muestra esto:
Dice que la aplicación se "inicia en segundo plano" cuando se recibe una notificación de inserción con el indicador de content-available
.
¿Por qué mi aplicación no se inicia en segundo plano?
Así que la verdadera pregunta es:
¿IOS realizará tareas en segundo plano después de que el usuario haya forzado el cierre de la aplicación?
Esto podría ayudarte
En la mayoría de los casos, el sistema no vuelve a iniciar las aplicaciones una vez que el usuario las ha forzado a salir. Una excepción son las aplicaciones de ubicación, que en iOS 8 y posteriores se relanzan después de que el usuario las haya forzado a salir. En otros casos, sin embargo, el usuario debe iniciar la aplicación explícitamente o reiniciar el dispositivo antes de que el sistema pueda iniciar la aplicación automáticamente en segundo plano. Cuando la protección con contraseña está habilitada en el dispositivo, el sistema no ejecuta una aplicación en segundo plano antes de que el usuario desbloquee el dispositivo por primera vez.
He estado probando diferentes variantes de esto durante días, y pensé que durante un día tuve que volver a iniciar la aplicación en segundo plano, incluso cuando el usuario intentó matar, pero no puedo replicar ese comportamiento.
Es lamentable que el comportamiento sea bastante diferente al de antes. En iOS 6, si eliminó la aplicación desde los iconos de jiggling, aún se volvería a despertar con los activadores de SLC. Ahora, si matas al deslizar, eso no sucede.
Es un comportamiento diferente, y el usuario, que continuará obteniendo información útil de nuestra aplicación si la hubiera matado en iOS 6, ahora no lo hará.
Tenemos que empujar a nuestros usuarios para que vuelvan a abrir la aplicación ahora si la han borrado y aún estamos esperando algunos de los comportamientos de notificación que les dimos. Me preocupa que esto no sea obvio para los usuarios cuando eliminan una aplicación. Después de todo, pueden estar básicamente limpiando o queriendo reorganizar las aplicaciones que se muestran minimizadas.
La respuesta es SÍ, pero no debe usar ''Obtención en segundo plano'' o ''Notificación remota''. PushKit es la respuesta que deseas.
En resumen, PushKit, el nuevo marco en ios 8, es el nuevo mecanismo de notificación de inserción que puede iniciar silenciosamente su aplicación en segundo plano sin aviso de alerta visual, incluso su aplicación fue eliminada al deslizar el interruptor de la aplicación, sorprendentemente ni siquiera puede verla desde el conmutador de aplicaciones.
Referencia de PushKit de Apple:
El marco PushKit proporciona las clases para que sus aplicaciones iOS reciban envíos de servidores remotos. Los impulsos pueden ser de uno de dos tipos: estándar y VoIP. Los empujes estándar pueden entregar notificaciones al igual que en versiones anteriores de iOS. Los empujes de VoIP proporcionan una funcionalidad adicional además del empuje estándar que se necesita para que las aplicaciones de VoIP realicen un procesamiento a pedido del empuje antes de mostrar una notificación al usuario.
Para implementar esta nueva función, consulte este tutorial: https://zeropush.com/guide/guide-to-pushkit-and-voip - Lo probé en mi dispositivo y funciona como se esperaba.
Puede cambiar la configuración de lanzamiento de su objetivo en "Administrar esquema" para Wait for <app>.app to be launched manually
, lo que le permite depurar estableciendo un punto de interrupción en la application: didReceiveRemoteNotification: fetchCompletionHandler:
y enviando la notificación de inserción para desencadenar el lanzamiento en segundo plano .
No estoy seguro de que solucione el problema, pero puede ayudarlo con la depuración por ahora.
ACTUALIZACIÓN2:
Puede lograrlo utilizando el nuevo marco PushKit, introducido en iOS 8. Aunque PushKit se utiliza para VoIP. Por lo tanto, su uso debe estar relacionado con VoIP, de lo contrario, existe el riesgo de rechazo de la aplicación. (Ver esta respuesta ).
UDPDATE1:
La documentación ha sido aclarada para iOS8 . La documentación se puede leer here . Aquí hay un extracto relevante:
Utilice este método para procesar las notificaciones remotas entrantes para su aplicación. A diferencia de la
application:didReceiveRemoteNotification:
método, que se llama solo cuando su aplicación se ejecuta en primer plano, el sistema llama a este método cuando su aplicación se ejecuta en primer plano o en segundo plano. Además, si habilitó el modo de fondo de notificaciones remotas, el sistema inicia su aplicación (o la despierta del estado suspendido) y la pone en el estado de fondo cuando llega una notificación de inserción. Sin embargo, el sistema no inicia automáticamente su aplicación si el usuario la ha forzado a salir. En esa situación, el usuario debe reiniciar su aplicación o reiniciar el dispositivo antes de que el sistema intente iniciar su aplicación automáticamente de nuevo.
Aunque esto no quedó claro en el video de la WWDC, una búsqueda rápida en los foros de desarrolladores lo demostró:
https://devforums.apple.com/message/873265#873265 (es necesario iniciar sesión)
También tenga en cuenta que si mata su aplicación desde el conmutador de aplicaciones (es decir, al deslizar hacia arriba para eliminar la aplicación), el sistema operativo nunca volverá a iniciar la aplicación, independientemente de la notificación de inserción o la recuperación de fondo. En este caso, el usuario debe reiniciar manualmente la aplicación una vez y, a partir de ese momento, se invocarán las actividades en segundo plano. - pmarcos
Esa publicación fue realizada por un empleado de Apple, así que creo que puedo confiar en que esta información es correcta.
Así que parece que cuando se mata la aplicación desde el conmutador de aplicaciones (al deslizar hacia arriba), la aplicación nunca se iniciará, ni siquiera para capturas de fondo programadas.