- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在让 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
语句内。
这意味着如果 connectButtonHasBeenPressed
为 false
它将创建它自己的 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/
我是一名优秀的程序员,十分优秀!