我在让 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
陈述。
这意味着如果connectButtonHasBeenPressed
is false
它将创建它自己保留的 GKSession 版本。但如果是true
then 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;
.
The session
变量实际上应该在您的 .h 文件中声明,以便您可以在整个类中使用它。以便GKSession *session;
不再需要。
Note:只是您的一张便条connectToBluetoothDevice has been called
日志。根据我的经验,GKSession 将使用 WiFi 或蓝牙,具体取决于可用的情况。如此之多,以至于您可以拥有 3 台设备,其中 1 台仅开启蓝牙,1 台仅开启 WiFi,最后一台同时开启,它们都可以完美地相互连接和通话。
希望这可以帮助。
Edit:删除了不需要的connectButtonHasBeenPressed
来自示例代码的变量并添加了更多解释。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)