GKTurnBasedMatch как принять приглашение на новый матч

Как правильно программно принять приглашение на матч со стандартным пользовательским интерфейсом GameKit?

Я вижу исключение expectedState="Invited" foundState="Active"

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"

Исключение возникает в следующем сценарии:
Игрок 1 – создает новый матч с игроком 2
Игрок 1 – делает первый ход
Игрок 2 – пытается загрузить данные из пошагового матча и принять матч приглашение.

Я использую стандартный пользовательский интерфейс iOS для подбора игроков. GKTurnBasedMatchmakerViewController

Запрос нового совпадения

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

Я принимаю приглашение на матч программно, что вызывает и печатает ошибку.

Поток кода начинается с метода GKTurnBasedMatchmakerViewControllerDelegate didFindMatch

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
    }
}

Игрок 1 после первого хода введите здесь описание изображения

Игрок 2 перед загрузкой совпадения с игроком 1 введите здесь описание изображения


person sdc    schedule 11.06.2016    source источник
comment
Пожалуйста, добавьте блок кода, где вы вызываете acceptInviteWithCompletionHandler   -  person Thunk    schedule 15.06.2016
comment
@Thunk Я внес изменения выше, чтобы включить вызов. Я до сих пор застрял на этом :(   -  person sdc    schedule 16.06.2016


Ответы (1)


Я ответил на вопрос о полностью программно обрабатываемых пошаговых совпадениях здесь, и хотя вопрос по этому посвящена использованию стандартного GKTurnBasedMatchMakerViewController, я считаю, что информация в этом посте может быть полезной.

Конечно, нам нужна простая функция делегата с именем localPlayerDidAcceptInvitation(...). Но если этого не делать, информация, доступная по этой ссылке, может быть полезна для объединения чего-то работающего.

person Le Mot Juiced    schedule 07.03.2017