我正在开发一个允许点对点连接的 iPhone 应用程序。据我了解,我可以选择使用 GKPeerPicker 或 GKSession。我不喜欢使用 PeerPicker 的想法,因为我想显示一个自定义界面,所以我决定使用 GKSession,嘿,好处是它也可以通过 Wi-Fi 工作,而 Peer Picker 不能。
好的,所以问题是……如果用户同时关闭了蓝牙和 Wi-Fi 怎么办?在 Peer Picker 中,会提示您在不离开应用程序的情况下打开蓝牙。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 网络。