Приглашения на основе iMessaged для GameCenter для iOS 10
Я пытаюсь обновить свое приложение для корректной работы с новыми функциями GameCenter в iOS10.
Я создаю новый GKGameSession на device1, получаю URL-адрес общего доступа, и все это прекрасно работает. Я отправляю URL-адрес общего доступа через устройство обмена данными на устройство 2.
Device2 нажимает на ссылку, устройство кратко отображает "Получение...", а затем запускает мое приложение. Большой! Но что теперь? Есть ли контекстная информация для этого URL, к которой я могу как-то получить доступ? В противном случае я не знаю, как реагировать на запуск приложения.
Ранее вы получали обратный вызов к чему-то, придерживающемуся протокола GKLocalPlayerListener, к методу player:didAcceptInvite:, и вы могли присоединиться к совпадению таким образом. Но с этими сообщениями на основе iCloud, игрок может даже не войти в GameCenter, верно? Эта часть, кажется, была затушевана в презентации WWDC.
Кроме того, на сегодняшний день (28.12.2016) нет документации Apple по этим новым методам.
2 ответа
Поскольку сеанс обратного вызова GKGameSessionEventListener:didAddPlayer: запускается, только если игра уже запущена, чтобы быть уверенным, что вы можете обрабатывать этот обратный вызов каждый раз, когда требуется обходной путь. Я проверил это, и это работает.
Когда вы отправляете в игру iMessage или приглашение по электронной почте, не включайте в сообщение URL-адрес приглашения на игровую сессию. Вместо этого используйте зарегистрированный URL, который откроет ваше приложение при открытии на устройстве, на котором установлено ваше приложение. Проверьте здесь, чтобы увидеть, как:
Полное руководство по пользовательским схемам URL iOS
Но добавьте в качестве параметра к этому URL добавленную в процентах кодировку URL-адреса приглашения к игре в качестве параметра (я предполагаю, что URL-адрес регистрируется, например, newGameRequest, но лучше будет сделать его совершенно уникальным или даже лучше - хотя это требует дополнительной настройки)., попробуйте Universal Link Support, так как это позволит вам направлять пользователей, у которых ваше приложение не установлено, на веб-страницу со ссылкой для скачивания)
let openOverWordForPlayerChallenge = "newGameRequest://?token="
gameState.gameSession?.getShareURL { (url, error) in
guard error == nil else { return }
// No opponent so we need to issue an invite
let encodedChallengeURL = url!.absoluteString.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)
let nestedURLString = openOverWordForPlayerChallenge + encodedChallengeURL!
let nestedURL = URL(string: nestedURLString)!
}
отправить URL-адрес в сообщении или электронной почте или WhatsApp или что-то еще. Затем в делегате приложения добавьте следующее:
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
var success = false
if let queryString = url.query {
if let urlStringToken = queryString.removingPercentEncoding {
let token = "token="
let startIndex = urlStringToken.startIndex
let stringRange = startIndex..<urlStringToken.index(startIndex, offsetBy: token.characters.count)
let urlString = urlStringToken.replacingOccurrences(of: token, with: "", options: .literal, range: stringRange)
if let url = URL(string: urlString) {
if UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
success = true
}
}
}
}
return success
}
Теперь вы можете быть уверены, что сессия:didAddPlayer: будет вызвана. Что делать ставки этот обходной путь хорош в течение 2 недель, и они исправят это в следующем выпуске iOS, показанном на WWDC 2017! Обновление: эта проблема не была исправлена - так что обходной путь остается хорошим!
Я согласен, отсутствие документации расстраивает. Из того, что я вижу, мы должны:
- добавлять
<GKGameSessionEventListener>
протокол в заголовке класса - затем
session:didAddPlayer:
запускается на устройстве присоединяющегося игрока после принятия ссылки приглашения.
обновление: к сожалению, я не удивлен, услышав ваши результаты. Я не пробовал все эти сценарии, но GKTurnBasedMatch
были похожие недостатки. То, как я обошел это, было следующим: я добавил список статусов игроков для соответствия данным (приглашен, активен, вышел и т. Д.). Я дал игроку вид "ожидающих приглашений". Когда они открывали это представление, я загружал все их совпадения и отображал записи, в которых игрок находился в приглашенном состоянии. С GKGameSession это тоже должно работать.
Или было бы проще, если бы вы могли вести локальный список сессий, о которых вам известно. Всякий раз, когда игра становится активной, вытащите весь список сеансов с сервера и найдите новую запись. Новая запись должна соответствовать совпадению игрока, только что принявшего щелчок по URL ссылки.