1

在 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 并查看我们是否“以前见过”,如果没有,假设它是刚刚创建的匹配似乎不可靠,因为用户可能已经卸载了应用程序然后重新安装,而我们已经忘记了所有关于哪个我们“以前见过”的比赛。

我被卡住了,任何帮助表示赞赏。

4

1 回答 1

0

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

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

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

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

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

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

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

cloudkit 的要点是:

  • 当您在应用程序中启用它时,您的应用程序将获得一个“容器”,其中包含所有用户可以共享的公共数据库以及每个应用程序用户唯一的私有数据库。
  • 您可以使用“字节”字段在私有数据库中创建记录
  • 您可以将 aNSMutableArray直接保存到上述字节字段中
  • NSMutableArray您可以直接从 Bytes 字段读回
于 2016-12-11T18:35:02.363 回答