2016-12-29 9 views
3

Я пытаюсь обновить приложение для корректной работы с новыми функциями GameCenter в iOS10.Приглашения на iMessaged для GameCenter для iOS 10

Я создаю новый GKGameSession на устройстве1, получаю URL-адрес для совместного использования, и все это работает нормально. Я отправляю URL-адрес общего доступа через общий лист на устройство 2.

Устройство2 щелкает ссылку, устройство на короткое время отображает «Извлечение ...», а затем запускает мое приложение. Большой! Но что теперь? Имеется ли контекстная информация для этого URL-адреса, доступ к которой я могу получить? В противном случае у меня нет способа ответить, когда приложение будет запущено.

Раньше вы получали обратный вызов к чему-то, подключенному к протоколу GKLocalPlayerListener, к игроку метода: didAcceptInvite :, и вы могли бы присоединиться к этому матчу. Но с этими сообщениями, основанными на iCloud, плеер, возможно, даже не войдет в GameCenter, верно? Эта часть, похоже, была затушевана в презентации WWDC.

Также на сегодня (12/28/2016) нет документации Apple по этим новым методам.

+0

Привет, Шон, не могли бы вы принять мой ответ? Я думаю, что это самое близкое вам решение. Это хороший способ обхода. – TheBasicMind

ответ

1

Поскольку сеанс обратного вызова GKGameSessionEventListener: didAddPlayer: запускается только в том случае, если игра уже запущена, чтобы вы могли обрабатывать этот обратный вызов каждый раз, когда требуется работа. Я тестировал это, и он работает.

Когда вы отправляете приглашение iMessage или электронной почты в игру, не включайте URL-адрес приглашения в сеанс игры непосредственно в сообщении. Вместо этого используйте зарегистрированный URL-адрес, который откроет ваше приложение при открытии на устройстве, на котором установлено ваше приложение. Проверьте здесь, чтобы посмотреть, как:

Complete Tutorial on iOS Custom URL Schemes

Но добавить процент спасся кодирование игр приглашают URL в качестве параметра этого URL Thusly (я предполагаю регистрацию 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! Обновление: эта проблема не была исправлена ​​- так что обходной путь выше по-прежнему хорош!

0

Согласен, недостаток документации разочаровывает. Из того, что я могу видеть, что мы должны:

  • добавить <GKGameSessionEventListener> протокола в заголовке класса
  • Тогда session:didAddPlayer: пожары на соединение устройства игрока после принятия приглашения ссылки.

обновление: К сожалению, я не удивлен услышать ваши результаты. Я не пробовал все эти сценарии, но у GKTurnBasedMatch были подобные недостатки. То, как я его обошел, было: я добавил список статусов игроков для сопоставления данных (приглашенных, активных, брошенных и т. Д.). Я дал игроку представление о «ожидающих приглашениях». Когда они открыли эту точку зрения, я бы загрузил все их матчи и отобразил записи, в которых игрок находился в приглашенном состоянии. С GKGameSession это тоже должно работать.

Возможно, было бы проще, если бы вы могли поддерживать локальный список сеансов, о котором вы знаете. Всякий раз, когда игра становится активной, вытащите весь список сеансов с сервера и найдите новую запись. Новая запись должна соответствовать тому, что только что принял игрок, щелкнув URL-адрес общего доступа.

+0

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