【问题标题】:How to reliably determine which match got created in response to GKTurnBasedMatchmakerViewController success如何可靠地确定响应 GKTurnBasedMatchmakerViewController 成功创建了哪个匹配项
【发布时间】:2016-12-13 12:37:13
【问题描述】:

在 iOS 10 上,我尝试使用 GKTurnBasedMatchmakerViewController 创建匹配。我可以调出视图,以便用户可以选择匹配或邀请。我无法弄清楚如何可靠地确定为此创建了哪个匹配项。问题是,在 iOS 10 中,GKTurnBasedMatchmakerViewControllerDelegate 的 didFindMatch 方法已被弃用。该方法曾经与比赛一起调用。过去的日子很轻松!

弃用消息显示“使用 GKTurnBasedEventListener player:receivedTurnEventForMatch:didBecomeActive”。文档和堆栈溢出线程充满了调用该方法的原因。请参阅此线程以获得良好的列表:Gamecenter ios 9 GameCenter GKLocalPlayerListener methods not called。如果你想象一个用户已经玩了几款游戏,你会发现这个方法会因为很多不同的原因被调用,据我所知,它可能随时发生。我的问题是:如何确定这些调用中的哪一个是“我刚刚为你创建了一个匹配项,就在这里!”打电话。

一些我认为行不通的例子:

  • 简单地假设在您调出 GKTurnBasedMatchmakerViewController 之后发生的第一次调用 receivedTurnEventForMatch 似乎是错误的,因为 receivedTurnEventForMatch 可能会通知用户轮到他们参加另一场比赛了。除非系统保证,当视图启动时,它们只会调用与视图对应的匹配项的此方法。这似乎是一个相当大的黑客攻击,所以我假设他们不会这样做。
  • 当另一个玩家处于“匹配”状态并且 didBecomeActive=true 时调用 receivedTurnEventForMatch 似乎是比赛中第一个玩家的解决方案,但不是第二个(因为两个玩家都完成了匹配)。
  • 查看 MatchID 并查看我们是否“以前见过”,如果没有,假设它是刚刚创建的匹配似乎不可靠,因为用户可能已经卸载了应用程序然后重新安装,而我们已经忘记了所有关于我们“以前见过”的匹配。

我被困住了,感谢任何帮助。

【问题讨论】:

    标签: iphone game-center gkturnbasedmatch


    【解决方案1】:

    在事件处理程序触发时仔细检查您的状态。我相信在您接受比赛之前,您应该仍处于invited 状态。

    编辑:实际上,我相信当事件处理程序触发时,会有两个条件表明一个新的匹配:

    1. 您处于受邀状态(您已加入)

    2. 其他人都处于邀请或自动匹配状态(你开始了匹配)

    编辑 2: 检查我的旧代码,结果发现我查看了matchData 对象。因为我知道玩家 2 直到玩家 1 结束回合才收到邀请(等等),并且我知道玩家 1 必须保存比赛数据才能结束回合,如果matchData.length 大于零,我以为我正在加入正在进行的游戏。我不依赖参与者状态。但这并不能解决您的问题。

    我做的另一件事是创建我自己的头结构,我将它插入到 NSData 的开头。在该标题中,player1 将为其他玩家设置状态标志,这在这些玩家加入时会很明显。我完全忽略了比赛对象中的参与者状态。

    关于您的第三个项目符号,您可以使用 cloudKit 远程保存列表,而不是在本地保存列表。除非您专门删除它,否则 cloudkit 数据将在安装/卸载过程中持续存在。

    cloudkit 的要点是:

    • 当您在应用中启用它时,您的应用会获得一个“容器”,其中包含所有用户都可以共享的公共数据库以及每个应用用户独有的私有数据库。
    • 您可以在私有数据库中使用“字节”字段创建记录
    • 您可以将NSMutableArray 直接保存到上述字节字段中
    • 您可以直接从字节字段读回NSMutableArray

    【讨论】:

    • 从我的测试来看,它不起作用:如果我开始自动或邀请游戏:我处于 GKTurnBasedParticipantStatusActive 状态,而匹配的玩家处于 GKTurnBasedParticipantStatusMatching 状态。正如我上面提到的:检测 receivedTurnEventForMatch 何时为比赛中的第一个玩家提供新游戏似乎很简单:寻找“匹配”状态。第二个玩家是挑战,因为两者都处于“活动”状态(这也是很多其他时候该事件将被调用的情况)。
    • @Eric,我对GK* 的挫败感达到了极限,并在几个月前撕掉了所有这些代码。所以,我不得不去看看一些旧树枝,看看我以前做过什么。我已经相应地更新了答案。
    • 完全理解这种挫败感,我也差不多。我会将此答案标记为正确,因为它构成了我的解决方案的基础(如下所述)
    • 我最终采用了这样的逻辑:如果调用了 receivedTurnEventForMatch 并且:MatchmakerViewController 已启动并且比赛中其他玩家处于“匹配”状态,那么这就是新的匹配游戏。否则,如果我们没有存储匹配并且(匹配数据为空或处于我的游戏定义的“初始”状态)并且 MatchmakerViewController 当前已启动,那么这是一个新的匹配游戏,我们是第二个加入的玩家.如果除了 viewController 没有启动之外,所有这些都是真的,那么用户只是通过单击它接受了邀请。这可以处理所有情况。
    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 2013-04-08
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多