2016-07-19 3 views
0

Mein Aufruf von endMatchInTurnWithMatchData führt zu der Verbindung zu Service unterbrochen Fehler. Irgendwelche Tipps, worauf Sie achten sollten, um dieses Problem zu diagnostizieren? Xcode 7.3.1, Bereitstellungsziel 9.3endMatchInTurnWithMatchData results in "Die Verbindung zum Dienst namens com.apple.gamed wurde unterbrochen"

-(void)sendGameOver { 
    GKTurnBasedMatch *currentMatch = [[GameKitHelper sharedGameKitHelper] currentMatch]; 

    // set the game outcome property for the current participant 
    GKTurnBasedMatchOutcome otherOutcome; 
    if (self.youAre == game.winningPlayer) { 
     [currentMatch.currentParticipant setMatchOutcome:GKTurnBasedMatchOutcomeWon]; 
     otherOutcome = GKTurnBasedMatchOutcomeLost; 
    } else { 
     [currentMatch.currentParticipant setMatchOutcome:GKTurnBasedMatchOutcomeLost]; 
     otherOutcome = GKTurnBasedMatchOutcomeWon; 
    } 

    // all other (only one other) participants get opposite outcome 
    for (GKTurnBasedParticipant *nextParticipant in currentMatch.participants) { 
     if (![nextParticipant isEqual:currentMatch.currentParticipant]) { 
      [nextParticipant setMatchOutcome:otherOutcome]; 
     } 
    } 

    // prepare match data 
    NSDictionary *turn = [NSDictionary dictionaryWithObjects:@[game] 
               forKeys:@[gameKey]]; 
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:turn]; 

    NSArray *achievements = [self achievementsToReport:currentMatch]; 
    NSArray *scores = [self scoresToReport:currentMatch]; 

    [currentMatch endMatchInTurnWithMatchData:data scores:scores achievements:achievements completionHandler:^(NSError * _Nullable error) { 
     if (error) { 
      NSLog(@"%@", error); 
      [self setGamePopUpMessage:@"Oops, there was a problem. Try that again."]; 
     } 
    }]; 

} 

Antwort

0

Irgendwie scheint das Problem innerhalb der Berichterstattung über die Erfolge zu sein. Wenn ich ein leeres Array für Errungenschaften sende, ist der Fehler weg. Aber sobald ich versuche, mit dem endMatch die Leistungsinformationen zu übergeben, ist der Fehler zurück.

So fahre ich fort, um den Fehler zu erhalten „Verbindung mit dem Namen zu einem Dienst com.apple.gamed unterbrochen wurde“, wenn ich

endMatchInTurnWithMatchData: scores: achievements: completionHandler: 

Allerdings, wenn ich (als Behelfslösung) verwenden

endMatchInTurnWithMatchData: completionHandler: 

unmittelbar gefolgt von:

GKAchievement reportAchievements: withCompletionHandler: 

dann scheint alles richtig zu arbeiten.

+0

außer dass ich jetzt keine Erfolge für meinen Gegner melden kann. Es ist in meinem Spiel möglich, dass ein Spieler einen Zug macht, der ihn sofort verliert. In diesem Fall möchte ich einen meiner Gegner erreichen, weil sie gewonnen haben. Aber ich bekomme den Fehler: GKAchievement kann nur für einen anderen Spieler eingereicht werden, wenn ein rundenbasiertes Match beendet wird. Das lässt mich denken, dass ich zurück zu verwenden muss: endMatchInTurnWithMatchData: scores; Erfolge: AbschlussHandler: – Gwendyl

0

Das ursprüngliche Problem bestand darin, dass ich selbst eine Reihe von Errungenschaften erstellte, wobei ich GKAchievement initWithIdentifire in allen Fällen verwendete, sogar für Errungenschaften, die bereits in früheren Matches für den Spieler gemeldet worden waren. Der richtige Ansatz bestand darin, zuerst loadAchievementsWithCompletionHandler aufzurufen, um alle Errungenschaften zu übernehmen, die bereits für den Player bekannt sind, und dann die relevanten zu aktualisieren. Bei Bedarf kann ein neues GKAchievement zu diesem Array hinzugefügt werden. Aber der Schlüssel ist, das Array richtig zu initialisieren. Nachdem ich das alles behoben hatte, konnte ich das Achievements-Array mit endMatchInTurnWithMatchData: scores: achievements: completionHandler: korrekt senden und erhielt meinen ursprünglichen Fehler 'connection service namens com.apple.gamed wurde unterbrochen' nicht mehr. JEDOCH

...

Mein Spiel ist ein Zwei-Personen-Spiel, wobei es möglich ist, dass jemand eine Umdrehung (oder versehentlich nimmt eine Wendung) wodurch sie sofort verlieren nehmen gezwungen werden. Ich wollte in diesem Fall eine Leistung ihres Gegners erhöhen (der gerade gewonnen hat). Es scheint jedoch, dass Sie die Erfolge der Gegner nicht erhöhen können, da Sie nicht wissen können, wie hoch der erreichte Erfolg war.

Mein Umweg, der nicht ideal ist, ist, dass der Spieler, der das Spiel verloren hat, alle Errungenschaften meldet, die er gewonnen hat (im Moment nicht, aber man weiß es nie ....). Der gewinnende Spieler, der an der Reihe war, wird seinen Erfolg nach Erhalt der "matchEnded" Nachricht melden. Unglücklicherweise bedeutet dies, dass wenn sie das Spiel nie eröffnen, sie ihre Leistung nicht erhöhen. Nicht ideal.

Verwandte Themen