2016-06-11 2 views
1

Wie kann man eine Match-Einladung programmatisch mit der Standardbenutzeroberfläche von GameKit akzeptieren?GKTurnBasedMatch, wie man eine neue Einladung zum Spiel akzeptiert

ich sehe eine expectedState = "eingeladen" foundState = "Aktiv" Ausnahme

Optional(Error Domain=GKErrorDomain Code=22 
"The requested operation could not be completed because the specified participant is invalid." 
UserInfo={GKServerStatusCode=5097, 
NSLocalizedDescription=The requested operation could not be completed because the specified participant is invalid., 
NSUnderlyingError=0x14fa2cf70 { 
Error Domain=GKServerErrorDomain Code=5097 "status = 5097, 
Unexpected slot state expectedState="Invited" foundState="Active" 

Die Ausnahme unter folgendem Szenario eintritt:
Spieler 1 - Erstellt ein neues Spiel mit dem Spieler 2
Spieler 1 - Macht den ersten Zug
Spieler 2 - Versuche, Daten aus dem rundenbasierten Spiel & zu laden, akzeptieren die Einladung zum Spiel.

Ich benutze die Standard-Benutzerschnittstelle von iOs für Match-Making. GKTurnBasedMatchmakerViewController

Anfordern eines neuen Spiel

let matchRequest = GKMatchRequest() 
matchRequest.minPlayers = 2 
matchRequest.maxPlayers = 2 
matchRequest.defaultNumberOfPlayers = 2 
matchRequest.inviteMessage = "Play BoxTheDots with me" 
matchRequest.recipientResponseHandler = self.matchMaker?.recipientResponse 

let matchView = GKTurnBasedMatchmakerViewController(matchRequest: matchRequest) 
self.presentViewController(matchView, animated: true, completion: nil) 
matchView.turnBasedMatchmakerDelegate = self.matchMaker?.matchViewController 

ich programmatisch das Spiel Einladung bin zu akzeptieren, die verursacht, und das Drucken der Fehler.

Der Code Fluss geht von den GKTurnBasedMatchmakerViewControllerDelegate didFindMatch method

func turnBasedMatchmakerViewController(viewController: GKTurnBasedMatchmakerViewController, didFindMatch match: GKTurnBasedMatch){ 
    match.loadMatchDataWithCompletionHandler(self.matchDataLoaded)  
    match.acceptInviteWithCompletionHandler(self.acceptInvite) 
} 

private func acceptInvite(match:GKTurnBasedMatch?, error:NSError?){ 
    guard error == nil else { 
     LogUtil.log(.CRITICAL, sub: .ERROR, o: self, method: method, msg: "could not accept match invite. \(error)") 
     return 
    } 
} 

Spielern 1 nach der ersten Kurve macht enter image description here

Spieler 2 vor dem Laden Spiel von Spieler 1 enter image description here

+0

Fügen Sie bitte den Codeblock hinzu, in dem Sie 'acceptInviteWithCompletionHandler' anrufen. – Thunk

+0

@Thunk Ich habe oben Bearbeitungen vorgenommen, um den Anruf einzuschließen. Ich stecke immer noch auf diesem einen :( – sdc

Antwort

0

antwortete ich eine Frage zu vollständig programmgesteuert behandelt Runden-basierte Übereinstimmungen here, und obwohl die Frage auf diese Seite ist über die Verwendung des Standards GKTurnBasedMatchMakerViewController, ich glaube, die Informationen in diesem Beitrag könnte hilfreich sein.

Was man will, ist natürlich eine einfache Delegat-Funktion namens localPlayerDidAcceptInvitation(...). Aber in Ermangelung dessen könnten die Informationen, die unter diesem Link zur Verfügung stehen, hilfreich sein, um etwas zusammenzuarbeiten, das funktioniert.

Verwandte Themen