Подключение 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 2

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 вы восстановите свой мультиплеерный стек.