Ejecutar la aplicación durante más de 10 minutos en segundo plano


Estoy tratando de mantener la aplicación iOS en estado activo durante más de 10 minutos cuando entra en estado de fondo.

¿Cómo puedo implementar esto.

Author: Richard J. Ross III, 2012-03-16

7 answers

Consulte la sección "Ejecución en segundo plano" de la Guía de programación Iphoneapp. En resumen, su 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 que admiten Protocolo de Voz sobre Internet (VoIP)
  • Aplicaciones de quiosco que necesitan descargar y procesar nuevo contenido
  • Aplicaciones que recibir actualizaciones regulares de accesorios externos

Y debe agregar a la información.plist como sigue: Añadir la clave UIBackgroundModes a su INFO.plist y establezca su valor en un array 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 audio o vídeo mediante AirPlay.)
  • ubicación: la aplicación mantiene a los usuarios informados de su ubicación, incluso mientras está corriendo en segundo plano.
  • voip-La aplicación proporciona la capacidad para que el usuario realice llamadas telefónicas utilizando una conexión a Internet.
  • kiosco-contenido - La aplicación es una aplicación de kiosco que descarga y procesa revistas o periódicos contenido en segundo plano.
  • accesorio externo: la aplicación funciona con un accesorio de hardware que necesita programación regular a través del marco Accesorio Externo.
  • bluetooth-central - La aplicación funciona con un accesorio Bluetooth que necesita entregar actualizaciones en un programación 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 hace lo que dice que está haciendo con respecto al procesamiento en segundo plano.

 55
Author: Brian Cooley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-06 05:09:56

Esto es lo que he hecho usando beginBackgroundTaskWithExpirationHandler.

  • Escriba un método que inicie una tarea en segundo plano.
  • Dentro de esa tarea en segundo plano, ejecute un NSTimer con un tiempo programado (no repetitivo) inferior a 10 minutos. Para los propósitos de mi situación yo estaba usando 5 minutos.
  • Una vez que se active el selector de NStimer, finalice la tarea en segundo plano y luego llame al método que escribió anteriormente para iniciar otra tarea en segundo plano.
  • Si si desea programar métodos para que se ejecuten en momentos específicos, tendrá que verificarlos en la tarea en segundo plano.

Esta solución no es realmente ideal y sigue hambrienta de poder, pero hará lo que quieras.

Editar: Desde iOS7, te sugiero que leas este excelente post .

 20
Author: ingh.am,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-24 14:23:06

Solo ciertos tipos de aplicaciones pueden ejecutarse en segundo plano. Consulte la sección" Implementación de Tareas en segundo plano de larga duración " de esta guía .

Si no está solicitando permisos para realizar el procesamiento en segundo plano, puede usar el beginBackgroundTaskWithExpirationHandler de UIApplication pero no puede obtener tiempo adicional.

 2
Author: CJ Foley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-16 14:09:06

Este código hace que tu aplicación iOS se ejecute indefinidamente en segundo plano. Copie y pegue los siguientes métodos 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;
    }
}
 2
Author: rismay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-15 22:36:46

Https://github.com/yarodevuci/backgroundTask Compruebe mi código aquí estoy usando un reproductor de audio que reproduce un archivo wav en blanco Funciona perfectamente en IOS 8 Uso de la batería alrededor del 10% en un período de 24 horas Modo de empleo:

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!

 1
Author: Maksim Kniazev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-07 13:24:38

No puedes. A menos que tu aplicación use audio, voip o gps. Lo que puede hacer es notificar al usuario (a través de notificaciones locales) que el tiempo está casi terminado y pedirle que abra/cierre la aplicación.

También si solo necesita notificar al usuario, puede usar notificaciones push.

 0
Author: fbernardo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-16 14:06:29

Si su tipo de aplicación no es uno de VOIP/Audio/Ubicación....(marque Modos de Fondo),

O si no desea especificar su Aplicación como una 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 se mueven a un segundo plano se pongan a sí mismas en un estado de reposo lo más rápido posible para que puedan ser suspendidos por el sistema. Si tu app está en 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 un 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. Al completar ese trabajo, su aplicación debe llamar al método endBackgroundTask: para que el sistema sepa que ha terminado y puede suspenderse.

Cada llamada al método beginBackgroundTaskWithName:expirationHandler: o beginBackgroundTaskWithExpirationHandler: genera un token único para asociar con la tarea correspondiente. Cuando tu app 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 terminará la aplicación. Si proporcionó un controlador de caducidad al iniciar la tarea, el sistema llama a ese controlador y le da una última oportunidad de finalizar la tarea y evitar la terminación.

 0
Author: User9527,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-05 09:08:54