我在让GKSession工作时遇到问题。下面是我按下特定按钮时执行的代码。
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]);
}
第一次按下按钮后,一切似乎都正常。并且此后每当我按下该按钮时,它将打印“当前可用对等体:0”。如果我没有两个彼此相邻的设备,并且同时按下按钮来运行程序,那么这将是预期的输出。我也将所有GKSessionDelegate方法实现到此类中,这些方法都将消息记录到控制台。这些方法都没有运行过。所有这些都向我表明这些设备找不到彼此。
但是,我已经运行了示例程序GKRocket,该程序使用GKSession连接两个设备,并且在这两个设备之间运行良好。我已经将GKRocket的代码与程序的代码进行了比较,但是我没有发现任何可能影响GKSession的差异。
有什么建议?
最佳答案
您似乎有两个GKSession实例。一个在if
语句的外部,另一个在内部。
这意味着,如果connectButtonHasBeenPressed
是false
,它将创建它自己保留的GKSession版本。但是,如果它是true
,则session
将等于nil
。
另外,我建议使用nil
作为 session ID,然后使用捆绑包ID为您设置 session 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
变量,因为您只需检查GKSession是否等于nil(如果没有连接就应该始终为nil)。 session 结束时,应始终取消所有 session 操作并设置session = nil;
。应该在.h文件中声明
session
变量,以便您可以在整个类中使用它。因此不再需要GKSession *session;
。注意:只是
connectToBluetoothDevice has been called
日志中的一个注释。根据我的经验,GKSession将使用WiFi或蓝牙,具体取决于可用的设备。如此之多,您可以拥有3台设备,其中1台仅打开蓝牙,1台仅打开WiFi,最后一个同时打开,并且它们都可以相互连接并正常通信。希望这可以帮助。
编辑:从示例代码中删除了不需要的
connectButtonHasBeenPressed
变量,并添加了更多说明。关于ios - 如何在iOS 6.1上正确设置GKSession(蓝牙),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16898417/