我在让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语句的外部,另一个在内部。

这意味着,如果connectButtonHasBeenPressedfalse,它将创建它自己保留的GKSession版本。但是,如果它是true,则session将等于nil

另外,我建议使用nil作为 session ID,然后使用捆绑包ID为您设置 session 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;

应该在.h文件中声明session变量,以便您可以在整个类中使用它。因此不再需要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/

10-09 02:05