首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在iOS 6.1上正确设置GKSession (蓝牙)

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

Stack Overflow用户
提问于 2013-06-03 21:52:56
回答 1查看 677关注 0票数 2

我在让GKSession正常工作时遇到了问题。下面是我的代码,当一个特定的按钮被按下时执行。

代码语言:javascript
复制
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]);
}

第一次按下按钮后,一切似乎都正常。之后每次我按下按钮,它都会打印"Currently Peers: 0“。如果我没有两个相邻的设备,同时按下按钮来运行程序,那么这将是预期的输出。我还在这个类中实现了所有的GKSessionDelegate方法,它们都将一条消息记录到控制台。这些方法都没有运行过。所有这一切都会告诉我,这些设备无法找到彼此。

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

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-04 01:37:03

您似乎有两个GKSession实例。一个在if语句外部,另一个在One语句内部。

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

另外,我建议使用nil作为会话ID,因为它会被设置为使用包ID,尽管这可能是个人偏好。

试着使用这样的东西:

代码语言:javascript
复制
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;

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

备注:只需从您的connectToBluetoothDevice has been called日志中添加一个备注。根据我的经验,GKSession将使用WiFi或蓝牙,视情况而定。以至于你可以有3台设备,一台只开着蓝牙,一台只开着WiFi,最后一台开着两个都开着,它们都能很好地相互连接和通话。

希望这能有所帮助。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16898417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档