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