Подтвердить что ты не робот

Матч GameKit не подходит для 3G-соединений

Я делаю многопользовательскую игру для iOS, и я читаю материал в Apple Developer Center, в частности этот. Вот мой код для пользовательского matchmaking, который довольно прост:

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

        }
    }];  
}

Тем не менее, matchmaking терпит неудачу, когда одно или несколько устройств подключены к Интернету через сотовые сети. Когда я исследовал основную ошибку, я обнаружил, что даже если это wifi-wifi-case, обработчик завершения не работает должным образом. То есть 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 ненадежны, и для некоторых людей производственная версия отлично работает (она работает!), Несмотря на ошибки в режиме песочницы, но я не хочу рисковать. Кто-нибудь сталкивался с подобной проблемой с их многопользовательской игрой?

4b9b3361

Ответ 1

Hgeg,

В коде нет ничего плохого. Вы должны разрешить использование сотовых данных в своем приложении, которое нуждается в разрешениях пользователей.

Следующий абзац выбран из веб-сайта поддержки Apple:

На слое Foundation вы можете использовать setAllowsCellularAccess: метод в NSMutableURLRequest, чтобы указать, можно ли отправить запрос через сотовую связь. Вы также можете использовать allowCellularAccess для проверки текущего значения.

На уровне Core Foundation вы можете добиться того же установив свойство kCFStreamPropertyNoCellular перед тем, как открыть поток, полученный из API CFSocketStream или CFHTTPStream.

В старых версиях iOS вы можете продолжать использовать kSCNetworkReachabilityFlagsIsWWAN как наилучший способ определения будет ли трафик передаваться через сотовую связь, но вы должен знать свои ограничения.

Удачи.

Иман

Ответ 2

Согласно последним новостям из Apple, с iOS 9 режим песочницы больше не будет существовать, вместо песочницы у вас будет одна унифицированная среда. Унифицированное envoiroment

Таким образом, у вас будет только одна унифицированная среда, в которой вы можете использовать одни и те же учетные записи, это должно решить все обычные проблемы из режима SandBox.

Новая унифицированная система также совместима с TestFlight, поэтому вы сможете протестировать свой код на нескольких устройствах и учетных записях.

Все эти изменения будут сделаны непосредственно яблоком, так что только подумайте, что вы можете сделать это, чтобы дождаться, пока они не перейдут на новую систему, пока это единственный способ убедиться, что это не проблема с Sand Box. Для получения дополнительной информации см. Добычу на WWDC video

Ответ 3

На основе кода, который вы нам показали, не должно быть никаких проблем, независимо от типа подключения, 3G или иным образом; однако, если вы ранее вставляли код для обработки исключений, который был привязан к состоянию соединения или для графики, представляющей состояние загрузки, что-то можно было логически связать в другом месте и произвести эту ошибку на этом этапе в логике игры. Даже поврежденная графическая строка может стать проблемой.

Были ли у вас какие-либо другие обработчики исключений в коде, который вызывал следующее:

request.playersToInvite

или

request.playerGroup

или

который изменил характеристику уровня загрузчика?