【问题标题】:iMessaged-based invitations for GameCenter for iOS 10适用于 iOS 10 的 GameCenter 基于 iMessaged 的​​邀请
【发布时间】:2016-12-29 01:32:14
【问题描述】:

我正在尝试更新我的应用程序以与 iOS10 中 GameCenter 的新功能正常工作。

我在 device1 上创建了一个新的 GKGameSession,获取了一个共享 URL,一切正常。我通过共享表将共享 URL 发送到设备 2。

Device2 单击链接,设备短暂显示“正在检索...”,然后启动我的应用程序。伟大的!但是,现在呢?我可以通过某种方式访问​​此 URL 是否有可用的上下文信息?否则我无法在应用启动时做出响应。

以前,您会收到对遵循 GKLocalPlayerListener 协议的内容的回调,方法是 player:didAcceptInvite:,您可以通过这种方式加入比赛。但是有了这些基于 iCloud 的消息,玩家甚至可能没有登录到 GameCenter,对吧?这部分似乎在 WWDC 演示文稿中被掩盖了。

此外,截至今天(2016 年 12 月 28 日),没有关于这些新方法的 Apple 文档。

【问题讨论】:

  • 嗨,肖恩,你能接受我的回答吗?我认为这是您最接近解决方案的方法。这是一个很好的解决方法。

标签: ios ios10 game-center multiplayer gkgamesession


【解决方案1】:

由于 GKGameSessionEventListener 回调 session:didAddPlayer: 仅在游戏已经运行时才会触发,因此要确保每次都可以处理此回调,因此需要解决此问题。我已经对此进行了测试,并且可以正常工作。

当您向游戏发送 iMessage 或电子邮件邀请时,请勿在消息中直接包含游戏会话邀请 URL。而是使用注册的 URL,当在安装了您的应用程序的设备上打开您的应用程序时,该 URL 将打开您的应用程序。在这里查看方法:

Complete Tutorial on iOS Custom URL Schemes

但是添加游戏邀请 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)!
}

通过消息、电子邮件或 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 版本中解决了这个问题!更新:这个问题还没有解决 - 所以上面的解决方法仍然很好!

【讨论】:

    【解决方案2】:

    我同意,缺乏文档令人沮丧。据我所知,我们必须:

    • 在类头中添加&lt;GKGameSessionEventListener&gt;协议
    • 然后session:didAddPlayer: 在接受邀请链接后在加入 玩家的设备上触发。

    更新: 不幸的是,听到你的结果我并不感到惊讶。我没有尝试过所有这些场景,但GKTurnBasedMatch 有类似的缺点。我解决它的方法是:我添加了一个玩家状态列表以匹配数据(受邀、活跃、退出等)。我给玩家一个“待处理邀请”的视图。当他们打开那个视图时,我会加载他们所有的比赛并显示玩家处于邀请状态的条目。使用 GKGameSession,这也应该有效。

    或者,如果您可以维护您知道的本地会话列表,可能会更容易。每当游戏激活时,从服务器中拉出整个会话列表并寻找新条目。新条目必须与玩家刚刚通过单击共享 URL 接受的匹配。

    【讨论】:

    • 我检查了,这可行,假设加入的玩家已经安装了应用程序并且它在后台运行。如果不是,则在应用冷启动时不会调用此方法。如果你有不同的看法,请回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多