我正在为iOS制作多人游戏,我在Apple开发者中心阅读了这些材料,特别是this one . 这是我的自定义配对代码,非常简单:
- (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];
}
}
}];
}
然而,当一个或多个设备通过蜂窝网络连接到互联网时,匹配失败 . 当我调查底层错误时,我发现即使它是wifi到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的沙盒服务器不可靠,有些人的 生产环境 版本工作得很好(它只是工作!)尽管沙盒模式有错误,但我不想冒这个风险 . 有没有人在他们的多人游戏中遇到过类似的问题?
3 回答
Hgeg,
您的代码没有任何问题 . 您必须允许对您的应用程序使用蜂窝数据,这需要用户权限 .
从Apple's support website中选择以下段落:
祝好运
伊曼
根据最新的苹果新闻,从iOS 9开始,沙盒模式将不再存在,而不是沙箱,你将拥有一个统一的环境 .
因此,您将只有一个可以共享相同帐户的统一环境,这应该可以解决SandBox模式中的所有常见问题 .
新的统一系统它还与TestFlight兼容,因此您可以跨多个设备和帐户测试代码 .
所有这些变化都将由苹果公司直接进行,因此唯一认为你可以做到这一点的唯一方法就是确保它不是沙盒问题 . 欲了解更多信息,请在WWDC上获得战利品video
根据您向我们展示的代码,无论连接类型如何,3G都不应该出现任何问题;但是,如果您之前散布了与连接状态绑定的异常处理代码,或者代表加载状态的图形,那么某些东西可能会在逻辑上与其他地方捆绑在一起并在游戏逻辑中产生此错误 . 即使腐败的微调图形也可能成为一个问题 .
您是否在代码中有任何其他异常处理程序调用以下内容:
要么
要么
那改变了装载机层的特征?