【问题标题】:How do I correctly setup a GKSession (Bluetooth) on iOS 6.1如何在 iOS 6.1 上正确设置 GKSession(蓝牙)
【发布时间】:2013-05-29 16:52:15
【问题描述】:

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

有什么建议吗?

【问题讨论】:

    标签: ios gamekit gksession


    【解决方案1】:

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

    这意味着如果 connectButtonHasBeenPressedfalse 它将创建它自己的 GKSession 版本并保留。但如果是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,如果没有连接,它应该总是等于 nil。当您的会话结束时,您应该始终取消所有会话操作并设置session = nil;

    session 变量确实应该在您的 .h 文件中声明,以便您可以在整个课程中使用它。这样GKSession *session; 就不再需要了。

    注意:只是您的connectToBluetoothDevice has been called 日志中的一条注释。根据我的经验,GKSession 将使用 WiFi 或蓝牙,具体取决于可用的。如此之多,以至于您可以拥有 3 台设备,1 台仅开启蓝牙,1 台仅开启 WiFi,最后一台同时开启,它们都可以正常连接和交谈。

    希望这会有所帮助。

    编辑:从示例代码中删除了不需要的 connectButtonHasBeenPressed 变量并添加了更多解释。

    【讨论】:

    • 此外,iOS 5 和 iOS 6 上的设备之间有时可能会出现连接问题。这似乎是 Apple 的问题,听起来好像没有修复错误。
    • 非常感谢!我没有看到我有两个 GKSession 实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2016-01-13
    • 2022-11-01
    • 1970-01-01
    相关资源
    最近更新 更多