如何可靠地确定为响应 GKTurnBasedMatchmakerViewController 成功而创建的匹配项
How to reliably determine which match got created in response to GKTurnBasedMatchmakerViewController success
在 iOS 10 我正在尝试使用 GKTurnBasedMatchmakerViewController 创建匹配。我可以调出视图,以便用户可以选择配对或邀请。我无法弄清楚如何可靠地确定为此创建了哪个匹配项。问题是,在 iOS 10 中,GKTurnBasedMatchmakerViewControllerDelegate 的 didFindMatch 方法已被弃用。该方法过去常常随匹配一起调用。过去的日子很轻松!
弃用消息显示 "use GKTurnBasedEventListener player:receivedTurnEventForMatch:didBecomeActive"。文档和堆栈溢出线程充满了调用该方法的原因。请参阅此线程以获得一个好的列表:Gamecenter ios 9 GameCenter GKLocalPlayerListener methods not called。如果您想象一个用户已经有好几场比赛在进行,您会发现这个方法会因为很多不同的原因而被调用,而且据我所知,它可能随时发生。我的问题是:如何确定这些调用中的哪一个是 "I just created a match for you, here it is!" 调用。
一些我认为行不通的例子:
- 简单地假设在您启动 GKTurnBasedMatchmakerViewController 之后第一次调用 receivedTurnEventForMatch 似乎是错误的,因为 receivedTurnEventForMatch 可能会通知用户轮到他们玩另一个游戏了。除非系统保证,当视图启动时,他们只会调用与视图对应的匹配项的此方法。这似乎是一个相当大的黑客攻击,所以我假设他们不会这样做。
- 在 "Matching" 状态和 didBecomeActive=true 的另一个玩家调用 receivedTurnEventForMatch 似乎是比赛中第一个玩家的解决方案,但不是第二个(因为两个玩家都完成匹配)。
- 查看 MatchID 并查看我们是否 "seen it before",如果没有,则假设它是刚刚创建的匹配项似乎不可靠,因为用户可能已卸载该应用程序然后重新安装,我们'我们已经忘记了我们 "seen before".
的所有比赛
我被卡住了,感谢任何帮助。
事件处理程序触发时仔细检查您的状态。我相信在您接受匹配之前,您应该仍处于 invited
状态。
编辑: 实际上,我相信当事件处理程序触发时会有两个条件指示新匹配:
您处于受邀状态(您已加入)
其他人都处于邀请或自动匹配状态(你开始了匹配)
编辑 2:
查看我的旧代码,原来我查看了 matchData
object。因为我知道玩家 2 在玩家 1 结束回合(依此类推)之前不会收到邀请,并且因为我知道玩家 1 必须保存比赛数据才能结束回合,如果 matchData.length
大于零,我以为我正在加入正在进行的游戏。我不依赖于参与者状态。但这并不能解决你的问题。
我做的另一件事是创建我自己的 header 结构,我将其插入到 NSData 的开头。在那个 header 中,player1 会为每个其他玩家设置状态标志,这在这些玩家加入时会很明显。我完全忽略了比赛中的参赛者身份 object.
关于您的第三个项目符号,您可以使用 cloudKit 远程保存列表,而不是在本地保存列表。 cloudkit 数据将在 installs/uninstalls 中持续存在,除非您专门删除它。
cloudkit 的要点是:
- 当您在您的应用中启用它时,您的应用会获得一个 "container",其中包含一个所有用户都可以共享的 public 数据库,以及一个每个应用用户独有的私有数据库。
- 您可以使用 "Bytes" 字段在私有数据库中创建记录
- 您可以将
NSMutableArray
直接保存到上述字节字段中
- 您可以直接从字节字段
读回一个NSMutableArray
在 iOS 10 我正在尝试使用 GKTurnBasedMatchmakerViewController 创建匹配。我可以调出视图,以便用户可以选择配对或邀请。我无法弄清楚如何可靠地确定为此创建了哪个匹配项。问题是,在 iOS 10 中,GKTurnBasedMatchmakerViewControllerDelegate 的 didFindMatch 方法已被弃用。该方法过去常常随匹配一起调用。过去的日子很轻松!
弃用消息显示 "use GKTurnBasedEventListener player:receivedTurnEventForMatch:didBecomeActive"。文档和堆栈溢出线程充满了调用该方法的原因。请参阅此线程以获得一个好的列表:Gamecenter ios 9 GameCenter GKLocalPlayerListener methods not called。如果您想象一个用户已经有好几场比赛在进行,您会发现这个方法会因为很多不同的原因而被调用,而且据我所知,它可能随时发生。我的问题是:如何确定这些调用中的哪一个是 "I just created a match for you, here it is!" 调用。
一些我认为行不通的例子:
- 简单地假设在您启动 GKTurnBasedMatchmakerViewController 之后第一次调用 receivedTurnEventForMatch 似乎是错误的,因为 receivedTurnEventForMatch 可能会通知用户轮到他们玩另一个游戏了。除非系统保证,当视图启动时,他们只会调用与视图对应的匹配项的此方法。这似乎是一个相当大的黑客攻击,所以我假设他们不会这样做。
- 在 "Matching" 状态和 didBecomeActive=true 的另一个玩家调用 receivedTurnEventForMatch 似乎是比赛中第一个玩家的解决方案,但不是第二个(因为两个玩家都完成匹配)。
- 查看 MatchID 并查看我们是否 "seen it before",如果没有,则假设它是刚刚创建的匹配项似乎不可靠,因为用户可能已卸载该应用程序然后重新安装,我们'我们已经忘记了我们 "seen before". 的所有比赛
我被卡住了,感谢任何帮助。
事件处理程序触发时仔细检查您的状态。我相信在您接受匹配之前,您应该仍处于 invited
状态。
编辑: 实际上,我相信当事件处理程序触发时会有两个条件指示新匹配:
您处于受邀状态(您已加入)
其他人都处于邀请或自动匹配状态(你开始了匹配)
编辑 2:
查看我的旧代码,原来我查看了 matchData
object。因为我知道玩家 2 在玩家 1 结束回合(依此类推)之前不会收到邀请,并且因为我知道玩家 1 必须保存比赛数据才能结束回合,如果 matchData.length
大于零,我以为我正在加入正在进行的游戏。我不依赖于参与者状态。但这并不能解决你的问题。
我做的另一件事是创建我自己的 header 结构,我将其插入到 NSData 的开头。在那个 header 中,player1 会为每个其他玩家设置状态标志,这在这些玩家加入时会很明显。我完全忽略了比赛中的参赛者身份 object.
关于您的第三个项目符号,您可以使用 cloudKit 远程保存列表,而不是在本地保存列表。 cloudkit 数据将在 installs/uninstalls 中持续存在,除非您专门删除它。
cloudkit 的要点是:
- 当您在您的应用中启用它时,您的应用会获得一个 "container",其中包含一个所有用户都可以共享的 public 数据库,以及一个每个应用用户独有的私有数据库。
- 您可以使用 "Bytes" 字段在私有数据库中创建记录
- 您可以将
NSMutableArray
直接保存到上述字节字段中 - 您可以直接从字节字段 读回一个
NSMutableArray