由于GKGameSessionEventListener回调session:didAddPlayer:只有在游戏已经运行时才触发,为了确保每次都能处理这个回调,需要采用一种解决方法。我已经测试过并且可行。
当您向游戏发送iMessage或电子邮件邀请时,请不要直接在消息中包含游戏会话邀请URL。而是使用注册的URL,当在安装了您的应用程序的设备上打开时,将打开您的应用程序。在此处查看如何操作:
iOS自定义URL方案完整教程
但是,请将游戏邀请URL的百分号转义编码作为参数添加到此URL中,就像这样(我假设注册了一个URL,例如newGameRequest,但最好使其非常独特,或者更好-虽然它需要更多设置,但尝试通用链接支持,因为这将允许您将用户引导到一个带有下载链接的网页,即使他们没有安装您的应用程序)
let openOverWordForPlayerChallenge = "newGameRequest://?token="
gameState.gameSession?.getShareURL { (url, error) in
guard error == nil else { return }
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
}
现在你可以确信session:didAddPlayer:方法会被调用。这个解决方法可能只能持续两周左右,因为他们可能在2017 WWDC展示的下一个iOS版本中修复这个问题!更新:这个问题还没有被解决 - 所以上面的解决方法仍然有效!