如何在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语句内部和外部。

这意味着如果connectButtonHasBeenPressedfalse ,它将创build它自己的GKS​​ession版本。 但如果这是true那么sessionnil

另外,我会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]); 

你不需要有一个connectButtonHasBeenPressedvariables,因为你可以检查GKSession是否等于nil,如果没有连接,它应该总是这样。 当你的会话结束时,你应该总是取消所有会话操作并设置session = nil;

sessionvariables应该在你的.h文件中声明,以便你可以在整个类中使用它。 这样GKSession *session; 不再需要。

注意:只有来自connectToBluetoothDevice has been calledloggingconnectToBluetoothDevice has been called日志。 根据我的经验,GKSession将使用WiFi或蓝牙,取决于任何可用的。 以至于你可以有3个设备,1个只有蓝牙function,1个只有WiFi,最后两个都打开,他们都将连接,并相互通话绝对好。

希望这可以帮助。

编辑:从示例代码中删除不需要的connectButtonHasBeenPressedvariables,并添加更多的解释。

Interesting Posts