gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:13:36 25 4
gpt4 key购买 nike

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

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

另外,我建议使用 nil 作为 session 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 结束时,您应该始终取消所有 session 操作并设置 session = nil;

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com