Как правильно обрабатывать фоновые задачи в iOS?

У меня есть приложение VoIP, и оно должно работать в фоновом режиме. Насколько я понимаю, вот что мне нужно сделать:

Пометить приложение как voip.Установите для флага «приложение не запускается в фоновом режиме» значение «НЕТ».Установите обработчик срока действия, фрагмент кода, который увеличивает стандартные 10 минут времени выполнения, которое вы получаете.Больше?

Я установил оба флага в файле info.plist и получил свои 10 минут. Я попробовал то, что предлагается вэта почта, Вот мой код:

//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);
    }
});
Ситуация:

Я использую стороннюю библиотеку, которая обрабатывает связь с нашим веб-сервисом. Сервис является сервером CommuniGate pro. Я получаю обновления присутствия (онлайн / офлайн) и мгновенные сообщения от контактов через библиотеку. Библиотека - это библиотека ximss от CommuniGate, созданный ими протокол, который похож на xmpp и используется для sip-запросов на основе xml, а также для обмена мгновенными сообщениями и информации о присутствии. Когда пользователь входит в приложение, он видит свои контакты (список друзей CmmuniGate) и может выбрать один из них. После того, как сообщение подтверждения ximss было отправлено, а другая сторона приняла вызов, она записывает время начала вызова и запускает вызов в режиме Facetime.

Проблема:

Когда приложение входит в фоновый режим, нажимая кнопку «Домой», я начинаю видеть сообщение «остаться в живых» в журнале и каждые десять минут вижу, что оно перезапускает фоновую задачу.
Когда приложение переходит в фоновый режим нажатием кнопки питания, сообщения «оставаясь в живых» начинают отображаться в течение десяти минут, после чего оно перезапускает фоновую задачу и начинает перезапускать ее примерно каждые 50–100 миллисекунд.
Я бы с этим согласился, даже если он питается от батареи, потому что у меня есть время работать над обновлениями, а наши пользователи не владеют ipads, у нас это есть. Проблема для меня сейчас в том, что библиотека ximss теряет соединение (она основана на сеансах). Я мог бы перезапустить сеанс в библиотеке, но это означает, что для извлечения списка контактов требуется немало передачи данных, а некоторые пользователи используют 3g.
Я не могу отредактировать исходный код библиотеки и не могу его увидеть, поэтому я не знаю, правильно ли он создает сокеты.

Что мне нужно сделать, чтобы правильно справиться с обеими ситуациями? Я даже не понимаю, почему есть разница.

Ответы на вопрос(1)

Ваш ответ на вопрос