2014-09-12 2 views
4

Я пытаюсь поддерживать сеанс MultipeerConnectivity, когда приложение временно входит в фоновый режим, поэтому я подумал об использовании фоновой задачи, как я видел несколько раз здесь ... Проблема в том, что я понятия не имею, как " сохранить сеанс с UIBackgroundTask, может кто-нибудь пожалуйста, напишите подсказкуПодключить сеанс связи Multipeer в фоновом режиме с помощью BackgroundTask?

Меня не интересуют рекламодатели/браузеры, все в порядке, чтобы остановить их, но я бы хотел, чтобы сеанс не отключился, так как повторное подключение является супер багги на момент.

+0

Посмотрите на этот код , https://github.com/davidkaminsky/Unplugged/blob/master/Unplugged/UnpluggedAppDelegate.m У меня была эта проблема с TCP-соединениями, вы можете сохранить приложение в фоновом режиме на пару минут, но если дольше вы должны очистить чтобы ваши связи и остановить фоновые задачи. Используйте его исключительно для того, чтобы оставаться открытыми, пока пользователь не работает в вашем приложении на короткое время. – sbarow

+0

Спасибо, я закончил делать что-то немного похожее, но не такое причудливое (т. Е. Не контролирующее время автономной работы). – Einho

ответ

10

Согласно документации на яблоко «Если приложение перемещается в фоновом режиме, среда останавливает рекламу, просматривает и отключает любые открытые сеансы. После возврата на передний план фреймворк автоматически возобновляет рекламу и просмотр, но разработчик должен восстановить любые закрытые сессии»См: Apple doc

Один из способов расширения соединения заключается в следующем

Отвечая на мой собственный вопрос, надеясь, что это поможет людям в такой же ситуации. Для людей, не знакомых с разработкой iOS, «использование фоновой службы» просто означает включение опции «Фоновые режимы» на вкладке «Возможности» вашей цели. Это само по себе должно дать вашему приложению около 10 минут жизни на заднем плане, прежде чем оно будет убито.

Но, когда приложение переходит на задний план, я использую «backgroundTimeRemaining», чтобы узнать, сколько времени у меня осталось, оно начинается только с 180 (в секундах, так что 3 минуты), но цикл печати продолжал работа прошла три минуты, а это значит, что необходимо вручную закодировать, что должно произойти, когда время будет достигнуто.

Для взаимодействия с Multipeer этого достаточно, чтобы поддерживать соединение живым, когда приложение входит в фон, и оно все равно будет получать все сообщения/потоки без проблем.

Ради стабильности, я сделать некоторые очистки следующим образом:

В appDelegate.h

@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask; //declaring a background task 

В appDelegate.m

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    self.backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^ 
          { 
           //This is called 3 seconds before the time expires 
           //Here: Kill the session, advertisers, nil its delegates, 
           //  which should correctly send a disconnect signal to other peers 
           //  it's important if we want to be able to reconnect later, 
           //  as the MC framework is still buggy 
           [application endBackgroundTask:self.backgroundTask]; 
           self.backgroundTask = UIBackgroundTaskInvalid; //Invalidate the background task 
          }]; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    // Here: We should init back the session, start the advertising and set the delegates from scratch 
    // This should allow the app to reconnect to the same session with more often than not 
    self.backgroundTask = UIBackgroundTaskInvalid; //Here we invalidate the background task if the timer didn't end already 
} 
0

Я задал один и тот же вопрос один раз на форумах разработчиков Apple. Один из сотрудников Apple сказал мне, что в основном все соединения Multipeer должны считаться офлайновыми, когда ваше приложение не находится на переднем плане.

+0

Да, общее недокументированное правило заключается в том, что MC не должен работать в фоновом режиме ... Я все еще не уверен, что это «правило» (например, приложение будет отклонено из хранилища приложений, если оно это делает), или просто неподдерживается по другим причинам (ограничение уровня, использование ЦП и т. д.). На данный момент я использую это для корпоративного приложения, поэтому это не имеет значения, если оно не вызывает ошибок/сбоев. – Einho