ОБНОВЛЕНИЕ После обращения в службу поддержки Apple они подтвердили, что слишком частый вызов sendData и слишком большой объем данных могут привести к разрыву связи.
У меня были разъединения при попадании в точки останова и при работе в фоновом режиме. Поскольку в магазине приложений точки останова не возникают, вам необходимо обработать случай фонового режима, запустив фоновую задачу, когда ваше приложение собирается перейти в фоновый режим. Затем завершите эту задачу, когда ваше приложение вернется на передний план. В iOS 7 это дает вам около 3 минут в фоновом режиме, что лучше, чем ничего.
Дополнительной стратегией может быть планирование локального уведомления примерно за 15 секунд до истечения фонового времени с помощью [[UIApplication sharedApplication] backgroundTimeRemaining]
, таким образом, вы можете вернуть пользователя в приложение до того, как оно приостановится, и многоуровневая структура должна быть отключена. Возможно, локальное уведомление предупредит их, что их сессия истечет через 10 секунд или что-то в этом роде...
Если срок действия фоновой задачи истек, а приложение все еще находится в фоновом режиме, вам придется отключить все, что связано с многоранговым подключением, иначе вы получите сбои.
- (void) createExpireNotification
{
[self killExpireNotification];
if (self.connectedPeerCount != 0) // if peers connected, setup kill switch
{
NSTimeInterval gracePeriod = 20.0f;
// create notification that will get the user back into the app when the background process time is about to expire
NSTimeInterval msgTime = UIApplication.sharedApplication.backgroundTimeRemaining - gracePeriod;
UILocalNotification* n = [[UILocalNotification alloc] init];
self.expireNotification = n;
self.expireNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:msgTime];
self.expireNotification.alertBody = TR(@"Text_MultiPeerIsAboutToExpire");
self.expireNotification.soundName = UILocalNotificationDefaultSoundName;
self.expireNotification.applicationIconBadgeNumber = 1;
[UIApplication.sharedApplication scheduleLocalNotification:self.expireNotification];
}
}
- (void) killExpireNotification
{
if (self.expireNotification != nil)
{
[UIApplication.sharedApplication cancelLocalNotification:self.expireNotification];
self.expireNotification = nil;
}
}
- (void) applicationWillEnterBackground
{
self.taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^
{
[self shutdownMultiPeerStuff];
[[UIApplication sharedApplication] endBackgroundTask:self.taskId];
self.taskId = UIBackgroundTaskInvalid;
}];
[self createExpireNotification];
}
- (void) applicationWillEnterForeground
{
[self killExpireNotification];
if (self.taskId != UIBackgroundTaskInvalid)
{
[[UIApplication sharedApplication] endBackgroundTask:self.taskId];
self.taskId = UIBackgroundTaskInvalid;
}
}
- (void) applicationWillTerminate
{
[self killExpireNotification];
[self stop]; // shutdown multi-peer
}
Вам также понадобится этот обработчик в вашем делегате MCSession из-за ошибки Apple:
- (void) session:(MCSession*)session didReceiveCertificate:(NSArray*)certificate fromPeer:(MCPeerID*)peerID certificateHandler:(void (^)(BOOL accept))certificateHandler
{
if (certificateHandler != nil) { certificateHandler(YES); }
}
person
jjxtra
schedule
21.10.2013