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

问题描述:

我正在研究一个简单的基于回合的文字游戏,并且我很难弄清楚邀请函是如何工作的。当用户A邀请用户B参加游戏时,我希望用户B能够在我的自定义比赛界面(即列出所有用户B的游戏的屏幕)中看到该游戏。如果用户B在被邀请参加游戏时点击通知,事情就没有问题,但如果用户B自己导航到应用程序,我仍然希望通过自己的界面可以看到游戏。在没有游戏中心视图控制器的情况下处理GKTurnBasedMatch的邀请

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

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

这个问题似乎引起了一些人的兴趣,所以这里粗略地说明了我最终做了什么。

首先,新比赛根本没有出现的原因只是我并不是每次想让视图像我一样刷新视图时,我都不会打电话给[GKTurnBasedMatch loadMatchesWithCompletionHandler:]。所以我记得那里没有真正的问题。

真正的问题是我收到并显示新GKTurnBasedMatch的情况,但没有任何数据(即对手玩家的第一招)可用。本质上,[GKTurnBasedMatch loadMatchesWithCompletionHandler:]似乎不能保证为您提供可用的最新GKTurnBasedMatch对象。为了确保比赛是最新的,我必须在[GKTurnBasedMatch loadMatchesWithCompletionHandler:](其中match是其中一个GKTurnBasedMatches)返回的每场比赛中致电[match loadMatchDataWithCompletionHandler:]。这将返回与该匹配关联的最新匹配数据,作为NSData对象。然后我可以使用这个NSData来确保我比赛表中的所有比赛都被刷新,以反映游戏中心的最新变化。

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

+0

我在执行加载匹配方法中实现加载匹配数据之前,也遇到了无法查看最近轮次的问题。值得注意的是,它只能在匹配输入时延迟加载匹配数据,而不是一次加载所有匹配数据,这会在不使用WiFi时真的减慢呈现匹配的UI。 – Corbin87 2014-03-02 18:32:12

+0

我想确保我明白你在说什么。我正尝试从玩家A向玩家B发送一个邀请,并且我希望玩家B能够在他们回复之前在他们的匹配列表*上看到邀请。换句话说,当我为B调用'loadMatches'时,它应该显示所有匹配的活动,以及他们被邀请的所有匹配,*无论他们是否响应了邀请。*看起来好像就像你说这是你的事情。我很困惑,因为对我而言,B从来没有看到他们被邀请参加的比赛。 – 2017-03-07 19:53:21

+0

在我问到这个问题之后,我想清楚了,但是我想留下这个问题以防其他人拥有它。关键在于,邀请不会出现在玩家的名单上,直到*轮到他*为止。游戏中心有一个范例,希望您能够在接受邀请后立即玩游戏,因此它会阻止回合制邀请,直到被邀请的玩家可以立即行动。对于游戏开始前玩家需要互动的游戏来说,这是蹩脚的,但是你去了。 – 2017-03-07 19:58:47

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

我一直在努力以编程方式处理接近一周回合制比赛的邀请。我终于找到了答案。我要超高亮它,因为我花了这么发现:

游戏中心对待回合制邀请,变故。他们是而不是像其他邀请一样处理。

回合制的事件在该函数处理的GKLocalPlayerListener协议:

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

当您收到了比赛,请检查您是否正在邀请它,和急。你已收到邀请。

但是:

经过令人沮丧的试验和错误我已经发现了一些注意事项,希望它可以为您节省一些严重的时间:

  1. 它只是普通的并不总是奏效。相信与否,Game Center是不可靠的。这意味着您需要一个备份系统来审查您的本地玩家的公开比赛,并搜索他们的新邀请。这本身就属于警告#2。
  2. 被邀请参加比赛的球员(例如说playerJake被邀请参加matchFoo)实际上并不会收到的邀请,也不会在loadMatches返回的比赛中看到该比赛,直到轮到他们。显然,Game Center实际上并不涉及任何球员在比赛的邀请名单以任何方式直到轮到他们。
  3. 如果您可以识别您受邀参加的比赛,但尚未回复,您必须直接在之间拨打acceptInvite(...)。因此,如果playerJake检查了loadMatches检索到的比赛,并且能够检测到matchFoo仍然有公开邀请,playerJake必须拨打matchFoo.acceptInvite(/* ...completion handler stuff here... */),然后快乐的playerJake关闭并运行。

从这里你应该能够得到你自己的编程匹配系统的工作。 祝你好运,我的意思是!