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

时间:2013-06-03 13:52:56

标签: 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方法,这些方法都将消息记录到控制台。这些方法都没有运行过。所有这些都会向我表明这些设备无法找到彼此。

但是,我运行了使用GKSession连接两个设备的示例程序GKRocket,它在这两个设备之间正常工作。我已经将GKRocket的代码与我的程序代码进行了比较,但我没有发现任何可能影响GKSession的差异。

任何建议?

1 个答案:

答案 0 :(得分:2)

您似乎有两个GKSession实例。 if语句中的一个在外部和另一个。

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

相关问题