如何可靠地确定响应GKTurnBasedMatchmakerViewController成功创建的匹配项

时间:2016-12-09 00:33:27

标签: iphone game-center gkturnbasedmatch

在iOS 10上,我尝试使用GKTurnBasedMatchmakerViewController创建匹配。我可以调出视图,以便用户可以选择匹配或邀请。我无法弄清楚如何可靠地确定响应于此而创建的匹配。问题是,在iOS 10中,不推荐使用GKTurnBasedMatchmakerViewControllerDelegate的didFindMatch方法。过去通过匹配调用该方法。过去很容易!

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

我认为一些例子不起作用:

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

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

1 个答案:

答案 0 :(得分:0)

在事件处理程序触发时仔细检查您的状态。我相信你应该保持invited状态,直到你接受比赛为止。

编辑:实际上,我相信在事件处理程序触发时会有两个条件指示新匹配:

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

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

  3. 编辑2: 检查我的旧代码,结果发现我查看了matchData对象。因为我知道在玩家1结束转弯之前玩家2没有收到邀请(等等),并且因为我知道玩家1必须保存匹配数据才能结束转弯,如果matchData.length大于零,我以为我正在加入正在进行的游戏。我没有依赖参与者的身份。但这并不能解决你的问题。

    我做的另一件事是创建我自己的头结构,我在NSData的开头插入。在该标题中,player1将为每个其他玩家设置状态标志,当这些玩家加入时,这将是显而易见的。我完全忽略了匹配对象中的参与者状态。

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

    cloudkit的要点是:

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