Как перечислить все доступные GKTurnBasedMatches для игрока?

Я строю игру, используя пошаговые матчи Game Center.

Я хочу отобразить список всех доступных матчей. Я пытался использовать loadMatchesWithCompletionHandler(), но массив игр возвращается как nilи ошибка также возвращается как nil, Есть несколько текущих матчей.

Это то, что я до сих пор:

func authenticateLocalUser() {
    if !gameCenterAvailable { return }

    let player = GKLocalPlayer.localPlayer()
    if player.authenticated == false {
        player.authenticateHandler = {(viewController, error) -> Void in
            if viewController != nil && self.presentingViewController != nil
            {
                self.presentingViewController!.presentViewController(viewController!, animated: true, completion: {
                    GKLocalPlayer.localPlayer().registerListener(self)

                    GKTurnBasedMatch.loadMatchesWithCompletionHandler({games, error in
                        print(games)
                        if games != nil {
                            print(games!.count)
                        }else {
                            print(error)
                        }
                    })
                })
            } else {

                if player.authenticated == true {
                    GKLocalPlayer.localPlayer().registerListener(self)

                    GKTurnBasedMatch.loadMatchesWithCompletionHandler({games, error in
                        print(games)
                        if games != nil {
                            print(games!.count)
                        }else {
                            print(error)
                        }
                    })
                }
            }
        }
    } else {
        print("already authenticated")
    }
}

Я даже получаю nil при создании нового совпадения (оно напечатает только что созданное совпадение):

func findMatchWith(minPlayers: Int, maxPlayers: Int) {
    if !gameCenterAvailable { return }

    let request = GKMatchRequest()
    request.minPlayers = minPlayers
    request.maxPlayers = maxPlayers
    request.defaultNumberOfPlayers = 2

    GKLocalPlayer.localPlayer().loadFriendPlayersWithCompletionHandler({players, error in
        if error != nil {return}
        request.recipients?.append(players![0])

        GKTurnBasedMatch.findMatchForRequest(request, withCompletionHandler: { match, error in
            if error != nil {
                print(error?.localizedDescription)
                return
            }
            print(match)

            GKTurnBasedMatch.loadMatchesWithCompletionHandler({games, error in
                print(games)
                if games != nil {
                    print(games!.count)
                }else {
                    print(error?.localizedDescription)
                } 
            })
        })
    })
}

2 ответа

Решение

Это был не код. Так была настроена игра в iTunes Connect. Мне нужно было сделать это:

  1. Зайдите в Мое приложение> Магазин приложений> Подготовьтесь к отправке и переключите переключатель для Game Center
  2. Добавить таблицу лидеров, которую я ранее создал в разделе "Особенности"

Позже я постараюсь удалить таблицу лидеров и посмотреть, работает ли она по-прежнему. Реальное приложение не будет иметь таблицы лидеров.

Моя путаница заключалась в том, что я не получал ошибку "неопознанная игра", и мне удавалось создавать матчи, играть ходы, перечислять друзей игрока, но не перечислять матчи.

Сложно сказать по фрагменту, который вы показали. Вещи для двойной проверки:

  1. Где вы создаете спички? Вы, вероятно, уже знаете это, но на всякий случай: loadMatchesWithCompletionHandler показывает совпадения, которые вы создали, пригласили или присоединились. Он не показывает все матчи там, ожидающие игроков.
  2. Обработчик завершения для представления контроллера представления входа никогда не будет успешно загружать совпадения. Этот обработчик завершения сработает, как только контроллер представления входа в систему будет успешно отображен. Он не ждет, пока вы действительно отправите учетные данные для входа. Так что попытка загрузки совпадений произойдет до того, как вы авторизуетесь, и всегда будет возвращать ноль.
  3. Ваш обработчик завершения будет вызван в двух случаях. Это происходит один раз, когда вы устанавливаете обработчик завершения, как и следовало ожидать. Он будет вызван снова после завершения работы контроллера представления входа в систему (если отображается). Во втором случае вы можете получить ошибки, если пользователь отменил или не смог войти в систему. Или вы окажетесь авторизованным пользователем, вошедшим в систему без VC.
  4. В вашей цепочке аутентификации есть несколько предположений, которые не всегда срабатывают:

Вы предполагаете, если .authenticated если ДА, то вы вошли в систему. К сожалению, это не всегда так. GC сообщит ДА в условиях, когда он не может общаться с серверами GC, но использует кэшированные данные предыдущего сеанса. (Обычно, однако, вы на самом деле получаете сообщение об отсутствии аутентификации при попытке загрузить совпадения в этом состоянии)

Вы предполагаете, что если VC равен нулю, то вы аутентифицированы. Это тоже не всегда так. Если установлена ​​ошибка, VC также будет нулевым. Всегда проверяйте значение ошибки первым делом в обработчике аутентификации. (Я не думаю, что это усугубляет вашу проблему сейчас, потому что еще раз: вы должны получить ошибку, если вы попытаетесь загрузить совпадения, когда вы на самом деле не аутентифицированы)

Если вам интересно, вы можете увидеть пример моего обработчика аутентификации, который улавливает множество крайних случаев и сбоев, по адресу /questions/26733075/kak-pravilno-vyipolnit-autentifikatsiyu-gamecenter/26733079#26733079

Другие вопросы по тегам