GameKit配对无法实现3G连接

Hge*_*geg 35 objective-c gamekit ios

我正在为iOS制作多人游戏,我在Apple开发者中心阅读了这个材料,特别是这个.这是我的自定义配对代码,非常简单:

- (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];
            }

        }
    }];  
}
Run Code Online (Sandbox Code Playgroud)

然而,当一个或多个设备通过蜂窝网络连接到互联网时,匹配失败.当我调查底层错误时,我发现即使它是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;
...
Run Code Online (Sandbox Code Playgroud)

现在的问题是,如果连接3g的设备(并且匹配排序)didChangeState从不被调用.我在互联网和本网站上查了几个其他相关问题,虽然它们远非令人满意.我还读到Game Center的沙盒服务器不可靠,有些人生产版本工作得很好(它只是工作!)尽管沙盒模式有错误,但我不想冒这个风险.有没有人在他们的多人游戏中遇到过类似的问题?

Ima*_*man 2

赫格格,

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

以下段落摘自Apple的支持网站

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

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

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

祝你好运

伊曼