我试图更新我的应用程序,以便在iOS10中使用GameCenter的新功能正常工作。
我在device1上创建了一个新的GKGameSession,获得了一个共享URL,一切正常。我通过共享表将共享URL发送到设备2。
Device2点击该链接,设备会短暂显示'正在检索...'然后启动我的应用程序。大!但是,现在呢?我可以以某种方式访问此URL的上下文信息吗?否则,我无法在启动应用程序时做出响应。
以前,你可以回复一下遵循GKLocalPlayerListener协议的东西,方法播放器:didAcceptInvite :,你可以通过这种方式加入匹配。但是使用这些基于iCloud的消息,播放器可能甚至没有登录到GameCenter,对吧?这部分似乎已经在WWDC演示中被掩盖了。
此外,截至今天(2016年12月28日),没有关于这些新方法的Apple文档。
答案 0 :(得分:1)
由于GKGameSessionEventListener回调会话:didAddPlayer:仅在游戏已经运行时触发,因此确保每次需要解决时都可以处理此回调。我已对此进行了测试,但确实有效。
当您向游戏发送iMessage或电子邮件邀请时,请勿在邮件中直接添加游戏会话邀请URL。而是使用在安装了应用程序的设备上打开应用程序时打开应用程序的注册URL。点击这里查看:
Complete Tutorial on iOS Custom URL Schemes
但是,将游戏邀请网址的百分比转义编码作为参数添加到此网址(我假设注册了网址,例如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)!
}
通过邮件或电子邮件或WhatsApp等发送URL。然后在您的app delegate中添加以下内容:
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个星期的好处,他们在2017年WWDC上展示的iOS下一个版本中解决了这个问题!更新:此问题尚未修复 - 因此上面的解决方法仍然很好!
答案 1 :(得分:0)
我同意,缺乏文件令人沮丧。从我所看到的,我们必须:
<GKGameSessionEventListener>
协议
session:didAddPlayer:
在接受邀请链接后激活加入播放器的设备。 <强>更新强>
不幸的是,听到你的结果我并不感到惊讶。我没有尝试过所有这些场景,但GKTurnBasedMatch
也有类似的缺点。我绕过它的方式是:我添加了一个播放器状态列表来匹配数据(邀请,活动,退出等)。我给了玩家一个“待处理的邀请”的视图。当他们打开该视图时,我会加载他们所有的匹配并显示玩家处于邀请状态的条目。使用GKGameSession,这应该也可以。
或者,如果您可以维护您知道的本地会话列表,则可能会更容易。每当游戏变为活动状态时,从服务器中提取整个会话列表并查找新条目。新条目必须是通过单击共享URL接受的玩家匹配。