Приглашения на основе 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 ссылки.

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