问题是...如果用户关闭了蓝牙和Wi-Fi呢?在PeerPicker中,有一个提示可以在不离开应用程序的情况下打开蓝牙。GKSession没有这个功能...但是等等,看起来我甚至无法编程检查蓝牙是否已打开! Carpe Cocoa声称没有问题,只需使用Delegate的
session:didFailWithError:
方法。但是,正如评论中所解释的那样...这似乎不再起作用了!根据我的经验,我也同意这一点。有没有其他方法可以编程检查蓝牙是否已打开?这是我应该利用可达性吗?还是这只是苹果尚未修复的错误?
更具体地说,我是这样创建我的会话的:
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,并且我知道它正在工作,因为当我打开蓝牙时,委托方法就会被调用,没有问题。我已经将它们实现为以下方式:
#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);
}
当用户关闭蓝牙和Wi-Fi时,没有任何日志语句被打印出来,我在每个方法中设置了断点,但是它们都没有被触发。我希望能够触发session:didFailWithError:以便提示用户打开蓝牙或连接到Wi-Fi网络。