GKSession - что, если мне выключили Bluetooth и Wi-Fi?

Я работаю над приложением для iPhone, которое будет допускать одноранговые соединения. Из того, что я понимаю, у меня есть выбор между использованием GKPeerPicker или GKSession. Мне не нравится идея использовать PeerPicker, потому что я хочу показать пользовательский интерфейс, таким образом, я решил пойти с GKSession, и эй, ПРЕМИЯ - то, что это также работает по Wi-Fi, тогда как Средство выбора Однорангового узла не делает.

Хорошо, таким образом, проблема... что, если у пользователя есть и Bluetooth и выключенный Wi-Fi? В Средстве выбора Однорангового узла существует подсказка для превращения Bluetooth на w/o отъезд приложения. GKSession не имеет его..., но woah ожидают секунда, кажется, что я не могу даже проверить, чтобы видеть, идет ли Bluetooth или не программно!

Какао Carpe не требует никакой проблемы, просто используйте Делегата session:didFailWithError: метод. Но, поскольку это объясняет в комментариях..., который, кажется, больше не работает! И по моему опыту, я соглашаюсь.

Там некоторый другой путь состоит в том, чтобы программно проверить, идет ли Bluetooth? Это - что-то, для чего я должен усиливать Достижимость? Или это - просто ошибка, которую должна все же исправить Apple?

Чтобы быть точнее, я создаю свою сессию как это:

GKSession *aSession = [[GKSession alloc] initWithSessionID:nil
                                                  displayName:user.displayName 
                                                  sessionMode:GKSessionModePeer];

self.gkSession = aSession;
[aSession release];

self.gkSession.delegate = self;
self.gkSession.available = YES;

[self.gkSession setDataReceiveHandler:self withContext:NULL];

Класс реализует GKSessionDelegate, и я знаю, что он работает, потому что, когда мне включили Bluetooth, методы делегата не называют никакой проблемой. Я реализовал их как таковой:

#pragma mark -
#pragma mark GKSessionDelegate methods

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state {
     if (GKPeerStateAvailable == state) {
          [session connectToPeer:peerID withTimeout:10];
     } else if (GKPeerStateConnected == state) {
          // gets user

          NSError *error = nil;
          [session sendData:user.connectionData
                      toPeers:[NSArray arrayWithObjects:peerID,nil]
                withDataMode:GKSendDataReliable error:&error];
          if (error)
               NSLog(@"%@",error);
     }
}



- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID {
     NSError *error = nil;
     [session acceptConnectionFromPeer:peerID error:&error];
     if (error)
          NSLog(@"%@",error);
}

- (void)session:(GKSession *)session connectionWithPeerFailed:(NSString *)peerID withError:(NSError *)error {
     NSLog(@"%@",error);
}

- (void)session:(GKSession *)session didFailWithError:(NSError *)error {
     NSLog(@"%@",error);
}

Ни один из операторов журнала не печатается, и я установил точки останова в каждом методе, но ни один из них не поражен, когда у пользователя есть и Bluetooth и выключенный Wi-Fi. Я надеялся, что что-то, окажется, инициирует session:didFailWithError: так, чтобы я мог предложить пользователю включать Bluetooth или соединяться с сетью Wi-Fi.

11
задан bpapa 21 February 2010 в 18:29
поделиться