Iphone 实时游戏中心游戏断开连接(可能是因为网络超时)
所以,我正在写一个非常简单的实时游戏中心2人游戏;然而,问题是我一直在断开连接 游戏的工作原理如下:每个玩家的设备上都有一个文本字段。它们各自在字段中输入文本并按enter键。当两个人都输入了文本时,游戏就开始了 现在,当用户积极玩游戏时(大约每10秒输入一次文本),游戏运行正常,用户从未断开连接。但是,当游戏处于非活动状态(用户只是坐着盯着应用程序屏幕)约30秒或更长时间时,至少会有一名玩家断开连接。 我很有信心我的互联网是可靠的,而且两台设备似乎都连接到了互联网(通过wifi) 我知道这是一个非常模糊的问题,我只是想知道是否有人对上面黑体字的症状有任何想法 编辑: 下面是初始化matchrequest和match的方法。不过,我在初始化或开始比赛时没有遇到任何问题。唯一的问题是当一个玩家空闲了一段时间Iphone 实时游戏中心游戏断开连接(可能是因为网络超时),iphone,ios,objective-c,game-center,gamekit,Iphone,Ios,Objective C,Game Center,Gamekit,所以,我正在写一个非常简单的实时游戏中心2人游戏;然而,问题是我一直在断开连接 游戏的工作原理如下:每个玩家的设备上都有一个文本字段。它们各自在字段中输入文本并按enter键。当两个人都输入了文本时,游戏就开始了 现在,当用户积极玩游戏时(大约每10秒输入一次文本),游戏运行正常,用户从未断开连接。但是,当游戏处于非活动状态(用户只是坐着盯着应用程序屏幕)约30秒或更长时间时,至少会有一名玩家断开连接。 我很有信心我的互联网是可靠的,而且两台设备似乎都连接到了互联网(通过wifi) 我知道这是一
//toInvite may be nil
- (void) createMatchWithPlayersToInvite: (NSArray *) toInvite
{
GKMatchRequest *request = [[GKMatchRequest alloc] init];
request.minPlayers = 2;
request.maxPlayers = 2;
request.playersToInvite = toInvite;
GKMatchmakerViewController *mmvc = [[GKMatchmakerViewController alloc] initWithMatchRequest:request];
self.myMatchmakerVC = mmvc;
mmvc.hosted = NO;
mmvc.matchmakerDelegate = self;
[self presentViewController:mmvc animated:YES completion:nil];
}
- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)match
{
[self dismissViewControllerAnimated:YES completion:nil];
self.myMatch = match;
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.currentMatch = self.myMatch;
if (!self.matchStarted && match.expectedPlayerCount == 0)
{
self.matchStarted = YES;
[self performSegueWithIdentifier:@"gameSegue" sender:self];
}
}
编辑2:
因此,我发现如果我设置一个计时器并通过网络发送消息(使用[self.myMatch sendDataToAllPlayers:data with datamode:GKMatchSendDataReliable error:&error]),每1秒一次,程序就可以正常工作。有没有人知道这是为什么,或者我如何在不使用黑客攻击的情况下解决问题
其他说明:
1) 我的
AppDelegate
尚未更改看起来您在这里有一个明确的假设,即游戏中心连接在30秒空闲时间后关闭。如果是这样的话,我不会感到惊讶。其他游戏几乎肯定会在这样的时间间隔内发送数据,您可能会触发超时条件。为了验证这一假设并同时解决问题,我会每5秒或10秒发送一条简短的盲文本。对不起,您需要提供更多信息,以便有人能够回答此问题。有太多的变量,我们作为项目的完全陌生人,不知道。我会从你连接的代码开始。是的,我意识到我的问题很模糊,我只是希望有人能认识到空闲玩家的问题。我在上面开始匹配的地方添加了代码。感谢黑客不是您使用的NSTimer
。事实上,您使用的API用于游戏循环以高速率发送消息,例如玩家位置。很少有UI事件会导致这种情况,因此如果超时,使用NSTimer
是一种合适的解决方法。这里真正的黑客是使用一个实时API来实现一个更像推送模型的东西。好吧,我已经测试了你的理论并得到了奇怪的结果。因此,如果我每5秒或10秒设置一次计时器,它就会失败。但是,如果我将其设置为每1秒一次,则效果良好。我已经能够使程序闲置超过8分钟,没有任何问题。你有没有办法解决这个超时问题,而不用破解计时器?如果没有,计时器解决方案将正常工作。谢谢恐怕我没有。我认为每秒发送多次消息是很常见的,而且可能是预期的。没有gkerrotimeout
您可以检查其中任何一个。在消息之间存在长时间延迟的情况下,通常最好发送“ping”或“keep-alive”包。GameCenter正在使用UDP,因此可能存在NAT和其他网络问题。