Как правильно обрабатывать фоновые задачи в 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.
Я не могу отредактировать исходный код библиотеки и не могу его увидеть, поэтому я не знаю, правильно ли он создает сокеты.
Что мне нужно сделать, чтобы правильно справиться с обеими ситуациями? Я даже не понимаю, почему есть разница.