2

我在让 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 的差异。

有什么建议么?

4

1 回答 1

2

您似乎有两个 GKSession 实例。一个在外面,另一个在if声明里面。

这意味着如果connectButtonHasBeenPressedfalse,它将创建它自己保留的 GKSession 版本。但如果是truethensession将等于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的变量并添加了更多解释。

于 2013-06-03T17:37:03.450 回答