Qual é a maneira correta de lidar com tarefas em segundo plano no iOS?

Eu tenho um aplicativo voip e ele precisa ser executado em segundo plano. No meu entender, estas são as coisas que preciso fazer:

Sinalize o aplicativo como voip.Definir o sinalizador 'o aplicativo não é executado em segundo plano' como NÃO.Defina um manipulador de expiração, um código que amplia os 10 minutos padrão de tempo de execução que você recebe.Mais?

Eu defino os dois sinalizadores no arquivo info.plist e recebo meus 10 minutos. Eu tentei o que é sugerido emesta postagem. Aqui está o meu 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);
    }
});
A situação:

Eu uso uma biblioteca de terceiros que lida com a comunicação com o nosso serviço web. O serviço é um servidor CommuniGate pro. Eu recebo atualizações de presença (online / offline) e mensagens instantâneas de contatos através da biblioteca. A biblioteca é a biblioteca ximss da CommuniGate, um protocolo que eles criam que é semelhante ao xmpp e é usado para solicitações sip baseadas em xml, bem como mensagens instantâneas e presença. Quando o usuário faz login no aplicativo, ele vê seus contatos (lista de amigos do CmmuniGate) e pode optar por chamar um. Depois que uma mensagem de verificação de ximss foi enviada e o outro lado aceitou a chamada, ela registra a hora de início da chamada e inicia uma chamada de facetime.

O problema:

Quando o aplicativo entra em segundo plano pressionando o botão home, eu começo a ver a mensagem 'stayin alive' no registro e a cada dez minutos eu vejo que ele reinicia a tarefa em segundo plano.
Quando o aplicativo entra em segundo plano pressionando o botão liga / desliga, as mensagens de 'permanecer vivo' começam a aparecer por dez minutos, depois disso ele reinicia a tarefa em segundo plano e começa a reiniciá-la a cada 50-100 milissegundos.
Eu teria ficado bem com isso por enquanto, até mesmo ele come bateria, porque eu tenho tempo para trabalhar em atualizações e nossos usuários não possuem os ipads, nós fazemos. O problema para mim agora é que a biblioteca ximss perde sua conexão (é baseada em sessão). Eu poderia reiniciar a sessão na biblioteca, mas isso significa um pouco de transferência de dados para buscar a lista de contatos e alguns usuários usam 3g.
Não consigo editar o código-fonte da biblioteca, nem posso vê-lo, então não sei se ele cria os soquetes da maneira correta.


O que tenho que fazer para lidar corretamente com as duas situações? Eu nem entendo porque há uma diferença.