ios - background fetch swift 4
Ejecuta la aplicación durante más de 10 minutos en segundo plano (7)
Intento mantener la aplicación de iOS en estado activo durante más de 10 minutos cuando ingresa en estado de fondo.
¿Cómo puedo implementar esto?
Consulte la sección "Ejecución en segundo plano" de iPhoneAppProgrammingGuide . En resumen, tu aplicación debe ser uno de estos tipos:
- Aplicaciones que reproducen contenido audible para el usuario mientras está en segundo plano, como una aplicación de reproductor de música
- Aplicaciones que mantienen a los usuarios informados de su ubicación en todo momento, como una aplicación de navegación
- Aplicaciones compatibles con Voice over Internet Protocol (VoIP)
- Aplicaciones de Kiosco que necesitan descargar y procesar nuevo contenido
- Aplicaciones que reciben actualizaciones regulares de accesorios externos
Y debe agregar Info.plist de la siguiente manera: agregue la clave UIBackgroundModes a su archivo Info.plist y establezca su valor en una matriz que contenga una o más de las siguientes cadenas:
- audio: la aplicación reproduce contenido audible para el usuario mientras está en segundo plano. (Este contenido incluye la transmisión de contenido de audio o video utilizando AirPlay).
- ubicación: la aplicación mantiene informados a los usuarios de su ubicación, incluso mientras se ejecuta en segundo plano.
- VoIP: la aplicación brinda la posibilidad al usuario de hacer llamadas telefónicas usando una conexión a Internet.
- Newsstand-content: la aplicación es una aplicación de Netsstand que descarga y procesa contenido de revistas o periódicos en segundo plano.
- accesorio externo: la aplicación funciona con un accesorio de hardware que necesita entregar actualizaciones en un horario regular a través del marco de Accesorio externo.
- bluetooth-central-La aplicación funciona con un accesorio Bluetooth que necesita entregar actualizaciones en un horario regular a través del marco CoreBluetooth
Tenga en cuenta que parte del proceso de revisión se verificará para asegurarse de que su aplicación haga lo que dice que está haciendo con respecto al procesamiento en segundo plano.
Este código hace que tu aplicación de iOS se ejecute indefinidamente en segundo plano. Copie y pegue los métodos a continuación en un singleton / manager que maneje las tareas que necesita realizar en segundo plano.
// @interface
// Declare Private property
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;
//@end
// ...
// Copy into
//@implementation
- (void)setupBackgrounding {
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appBackgrounding:)
name: UIApplicationDidEnterBackgroundNotification
object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appForegrounding:)
name: UIApplicationWillEnterForegroundNotification
object: nil];
}
- (void)appBackgrounding: (NSNotification *)notification {
[self keepAlive];
}
- (void) keepAlive {
self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
[self keepAlive];
}];
}
- (void)appForegrounding: (NSNotification *)notification {
if (self.backgroundTask != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
}
}
Esto es lo que he hecho usando beginBackgroundTaskWithExpirationHandler .
- Escribe un método que inicie una tarea en segundo plano.
- Dentro de esa tarea de fondo, ejecute un
NSTimer
con un tiempo programado (no repetitivo) inferior a 10 minutos. Para los fines de mi situación, estaba usando 5 minutos. - Una vez que se
NStimer
el selector delNStimer
, finalice la tarea en segundo plano y luego llame instantáneamente al método que escribió anteriormente para comenzar otra tarea en segundo plano. - Si desea programar los métodos para que se ejecuten en momentos específicos, deberá verificarlos en la tarea de fondo.
Esta solución no es realmente ideal y aún está hambrienta de poder, pero hará lo que quiera.
Editar: desde iOS7, te sugiero que leas esta excelente publicación .
No puedes. A menos que su aplicación use audio, voip o gps. Lo que puede hacer es notificar al usuario (a través de notificaciones locales) que el tiempo casi ha terminado y pedirle que abra / cierre la aplicación.
Además, si solo necesita notificar al usuario, puede usar notificaciones push.
Si su tipo de aplicación no es de VOIP / Audio / Location ... (compruebe los modos de fondo ),
o no desea especificar su aplicación como aplicación en segundo plano, puede implementar beginBackgroundTaskWithName: expirationHandler o beginBackgroundTaskWithExpirationHandler para solicitar más tiempo para ejecutar su proceso en segundo plano. Puede encontrar la descripción detallada aquí
Se espera que las aplicaciones que pasan a un segundo plano se pongan en un estado inactivo lo más rápido posible para que el sistema pueda suspenderlas. Si su aplicación se encuentra en el medio de una tarea y necesita un poco más de tiempo para completarla, puede llamar al método beginBackgroundTaskWithName: expirationHandler: o beginBackgroundTaskWithExpirationHandler: del objeto UIApplication para solicitar tiempo de ejecución adicional. Llamar a cualquiera de estos métodos retrasa la suspensión de su aplicación temporalmente, dándole un poco más de tiempo para terminar su trabajo. Una vez finalizado ese trabajo, su aplicación debe llamar al método endBackgroundTask: para que el sistema sepa que está terminado y se puede suspender.
Cada llamada al método beginBackgroundTaskWithName: expirationHandler: o beginBackgroundTaskWithExpirationHandler: genera un token único para asociar con la tarea correspondiente. Cuando su aplicación completa una tarea, debe llamar al método endBackgroundTask: con el token correspondiente para que el sistema sepa que la tarea está completa. Si no se llama al método endBackgroundTask: para una tarea en segundo plano, se dará por terminada su aplicación. Si proporcionó un controlador de vencimiento al iniciar la tarea, el sistema llama a ese controlador y le da una última oportunidad para finalizar la tarea y evitar la finalización.
Solo ciertos tipos de aplicaciones pueden ejecutarse en segundo plano. Consulte la sección "Implementación de tareas de segundo ciclo largas" de esta guía .
Si no está solicitando permisos para procesar el fondo, puede usar beginBackgroundTaskWithExpirationHandler de beginBackgroundTaskWithExpirationHandler pero no puede obtener más tiempo.
https://github.com/yarodevuci/backgroundTask Compruebe mi código aquí Estoy usando un reproductor de audio que reproduce archivos wav en blanco Funciona perfectamente en iOS 8 Uso de la batería en torno al 10% en un período de 24 horas Cómo utilizar:
var backgroundTask = BackgroundTask()
backgroundTask.startBackgroundTask() //Starts playing blank audio file. You can run NSTimer() or whatever you need and it will continue executing in the background.
backgroundTask.stopBackgroundTask() //Stops the task
Advertencia: Apple rechazará esto si intentas enviarlo.