transferir - iOS: mantener una aplicación funcionando como un servicio
Básicamente, no existe una aplicación o funcionalidad tipo servicio en iOS. Incluso las aplicaciones de "fondo" (UIBackgroundMode) no pueden ejecutarse libremente y sin restricciones como un servicio o daemon, etc. en otros sistemas operativos.
Aquí está la situación con respecto a la ejecución de fondo y notificaciones y temporizadores, etc.
1) Una aplicación no se puede ejecutar en segundo plano a menos que:
a) solicita tiempo extra del SO para hacerlo. Esto se hace usando beginBackgroundTaskWithExpirationHandler. Apple no especifica (intencionalmente) cuánto tiempo dura este tiempo extra, sin embargo, en la práctica es de alrededor de 10 minutos.
b) una aplicación tiene un modo de fondo, los modos son: voip, audio, ubicación, newstand. Incluso si tiene uno de estos tipos, una aplicación no se puede ejecutar sin restricciones. El resto de esta discusión asume que la aplicación no tiene un modo de fondo. Si intentas utilizar uno de estos modos en segundo plano para permitir que tu aplicación se ejecute en segundo plano pero tu aplicación no hace un uso legítimo de la funcionalidad específica, entonces tu aplicación será rechazada al enviarla a la tienda de aplicaciones (es decir, tener un UIBackgroundMode DEBE ser: una aplicación de voip, NECESIDAD de tener actualizaciones continuas de ubicación, la capacidad de reproducir audio en segundo plano de forma continua es una característica fundamental, o una aplicación nueva).
2) Cuando se suspende una aplicación, no puede hacer NADA para despertarse directamente. No puede haber programado previamente un NSTimer, no puede hacer uso de algo como performSelector: afterDelay. etc.
La ÚNICA forma en que la aplicación puede activarse nuevamente es si el USUARIO hace algo para activarla. El usuario puede hacer esto a través de lo siguiente:
a) Inicie la aplicación directamente desde su icono
b) Inicie la aplicación en respuesta a una notificación local que la aplicación programó previamente mientras estaba activa.
c) Inicie la aplicación en respuesta a una notificación remota enviada por un servidor.
d) Algunos otros: como el lanzamiento de URL si la aplicación está registrada para tratar el lanzamiento a través de una url; o si está registrado para ser capaz de tratar con un cierto tipo de contenido.
Si una aplicación está en primer plano cuando se activa una notificación local / remota, la aplicación la recibe directamente.
Si la aplicación no está actualmente en primer plano cuando se activa una notificación local / remota, entonces la aplicación NO la recibe. ¡No hay código que se ejecuta cuando se activa la notificación!
Solo SI el usuario selecciona la notificación se activará la aplicación y se podrá ejecutar.
Tenga en cuenta que el usuario puede deshabilitar las notificaciones, ya sea para todo el dispositivo o solo para una aplicación específica, en cuyo caso el usuario nunca las verá. Si el dispositivo se apaga cuando se debe disparar una notificación, se pierde.
ACTUALIZACIÓN PARA IOS 7
1) hay algunos modos de fondo nuevos, como la obtención de fondo (sin embargo, el sistema operativo todavía no puede ser despertado de manera determinista)
2) ahora hay una notificación push de fondo
3) el tiempo de beginBackgroundTaskWithExpirationHandler se ha reducido de 10 minutos a aproximadamente 3.
Las cosas cambiaron ahora en iOS7 , ahora es beta .
del portal para desarrolladores de Apple :
Mantén actualizado el contenido de tu aplicación adoptando las nuevas API multitarea en iOS 7. Los nuevos servicios permiten que tu aplicación actualice la información y descargue contenido en segundo plano sin agotar la batería innecesariamente. Las actualizaciones pueden suceder en momentos oportunos y están programadas de forma inteligente según el uso, de modo que su aplicación puede actualizar el contenido en segundo plano justo cuando sus usuarios lo necesiten.
Sí, podemos hacer esto,
Crea un campo privado para rastrear nuestro estado:
UIBackgroundTaskIdentifier _bgTask;
Ahora llama a este método para ejecutar tu aplicación como un servicio
if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])
{
_bgTask = UIBackgroundTaskInvalid;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(doBackground:)
name:UIApplicationDidEnterBackgroundNotification object:nil];
}
Ahora crea un selector-
- (void) doBackground:(NSNotification *)aNotification
{
UIApplication *app = [UIApplication sharedApplication];
if ([app respondsToSelector:@selector(beginBackgroundTaskWithExpirationHandler:)])
{
_bgTask = [app beginBackgroundTaskWithExpirationHandler:^
{
dispatch_async(dispatch_get_main_queue(), ^
{
if (_bgTask != UIBackgroundTaskInvalid)
{
[app endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;
}
});
}];
}
}
Cuando termine su tarea, llame al siguiente código:
UIApplication *app = [UIApplication sharedApplication];
if ([app respondsToSelector:@selector(endBackgroundTask:)])
{
if (_bgTask != UIBackgroundTaskInvalid)
{
[app endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;
}
}