我在让 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
语句外部,另一个在 if
语句内部。
这意味着如果connectButtonHasBeenPressed
为false
,它将创建它自己保留的GKSession版本。但如果它是true
,那么session
将等于nil
。
此外,我建议使用 nil
作为 session ID,因为随后会使用 bundle 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;
。
session
变量确实应该在您的 .h 文件中声明,以便您可以在整个类中使用它。因此不再需要 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/