由于 GKGameSessionEventListener 回调 session:didAddPlayer: 仅在游戏已经运行时才会触发,因此要确保每次都可以处理此回调,需要解决。我已经对此进行了测试,并且可以正常工作。
当您向游戏发送 iMessage 或电子邮件邀请时,请勿在消息中直接包含游戏会话邀请 URL。而是使用已注册的 URL,当在安装了您的应用程序的设备上打开您的应用程序时,该 URL 将打开您的应用程序。在这里查看如何:
iOS 自定义 URL 方案完整教程
但是添加游戏邀请 URL 的百分比转义编码作为此 URL 的参数(我假设注册了一个 url,例如 newGameRequest 但最好使它非常独特,甚至更好 - 尽管它需要更多设置,尝试通用链接支持,因为这将允许您将未安装您的应用程序的用户引导到带有下载链接的网页)
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)!
}
通过消息或电子邮件或 WhatsApp 或其他方式发送 URL。然后在您的应用委托中,添加以下内容:
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: 会被调用。有什么赌注这个 workarround 会持续大约 2 周,他们会在 WWDC 2017 展示的下一个 iOS 版本中解决这个问题!更新:这个问题还没有解决 - 所以上面的解决方法仍然很好!