Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 实时游戏中心游戏断开连接(可能是因为网络超时)_Iphone_Ios_Objective C_Game Center_Gamekit - Fatal编程技术网

Iphone 实时游戏中心游戏断开连接(可能是因为网络超时)

Iphone 实时游戏中心游戏断开连接(可能是因为网络超时),iphone,ios,objective-c,game-center,gamekit,Iphone,Ios,Objective C,Game Center,Gamekit,所以,我正在写一个非常简单的实时游戏中心2人游戏;然而,问题是我一直在断开连接 游戏的工作原理如下:每个玩家的设备上都有一个文本字段。它们各自在字段中输入文本并按enter键。当两个人都输入了文本时,游戏就开始了 现在,当用户积极玩游戏时(大约每10秒输入一次文本),游戏运行正常,用户从未断开连接。但是,当游戏处于非活动状态(用户只是坐着盯着应用程序屏幕)约30秒或更长时间时,至少会有一名玩家断开连接。 我很有信心我的互联网是可靠的,而且两台设备似乎都连接到了互联网(通过wifi) 我知道这是一

所以,我正在写一个非常简单的实时游戏中心2人游戏;然而,问题是我一直在断开连接

游戏的工作原理如下:每个玩家的设备上都有一个文本字段。它们各自在字段中输入文本并按enter键。当两个人都输入了文本时,游戏就开始了

现在,当用户积极玩游戏时(大约每10秒输入一次文本),游戏运行正常,用户从未断开连接。但是,当游戏处于非活动状态(用户只是坐着盯着应用程序屏幕)约30秒或更长时间时,至少会有一名玩家断开连接。

我很有信心我的互联网是可靠的,而且两台设备似乎都连接到了互联网(通过wifi)

我知道这是一个非常模糊的问题,我只是想知道是否有人对上面黑体字的症状有任何想法

编辑:

下面是初始化matchrequest和match的方法。不过,我在初始化或开始比赛时没有遇到任何问题。唯一的问题是当一个玩家空闲了一段时间

//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和其他网络问题。