Как перечислить все доступные 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. Мне нужно было сделать это:
- Зайдите в Мое приложение> Магазин приложений> Подготовьтесь к отправке и переключите переключатель для Game Center
- Добавить таблицу лидеров, которую я ранее создал в разделе "Особенности"
Позже я постараюсь удалить таблицу лидеров и посмотреть, работает ли она по-прежнему. Реальное приложение не будет иметь таблицы лидеров.
Моя путаница заключалась в том, что я не получал ошибку "неопознанная игра", и мне удавалось создавать матчи, играть ходы, перечислять друзей игрока, но не перечислять матчи.
Сложно сказать по фрагменту, который вы показали. Вещи для двойной проверки:
- Где вы создаете спички? Вы, вероятно, уже знаете это, но на всякий случай: loadMatchesWithCompletionHandler показывает совпадения, которые вы создали, пригласили или присоединились. Он не показывает все матчи там, ожидающие игроков.
- Обработчик завершения для представления контроллера представления входа никогда не будет успешно загружать совпадения. Этот обработчик завершения сработает, как только контроллер представления входа в систему будет успешно отображен. Он не ждет, пока вы действительно отправите учетные данные для входа. Так что попытка загрузки совпадений произойдет до того, как вы авторизуетесь, и всегда будет возвращать ноль.
- Ваш обработчик завершения будет вызван в двух случаях. Это происходит один раз, когда вы устанавливаете обработчик завершения, как и следовало ожидать. Он будет вызван снова после завершения работы контроллера представления входа в систему (если отображается). Во втором случае вы можете получить ошибки, если пользователь отменил или не смог войти в систему. Или вы окажетесь авторизованным пользователем, вошедшим в систему без VC.
- В вашей цепочке аутентификации есть несколько предположений, которые не всегда срабатывают:
Вы предполагаете, если .authenticated
если ДА, то вы вошли в систему. К сожалению, это не всегда так. GC сообщит ДА в условиях, когда он не может общаться с серверами GC, но использует кэшированные данные предыдущего сеанса. (Обычно, однако, вы на самом деле получаете сообщение об отсутствии аутентификации при попытке загрузить совпадения в этом состоянии)
Вы предполагаете, что если VC равен нулю, то вы аутентифицированы. Это тоже не всегда так. Если установлена ошибка, VC также будет нулевым. Всегда проверяйте значение ошибки первым делом в обработчике аутентификации. (Я не думаю, что это усугубляет вашу проблему сейчас, потому что еще раз: вы должны получить ошибку, если вы попытаетесь загрузить совпадения, когда вы на самом деле не аутентифицированы)
Если вам интересно, вы можете увидеть пример моего обработчика аутентификации, который улавливает множество крайних случаев и сбоев, по адресу /questions/26733075/kak-pravilno-vyipolnit-autentifikatsiyu-gamecenter/26733079#26733079