3G连接的GameKit配对失败

我正在为iOSdevise一款多人游戏,并且在Apple Developer Center中阅读材料,特别是这个 。 这是我的自定义匹配代码,这是非常简单的:

- (void)findProgrammaticMatch { GKMatchRequest *request = [[GKMatchRequest alloc] init]; request.minPlayers = 2; request.maxPlayers = 2; request.defaultNumberOfPlayers = 2; request.playersToInvite = nil; request.playerAttributes = 0; request.playerGroup = 0; UILabel *loading = (UILabel *)[aiw viewWithTag:792]; [[GKMatchmaker sharedMatchmaker] findMatchForRequest:request withCompletionHandler:^(GKMatch *match, NSError *error) { if (error){ //error handling [loaderLayer stopAnimating]; UIButton *cancelButton = (UIButton *)[loaderLayer viewWithTag:442]; [cancelButton setTitle:@"Go Back" forState:UIControlStateNormal]; loading.text = @"Cannot find any players. Please try again later."; } else if (match != nil) { //save match self.match = match; self.match.delegate = self; loading.text = @"Found a player. Preparing session..."; if (!self.matchStarted && match.expectedPlayerCount == 0) { self.matchStarted = YES; //begin game logic [self.scene setState:1]; self.myTicket = 1000+arc4random_uniform(999); [self.scene send:self.myTicket]; [self stopLoading]; } } }]; } 

然而,当一个或多个设备通过蜂窝networking连接到互联网时,配对失败。 当我调查潜在的错误,我发现,即使它是一个无线networking的wifi情况下,完成处理程序不按预期工作。 也就是说, match.expectedPlayerCount永远不会是0.相反,游戏开始于- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state处理程序在完成处理程序后调用如下:

 ... - (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state { switch (state) { case GKPlayerStateConnected: self.matchStarted = YES; //begin game logic [self.scene setState:1]; self.myTicket = 1000+arc4random_uniform(999); [self.scene send:self.myTicket]; [self stopLoading]; break; ... 

现在的问题是,如果连接(和匹配的)3g的设备didChangeState永远不会被调用。 我在互联网和这个网站上查了几个其他相关的问题,虽然他们远远不能令人满意。 我还看到,Game Center的沙箱服务器不可靠,对于某些人来说,尽pipe沙箱模式存在错误,但是生产版本仍然可以正常工作(这样做工作正常!),但是我不想冒这个风险。 有没有人遇到类似的问题与他们的多人游戏?

Hgeg,

你的代码没有问题。 您必须允许蜂窝数据用于需要用户许可的应用程序。

以下段落选自Apple的支持网站 :

在Foundation层,您可以使用NSMutableURLRequest上的setAllowsCellularAccess:方法来指定是否可以通过蜂窝连接发送请求。 您也可以使用allowsCellularAccess来检查当前值。

在Core Foundation层,您可以通过在打开从CFSocketStream或CFHTTPStream API获取的stream之前设置kCFStreamPropertyNoCellular属性来达到同样的效果。

在旧版本的iOS中,您可以继续使用kSCNetworkReachabilityFlagsIsWWAN作为确定是否通过蜂窝连接发送stream量的最佳方式,但您应该了解其限制。

祝你好运

伊曼

根据最新的苹果新闻,从iOS 9开始,沙盒模式将不再存在,而是沙箱,你将拥有一个统一的环境。 统一的宣言

因此,您将只有一个统一的环境,您可以共享相同的帐户,这应该解决SandBox模式中的所有常见问题。

新的统一系统,它也与TestFlight兼容,所以你将能够testing你跨多个设备和帐户的代码。

所有这些变化将由苹果公司直接进行,所以唯一能够做的就是等到他们更新到新系统,到目前为止,这是确保它不是沙盒问题的唯一方法。 欲了解更多信息,请在WWDC video中获得战利品

根据您向我们显示的代码,无论连接types,3G还是其他方式,都不应该有任何问题; 然而,如果你之前散布的代码被用于连接状态的exception处理或者代表加载状态的graphics,那么在逻辑上某些事情可能会被捆绑在其他地方,并在游戏逻辑中产生这个错误。 即使是一个腐败的微调graphics也可能成为一个问题。

你有没有在代码中的任何其他exception处理程序称为以下内容:

 request.playersToInvite 

要么

 request.playerGroup 

要么

那改变了一个装载机图层特征?