Поддерживать сеанс многопользовательского подключения в фоновом режиме через BackgroundTask?

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

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


person Einho    schedule 12.09.2014    source источник
comment
Взгляните на этот код. github.com/davidkaminsky/Unplugged/blob/master/Unplugged/ У меня была эта проблема с TCP-соединениями, вы можете оставить свое приложение в фоновом режиме на пару минут, но если дольше, вы должны очистить свои соединения и остановить фоновую задачу. Используйте его исключительно для того, чтобы поддерживать соединения открытыми, пока пользователь ненадолго вышел из вашего приложения.   -  person sbarow    schedule 12.09.2014
comment
Спасибо, в итоге я сделал что-то похожее, но не такое уж необычное (т.е. не следил за временем автономной работы).   -  person Einho    schedule 16.09.2014


Ответы (2)


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

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

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

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

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

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

В appDelegate.h

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

В приложенииDelegate.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
}
person Einho    schedule 16.09.2014
comment
Это неправда и не работает. Как только я перевел приложение в фоновый режим, мой сеанс сразу же перестал работать, а не через 10 минут или даже через минуту... Все мои одноранговые узлы отключены. - person Bartłomiej Semańczyk; 01.01.2021

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

person Joride    schedule 12.09.2014
comment
Да, общее недокументированное правило заключается в том, что MC не должен работать в фоновом режиме ... Я все еще не уверен, является ли это правилом (например, приложение будет отклонено из магазина приложений, если оно это делает), или просто не поддерживается для другие причины (ограничение уровня, использование ЦП и т. д.). На данный момент я использую это для корпоративного приложения, так что это не имеет значения, если оно не дает ошибок / сбоев. - person Einho; 16.09.2014
comment
@Einho Когда вы говорите, что используете корпоративное приложение, означает ли это, что вы полностью преодолели ограничение по времени? т.е. Можете ли вы поддерживать работу MC в фоновом режиме более 10 минут? - person ndbroadbent; 24.10.2018