首页 文章

GameKit配对无法实现3G连接

提问于
浏览
35

我正在为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 回答

  • 1

    Hgeg,

    您的代码没有任何问题 . 您必须允许对您的应用程序使用蜂窝数据,这需要用户权限 .

    Apple's support website中选择以下段落:

    在Foundation层,您可以在NSMutableURLRequest上使用setAllowsCellularAccess:方法来指定是否可以通过蜂窝连接发送请求 . 您还可以使用allowsCellularAccess检查当前值 . 在Core Foundation层,您可以通过在打开从CFSocketStream或CFHTTPStream API获取的流之前设置kCFStreamPropertyNoCellular属性来实现相同的功能 . 在旧版本的iOS中,您可以继续使用kSCNetworkReachabilityFlagsIsWWAN作为确定是否通过蜂窝连接发送流量的最佳方法,但您应该了解其局限性 .

    祝好运

    伊曼

  • 2

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

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

    新的统一系统它还与TestFlight兼容,因此您可以跨多个设备和帐户测试代码 .

    所有这些变化都将由苹果公司直接进行,因此唯一认为你可以做到这一点的唯一方法就是确保它不是沙盒问题 . 欲了解更多信息,请在WWDC上获得战利品video

  • 0

    根据您向我们展示的代码,无论连接类型如何,3G都不应该出现任何问题;但是,如果您之前散布了与连接状态绑定的异常处理代码,或者代表加载状态的图形,那么某些东西可能会在逻辑上与其他地方捆绑在一起并在游戏逻辑中产生此错误 . 即使腐败的微调图形也可能成为一个问题 .

    您是否在代码中有任何其他异常处理程序调用以下内容:

    request.playersToInvite
    

    要么

    request.playerGroup
    

    要么

    那改变了装载机层的特征?

相关问题