我在让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]);
}第一次按下按钮后,一切似乎都正常。之后每次我按下按钮,它都会打印"Currently Peers: 0“。如果我没有两个相邻的设备,同时按下按钮来运行程序,那么这将是预期的输出。我还在这个类中实现了所有的GKSessionDelegate方法,它们都将一条消息记录到控制台。这些方法都没有运行过。所有这一切都会告诉我,这些设备无法找到彼此。
但是,我已经运行了使用GKSession连接两个设备的示例程序GKRocket,它在这两个相同的设备之间工作得很好。我已经将GKRocket的代码与我的程序的代码进行了比较,我没有发现任何我认为会影响GKSession的差异。
有什么建议吗?
发布于 2013-06-04 01:37:03
您似乎有两个GKSession实例。一个在if语句外部,另一个在One语句内部。
这意味着如果connectButtonHasBeenPressed为false,它将创建自己保留的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;。
实际上,应该在.h文件中声明session变量,以便您可以在整个类中使用它。这样就不再需要GKSession *session;。
备注:只需从您的connectToBluetoothDevice has been called日志中添加一个备注。根据我的经验,GKSession将使用WiFi或蓝牙,视情况而定。以至于你可以有3台设备,一台只开着蓝牙,一台只开着WiFi,最后一台开着两个都开着,它们都能很好地相互连接和通话。
希望这能有所帮助。
编辑:从示例代码中删除了不需要的connectButtonHasBeenPressed变量,并添加了更多说明。
https://stackoverflow.com/questions/16898417
复制相似问题