我工作的一个简单的基于回合制的文字游戏,和我有困难的时候搞清楚如何邀请正在工作。 当用户A邀请用户B的比赛,我想用户B能够看到这款游戏在我的自定义接口匹配(即所有的用户B的游戏中列出的屏幕)。 一切都很好,如果用户B的通知点击时,他被邀请到一个游戏,但我还是希望游戏是通过我自己的界面上显示,如果用户B只是定位到对自己的应用程序。
每当出现这种比赛界面屏幕,我使用[GKTurnBasedMatch loadMatchesWithCompletionHandler:]
让所有的本土选手的比赛。 有了这个,我会假设,用户B将能够看到他已经被邀请参加比赛,但这种新的比赛没有显示出来。 如果我接受过邀请GKTurnBasedMatchmakerViewController
,用户输入如预期的游戏,但是是什么让这个更让人不解的是,如果我打开GKTurnBasedMatchmakerViewController
然后取消不接受邀请,一个新的比赛,现在显示在我的定义匹配接口,但它缺乏的是由用户A发送的数据匹配
综上所述,我真的只是想知道如何正确显示和接受GKTurnBasedMatch
与自定义界面邀请(而不是使用GKTurnBasedMatchmakerViewController
)。 谢谢!
这个问题似乎是感兴趣的一对夫妇的人,所以这里的什么我最后做一个粗略的估计。
首先,新的比赛被完全无法显示了原因只是,我没有打电话[GKTurnBasedMatch loadMatchesWithCompletionHandler:]
每次我想要的视图刷新喜欢我的时间,虽然我是。 因此,没有真正的问题存在,因为我记得。
真正的问题是我在那里接收并显示新的情况GKTurnBasedMatch
,但没有数据(即对方球员的第一个举动)的可用。 从本质上讲, [GKTurnBasedMatch loadMatchesWithCompletionHandler:]
似乎并不保证为您提供最先进的最新GKTurnBasedMatch
对象可用。 为了确保比赛均达到最新的,我只好也呼吁[match loadMatchDataWithCompletionHandler:]
,对返回的每场比赛[GKTurnBasedMatch loadMatchesWithCompletionHandler:]
(其中match
是那些GKTurnBasedMatches之一)。 这将返回与该匹配作为相关的最当前的匹配数据NSData
对象。 当时我能够使用这个NSData
,以确保所有的比赛在我的匹配表进行了更新,以反映最新的游戏中心的变化。
总之,使用loadMatchDataWithCompletionHandler
您GKTurnBasedMatch
对象,以确保他们的数据是最新的。
更新:现在包括用于接收邀请实际的答案。
我一直在努力与编程处理的回合制比赛邀请了近一个星期。 我终于找到了答案。 我要超高亮它,因为我花了这么长时间才找到:
游戏中心对待回合制邀请, 变故。 他们没有像其他邀请来处理。
回合制的事件在该函数处理GKLocalPlayerListener
协议:
player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch,
didBecomeActive: Bool)
当您收到的比赛中,检查您是否邀请到它,和急。 你已经收到了邀请。
但:
经过令人沮丧的试验和错误我已经发现了一些注意事项,希望它可以为您节省一些严重的时间:
- 它只是普通的并不总是奏效。 不管你信不信,游戏中心是不可靠的。 这意味着你需要一个备份系统,审查当地玩家的公开比赛和搜索他们为新的邀请。 这本身属于包退#2。
- 被邀请参加比赛(例如说playerJake应邀matchFoo)的玩家将无法实际获得这一邀请也没有看到返回的比赛那场比赛
loadMatches
直到轮到他们。 显然,游戏中心实际上不涉及以任何方式比赛的邀请名单上的任何一名球员,直到轮到他们。 - 如果你能确定你想邀请你参加比赛,但没有回应,则必须调用
acceptInvite(...)
直接在那场比赛 。 所以,如果playerJake检查检索到的比赛loadMatches
,并能检测matchFoo仍然有一个开放的邀请,playerJake必须调用matchFoo.acceptInvite( /* ...completion handler stuff here... */)
然后快乐playerJake是关闭和运行。
从这个你应该能够让自己的编程匹配系统正常工作。 祝你好运,我的意思吧!