ios - 如何在 iOS 6.1 上正确设置 GKSession(蓝牙)

标签 ios gamekit gksession

我在让 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 语句内部。

这意味着如果connectButtonHasBeenPressedfalse,它将创建它自己保留的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/

相关文章:

ios - 在 iOS 中,Gamekitframework 在发送消息方面是否比 multipeerconnectivity 框架更快?

ios - 使用 GKLocalPlayerListener 的 receivedTurnEventFor 匹配时,有没有办法确定转弯事件是否是匹配查找的结果?

ios - GKSession 在 ios 7 中被弃用,我现在应该使用什么?

ios - 如何将WebRTC导入到xcode项目中?

ios - MBProgressHUD 不再与 iOS 8 一起旋转

ios - 类型 'ViewController' 不符合协议(protocol) 'Wsdl2CodeProxyDelegate'

ios - 如何在PDF上下文中绘制文本

带有通知的 iOS Swift 'message sent to deallocated instance'

ios - 使用GKSession进行点对点时如何获得精确的时钟同步?