如何在iOS 6.1上正确设置GKSession(蓝牙)?
我有一个GKSession工作的问题。 以下是我按下特定button时执行的代码。
GKSession *session; if (connectButtonHasBeenPressed == false) { NSLog(@"connectToBluetoothDevice has been called"); connectButtonHasBeenPressed = true; GKSession *session = [[GKSession alloc] initWithSessionID:@"Unicorn" displayName:nil sessionMode:GKSessionModePeer]; [session setDataReceiveHandler:self withContext:nil]; [session setDelegate:self]; [session setAvailable:YES]; NSLog(@"Session ID: %@", [session sessionID]); NSLog(@"Currently Available Peers: %i", [[session peersWithConnectionState:GKPeerStateAvailable] count]); if ([session isAvailable]) { NSLog(@"The Session Is Available"); } [connectToDeviceButton setTitle:@"Searching..." forState:UIControlStateNormal]; } else { NSLog(@"Currently Available Peers: %i", [[session peersWithConnectionState:GKPeerStateAvailable] count]); }
第一次按下button后,一切似乎都正常工作。 之后每次按下button,都会打印出“Currently Available Peers:0”。 如果我没有两个坐在一起的设备,按下button即可运行程序,这将是预期的输出。 我还将所有的GKSessionDelegate方法实现到这个类中,这些方法都将消息logging到控制台。 这些方法都没有运行。 所有这些都表明这些设备找不到对方。
但是,我已经运行了示例程序GKRocket,它使用GKSession来连接两个设备,并且在这两个设备之间工作正常。 我将GKRocket的代码与我的程序的代码进行了比较,我没有发现任何可能影响GKSession的差异。
有什么build议么?
你似乎有两个GKSession实例。 if
语句内部和外部。
这意味着如果connectButtonHasBeenPressed
为false
,它将创build它自己的GKSession版本。 但如果这是true
那么session
将nil
。
另外,我会build议使用nil
作为会话ID,然后使用包ID为您设置。 虽然这可能是个人喜好。
尝试使用这样的东西:
if (session == nil) { NSLog(@"connectToBluetoothDevice has been called"); session = [[GKSession alloc] initWithSessionID:nil displayName:nil sessionMode:GKSessionModePeer]; [session setDataReceiveHandler:self withContext:nil]; [session setDelegate:self]; [session setAvailable:YES]; NSLog(@"Session ID: %@", [session sessionID]); if ([session isAvailable]) { NSLog(@"The Session Is Available"); } [connectToDeviceButton setTitle:@"Searching..." forState:UIControlStateNormal]; connectButtonHasBeenPressed = true; } NSLog(@"Currently Available Peers: %i", [[session peersWithConnectionState:GKPeerStateAvailable] count]);
你不需要有一个connectButtonHasBeenPressed
variables,因为你可以检查GKSession是否等于nil,如果没有连接,它应该总是这样。 当你的会话结束时,你应该总是取消所有会话操作并设置session = nil;
。
session
variables应该在你的.h文件中声明,以便你可以在整个类中使用它。 这样GKSession *session;
不再需要。
注意:只有来自connectToBluetoothDevice has been called
loggingconnectToBluetoothDevice has been called
日志。 根据我的经验,GKSession将使用WiFi或蓝牙,取决于任何可用的。 以至于你可以有3个设备,1个只有蓝牙function,1个只有WiFi,最后两个都打开,他们都将连接,并相互通话绝对好。
希望这可以帮助。
编辑:从示例代码中删除不需要的connectButtonHasBeenPressed
variables,并添加更多的解释。