在没有游戏中心视图控制器的情况下处理GKTurnBasedMatch的邀请

时间:2013-03-19 18:22:18

标签: iphone ios game-center gamekit gkturnbasedmatch

我正在制作一个简单的回合制文字游戏,我很难搞清楚邀请函是如何运作的。当用户A邀请用户B参加游戏时,我希望用户B能够在我的自定义匹配界面(即列出所有用户B的游戏的屏幕)中看到该游戏。如果用户B在被邀请参加游戏时点击通知,情况会很好,但如果用户B只是自己导航到应用程序,我仍然希望通过我自己的界面看到游戏。

每当出现此匹配界面屏幕时,我使用[GKTurnBasedMatch loadMatchesWithCompletionHandler:]来获取所有本地玩家的匹配。有了这个,我会假设用户B能够看到他被邀请参加的比赛,但是这个新的比赛没有出现。如果我通过GKTurnBasedMatchmakerViewController接受邀请,则用户按预期进入游戏,但更令人费解的是,如果我打开我的GKTurnBasedMatchmakerViewController然后取消而不接受邀请,那么match现在显示在我的自定义匹配界面中,但它缺少用户A发送的匹配数据。

总而言之,我真的只是想知道如何使用自定义界面正确显示和接受GKTurnBasedMatch邀请(而不是必须使用GKTurnBasedMatchmakerViewController)。谢谢!

2 个答案:

答案 0 :(得分:1)

这个问题似乎引起了一些人的兴趣,所以这里是我最终做的粗略近似。

首先,新匹配根本没有出现的原因只是我每次想要视图刷新时都没有调用[GKTurnBasedMatch loadMatchesWithCompletionHandler:],就像我一样。所以我记得那里没有真正的问题。

真正的问题是我接收并显示新GKTurnBasedMatch的情况,但没有数据(即对方玩家的第一次移动)可用。从本质上讲,[GKTurnBasedMatch loadMatchesWithCompletionHandler:]似乎并不能保证为您提供最新的GKTurnBasedMatch可用对象。为了确保匹配是最新的,我还必须在[match loadMatchDataWithCompletionHandler:]返回的每个匹配上调用[GKTurnBasedMatch loadMatchesWithCompletionHandler:](其中match是其中一个GKTurnBasedMatches)。这会将与该匹配关联的最新匹配数据作为NSData对象返回。然后,我可以使用此NSData来确保我的匹配表中的所有匹配项都已刷新,以反映游戏中心的最新更改。

简而言之,在loadMatchDataWithCompletionHandler个对象上使用GKTurnBasedMatch以确保其数据是最新的。

答案 1 :(得分:0)

更新:现在包含接收邀请的实际答案。

我一直在努力以近乎一周的时间以编程方式处理回合制比赛的邀请。我终于找到了答案。我会超级突出它,因为我花了所以很长时间才找到:

  

Game Center将回合制邀请视为回合事件。

基于回合的事件在GKLocalPlayerListener协议中的此功能中处理:

player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, 
       didBecomeActive: Bool)

当您收到比赛时,请检查您是否被邀请参加比赛并预先确认。您已收到邀请。

<强> BUT:

通过令人沮丧的反复试验,我发现了一些警告,希望能为您节省一些时间:

  1. 只是简单并不总是有效。信不信由你,游戏中心是不可靠的。这意味着您需要一个备份系统来审核您当地玩家的公开比赛并搜索他们的新邀请。这本身就属于警告#2。
  2. 受邀参加比赛的玩家(例如,邀请playerJake受邀参加matchFoo)实际上不会获得该邀请,也不会在loadMatches 返回的匹配中看到该匹配轮到他们了。显然,游戏中心实际上并不会让任何玩家以任何方式参与比赛的邀请名单 ,直到轮到他们为止。
  3. 如果您可以识别您受邀参加的匹配但尚未回复,则必须直接在该匹配上致电acceptInvite(...) 。因此,如果playerJake检查了由loadMatches检索到的匹配项,并且能够检测到matchFoo仍然有一个开放的邀请,则playerJake必须调用matchFoo.acceptInvite( /* ...completion handler stuff here... */),然后快乐的playerJake关闭并运行。
  4. 从这里你应该能够让你自己的程序化匹配系统工作。 祝你好运,我的意思是!