Подключение Multipeer перестает работать, когда пользователь выключает и включает bluetooth
Я использую multipeer connectivity в ios7 в своем приложении. Отправка и получение файлов работает абсолютно нормально, но в тот момент, когда пользователь обращается из моего приложения к центру управления (или даже настройкам) и отключает bluetooth или Wi-Fi, обмен файлами перестает работать. Когда пользователь колдует над ними обоими, все равно это не работает. Чтобы они снова заработали, пользователь должен закрыть и снова открыть приложение.
Файлы отправляются следующим образом:
MCSession *session = [[MCSession alloc]
initWithPeer:key];
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
dateComponents.year = 2100;
dateComponents.month = 1;
dateComponents.day = 1;
dateComponents.hour = 0;
dateComponents.minute = 0;
dateComponents.second = 0;
NSDate *referenceDate = [gregorian dateFromComponents: dateComponents];
NSDate *now = [NSDate date];
NSTimeInterval interval = [now timeIntervalSinceDate:referenceDate];
NSData *Recording = [NSData dataWithContentsOfFile:myFilePath];
NSString* str = [NSString stringWithFormat:@"%@.ext", button.titleLabel.text];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:str forKey:@"fileName"];
[dict setObject:@"Recording" forKey:@"fileType"];
[dict setObject:Recording forKey:@"FileData"];
NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:dict];
[browser invitePeer:key
toSession:session
withContext:myData
timeout:interval];
Пользователь может перезагрузить устройства в любое время, используя:
[browser startBrowsingForPeers];
Я думаю, что проблема заключается в таймауте, но я не уверен.
2 ответа:
Необходимо повторно инициализировать все связанные экземпляры Multipeer Connectivity Framework в методе делегата приложения
- (void)applicationDidBecomeActive:(UIApplication *)application
. Этот метод вызывается, когда ваше приложение снова становится активным после открытия и закрытия центра управления.
Я предлагаю вам вместо этого отслеживать изменения состояния подключения, а также демонтаж или повторный ввод, когда вы обнаружите там изменения. Вот мой метод для этой же задачи, используя превосходный набор достижимости :
- (void)monitorReachability { // Allocate a reachability object self.reachability = [Reachability reachabilityWithHostname:@"www.google.com"]; [[NSNotificationCenter defaultCenter] addObserverForName:kReachabilityChangedNotification object:nil queue:nil usingBlock:^(NSNotification *note) { Reachability *reachability = note.object; if ( reachability.isReachable ) { self.isPhysicallyConnected = YES; [self updateNearbyService]; } else { self.isPhysicallyConnected = NO; [self tearDownNearbyService]; } }]; // Start the notifier, which will cause the reachability object to retain itself! [self.reachability startNotifier]; }
В
teardown
иupdate
вы восстановите свой мультиплеерный стек.