Tworzę grę dla wielu graczy na iOS i czytam materiał w Apple Developer Center, a konkretnie pod numerem this one. Tu jest mój kodu niestandardowego kojarzeń, który jest dość prosta:Gra kojarzeń GameKit kończy się niepowodzeniem w przypadku połączeń 3G
- (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];
}
}
}];
}
Jednak nie swatanie gdy jedno lub więcej urządzeń są podłączone do Internetu za pośrednictwem sieci komórkowych. Kiedy zbadałem podstawowy błąd, dowiedziałem się, że nawet jeśli jest to wifi do wifi, obsługa zakończenia nie działa zgodnie z przeznaczeniem. Oznacza to, że match.expectedPlayerCount
nigdy 0. Zamiast tego, gra rozpoczyna się, gdy - (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state
obsługi jest wywoływana po obsługi zakończenia następująco:
...
- (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;
...
Problem teraz jest, jeśli urządzenie jest połączone z 3G (i dopasowane-sort of) didChangeState
nigdy nie jest wywoływana. Sprawdziłem kilka innych powiązanych pytań w Internecie i na tej stronie, chociaż są one dalekie od zadowalających. Czytałem również, że serwery Sandbox Game Center nie są niezawodne i dla niektórych osób wersja produkcyjna działała idealnie (po prostu działa!) Pomimo błędów w trybie piaskownicy, ale nie chcę podejmować tego ryzyka. Czy ktoś miał podobny problem z grą wieloosobową?
Wystarczy szybki wgląd. Czy twój serwer jest otwarty przez Internet, czy pracujesz w sieci LAN? Domyślam się, że to pierwszy, ale jeśli ktoś zapłacił mi pensa za każdym razem, gdy miałem takie proste problemy z infrastrukturą, nie zauważając, byłbym już dość bogaty :) Jeśli nie jest otwarty w całym Internecie, powinieneś przełożyć swoje urządzenie VPN – Bartserk
Tak więc, aby było jasne, mówisz, że jeśli urządzenie łączy się z meczem za pomocą 3g didChangeState nigdy nie jest wywoływane? Ponieważ powinien być wywoływany za każdym razem, gdy nowy gracz łączy się z meczem. To tam powinieneś sprawdzić oczekiwaną liczbę graczy na 0. –