2011-03-16 11 views
25

Me preguntaba si podría enviar algunas llamadas al servicio web mientras mi aplicación está en segundo plano. ¿Cómo lo hace Skype? Incluso si presiono el botón de inicio, mi llamada permanece conectada.Aplicación iOS ejecutando tareas en el fondo

+6

Si usted lee la documentación de Apple en el fondo funcionamiento se verá que sólo se le permite ejecutar su aplicación en segundo plano si, usted está Reproducción de audio, ubicación de monitoreo o su aplicación es cliente VOIP. Si su aplicación no pertenece a ninguna de las categorías anteriores, no tiene suerte. http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html – rckoenes

+0

@rckoenes Esto no es verdad. Puede obtener * algún * tiempo de CPU para tareas finitas * (generalmente alrededor de 10 minutos más o menos) *. Consulte [los documentos] (https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html) – webo80

+0

@ webo80 cierto que puede obtener algo de tiempo, en iOS 9 es mucho menos de 10 min. Pero, en general, puede hacer algo en segundo plano. – rckoenes

Respuesta

33

Basándose en lo que afirmaron los rckoenes, las aplicaciones pueden registrar tareas en segundo plano que deben completarse después de que el usuario presione el botón de inicio. Hay un límite de tiempo de 10 o 15 minutos para completar estas tareas. Nuevamente, puede registrar una tarea para completar inmediatamente después de que el usuario llegue a su casa, esto NO le permite ejecutar el código, digamos una hora después de que salen de la aplicación.

UIApplication* app = [UIApplication sharedApplication]; 
task = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:task]; 
     task = UIBackgroundTaskInvalid; 
    }]; 
// Start the long-running task and return immediately. 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     // Do the work associated with the task. 
     NSLog(@"Started background task timeremaining = %f", [app backgroundTimeRemaining]); 
     if (connectedToNetwork) { 
      // do work son... 
     } 

     [app endBackgroundTask:task]; 
     task = UIBackgroundTaskInvalid; 
    }); 

ACTUALIZACIÓN: si su aplicación es compatible con versiones anteriores de iOS a iOS 4, también debe comprobar para asegurarse de que la multitarea es compatible antes de registrar una tarea en segundo plano. Use algo similar a:

UIDevice* device = [UIDevice currentDevice]; 

BOOL backgroundSupported = NO; 

if ([device respondsToSelector:@selector(isMultitaskingSupported)]) 

    backgroundSupported = device.multitaskingSupported; 
+0

A partir de iOS 7 el tiempo de ejecución de fondo se redujo de 10 minutos a 3 minutos. – user3847320

+0

@ user3847320, cualquier documento, por favor ... –

+0

@GaneshGuturi No hay documentación directa, y Apple declara explícitamente que el tiempo de fondo se asigna de forma oportunista, en función de una serie de variables. El seguimiento y el error (al iniciar sesión en UIApplication.shared.backgroundTimeRemaining) indican el tiempo de ejecución de 3 minutos. Esto, por supuesto, podría cambiar a discreción de Apple. – user3847320

29

Pruebe esto ... Excelente código para ejecutar la aplicación en segundo plano sin límite de tiempo. (Lo probé por la descarga de más de 600 MB de datos del servicio web.)

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    UIApplication *app = [UIApplication sharedApplication]; 
    UIBackgroundTaskIdentifier bgTask; 
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:bgTask]; 
    }]; 
} 

actualización ::

podemos encontrar más información sobre multitaksing en este documento manzana Background Execution.

favor prueba en el dispositivo.

+4

Lo estoy usando, pero después de 10 minutos la tarea está terminando. – Salim

+0

Esto no funciona iOS 4, 5, 6. funciona solo para iOS 7 – Salim

+0

Super. Muchas gracias por esto. Realmente me ayudó mucho. – Karun

1

Depende de qué tipo de aplicación está intentando codificar. Skype está registrado como una aplicación VoIP (aplicación de larga duración) y es por eso que puede seguir "funcionando" aunque esté en segundo plano.

de Apple separa aplicaciones en tres:

  • Ejecución de tareas Finito de longitud (se puede ejecutar tareas de una cantidad finita de tiempo)
  • Descarga de contenido en el fondo (se puede descargar el contenido de presentarlo a el usuario cuando la aplicación vuelve a ser activo)
  • Tareas para la aplicación de marcha largas (Estos son los antecedentes más interesantes aplicaciones de la categoría, con algunas subcategorías que el desarrollador debe definir para su aplicación)

    • Aplicaciones que se puede escuchar el contenido audible para el usuario, mientras que en el fondo, como una aplicación de reproductor de música
    • Aplicaciones de que el contenido de audio expediente mientras que en el fondo
    • Aplicaciones que mantienen informados a los usuarios de su localización en todo momento, tales como una aplicación de navegación
    • Aplicaciones que soportan Voz sobre Protocolo de Internet (VoIP) (Skype es aquí)
    • aplicaciones que necesitan descargar y procesar nuevos contenidos regularmente
    • Aplicaciones que reciben actualizaciones periódicas de los accesorios externos

Por lo tanto, debe evaluar en qué categoría es su aplicación y cuál es el funcionamiento de su servicio. Tal vez si está enviando algunas cosas pequeñas al servicio, el mejor enfoque es solo solicitar un tiempo extra en el fondo para hacer el trabajo.

Más información acerca de todo esto está en este enlace:

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Cuestiones relacionadas