我遇到了让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方法,这些方法都将消息记录到控制台。这些方法都没有运行过。所有这些都会向我表明这些设备无法找到彼此。
但是,我运行了使用GKSession连接两个设备的示例程序GKRocket,它在这两个设备之间正常工作。我已经将GKRocket的代码与我的程序代码进行了比较,但我没有发现任何可能影响GKSession的差异。
任何建议?
答案 0 :(得分:2)
您似乎有两个GKSession实例。 if
语句中的一个在外部和另一个。
这意味着如果connectButtonHasBeenPressed
为false
,它将创建它自己的GKSession版本。但如果是true
,则session
将等于nil
。
另外,我建议使用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
变量,因为你可以检查GKSession是否等于nil,如果没有连接则应该总是这样。当您的会话结束时,您应该始终取消所有会话操作并设置session = nil;
。
session
变量应该真正在.h文件中声明,以便您可以在整个班级中使用它。因此不再需要GKSession *session;
。
注意:只需来自connectToBluetoothDevice has been called
日志的备注。根据我的经验,GKSession将使用WiFi或蓝牙,具体取决于可用的内容。这么多,你可以有3个设备,1个只打开蓝牙,1个只打开WiFi,最后打开两个设备,它们将完全连接并相互通话。
希望这有帮助。
修改:从示例代码中删除了不需要的connectButtonHasBeenPressed
变量,并添加了更多解释。