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