¿Cuál es la forma correcta de manejar tareas en segundo plano en iOS?

Tengo una aplicación de voip y necesita ejecutarse en segundo plano. A mi entender, estas son las cosas que debo hacer:

Marcar la aplicación como voip.Establezca el indicador 'la aplicación no se ejecuta en segundo plano' en NO.Establezca un controlador de vencimiento, un fragmento de código que extiende los 10 minutos estándar de tiempo de ejecución que obtiene.¿Más?

Puse ambas banderas en el archivo info.plist y obtengo mis 10 minutos. Probé lo que se sugiere enesta publicación. Aquí está mi código:

//in didFinishLaunchingWithOptions:
expirationHandler = ^{
    NSLog(@"ending background task");
    [[UIApplication sharedApplication] endBackgroundTask:bgTask];

    NSLog(@"restarting background task");
    bgTask = UIBackgroundTaskInvalid;
    bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:expirationHandler];

    NSLog(@"finished running background task");
};

//in applicationDidEnterBackground
NSLog(@"entering background mode");
bgTask = UIBackgroundTaskInvalid;
bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:expirationHandler];

// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // inform others to stop tasks, if you like
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MyApplicationEntersBackground" object:self];

    //this while loop is just here for testing
    inBackground = true;
    while (inBackground) {
        NSLog(@"stayin alive!!"); //this keeps going forever
        sleep(10);
    }
});
La situación:

Utilizo una biblioteca de terceros que maneja la comunicación con nuestro servicio web. El servicio es un servidor pro de CommuniGate. Recibo actualizaciones de presencia (en línea / fuera de línea) y mensajes instantáneos de contactos a través de la biblioteca. La biblioteca es la biblioteca ximss de CommuniGate, un protocolo que crearon que es similar a xmpp y se usa para solicitudes de sip basadas en XML, así como para mensajería instantánea y presencia. Cuando el usuario inicia sesión en la aplicación, ve a sus contactos (lista de amigos de CmmuniGate) y puede elegir llamar a uno. Después de que se haya enviado un mensaje de verificación de ximss y la otra parte aceptó la llamada, registra la hora de inicio de la llamada e inicia una llamada de facetime.

El problema:

Cuando la aplicación ingresa al fondo presionando el botón de inicio, comienzo a ver el mensaje "Manteniéndose vivo" en el registro y cada diez minutos veo que se reinicia la tarea de fondo.
Cuando la aplicación ingresa al fondo presionando el botón de encendido, los mensajes de "permanecer con vida" comienzan a aparecer durante diez minutos, después de eso se reinicia la tarea de fondo y se reinicia aproximadamente cada 50-100 milisegundos.
Habría estado bien con esto por ahora, incluso se come la batería, porque tengo tiempo para trabajar en las actualizaciones y nuestros usuarios no son dueños de los iPads, nosotros sí. El problema para mí ahora es que la biblioteca ximss pierde su conexión (se basa en la sesión). Podría reiniciar la sesión en la biblioteca, pero esto significa un poco de transferencia de datos para obtener la lista de contactos y algunos usuarios usan 3g.
No puedo editar la fuente de la biblioteca, ni puedo verla, así que no sé si crea los sockets de la manera correcta.

¿Qué tengo que hacer para manejar ambas situaciones correctamente? Ni siquiera entiendo por qué hay una diferencia.

Respuestas a la pregunta(1)

Su respuesta a la pregunta