Я работаю над приложением для iPhone, которое позволит одноранговые соединения. Из того, что я понимаю, у меня есть выбор между использованием GKPeerPicker или GKSession. Мне не нравится идея использования PeerPicker, потому что я хочу показать пользовательский интерфейс, поэтому я решил использовать GKSession, и, кстати, BONUS работает и через Wi-Fi, а Peer Picker - нет.
ОК, проблема в том ... что если у пользователя отключены Bluetooth и Wi-Fi? В Peer Picker есть приглашение включить Bluetooth без выхода из приложения. У GKSession его нет ... но, подождите секунду, кажется, что я даже не могу проверить, включен ли Bluetooth программно или нет!
Carpe Cocoa утверждает, что не проблема , просто используйте метод делегата session:didFailWithError:
. Но, как это объясняется в комментариях ... это больше не работает! И по своему опыту я согласен.
Есть ли другой способ программно проверить, включен ли Bluetooth? Это то, что я должен использовать Reachability для? Или это просто ошибка, которую 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. Я надеялся, что что-то произойдет, чтобы вызвать сеанс: didFailWithError: чтобы я мог предложить пользователю включить Bluetooth или подключиться к сети Wi-Fi.