Я работаю над приложением для 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.
Я согласен с Мартином Гордоном, но обходным решением может быть использование доступности Apple .