删除处于无效状态的GKTurnBasedMatch

Zac*_*ach 16 gamekit ios game-center

我正在做一些尝试来尝试学习GameKit,我制作了一个简单的游戏和一个列出我的玩家比赛的界面.我正在尝试添加使用removeWithCompletionHandler:匹配方法删除游戏的功能,但我无法删除GKTurnBasedMatch似乎已进入无效状态的数据.

有问题的比赛打印:

$0 = 0x1d590d20 <GKTurnBasedMatch 0x1d590d20 id:858d8257-cc49-4060-b1d8-38c09a929e3c status:Ended message: taken:2013-03-08 18:08:47 +0000 created:2013-03-08 03:24:14 +0000
current:<GKTurnBasedParticipant 0x1d58c020 - id:G:1717956303 (local player) status:Invited outcome:None lastTurn:(null)>
participants:
    <GKTurnBasedParticipant 0x1d58bc90 - id:G:1717239488 status:Done outcome:Quit lastTurn:2013-03-08 18:08:47 +0000>
    <GKTurnBasedParticipant 0x1d58c020 - id:G:1717956303 (local player) status:Invited outcome:None lastTurn:(null)>
>
Run Code Online (Sandbox Code Playgroud)

这似乎表明比赛已经结束.然而,其中一个参与者的结果是:无,我被相信的文档所引导,对于已结束的游戏无效.试图简单地删除游戏给出:

无法完成请求的操作,因为一个或多个参数无效.

在尝试设置结果并结束游戏时给出:

由于会话处于无效状态,因此无法完成请求的操作.

我想也许是因为本土球员是积极的参与者我不能删除游戏,但两者participantQuitInTurnWithOutcome:...endTurnWithNextParticipants:...都给出了错误:

由于会话处于无效状态,因此无法完成请求的操作.

同样.我做错了什么或者我以某种方式创造了一个不可移动的游戏?

PS我也无法通过游戏中心提供的界面删除游戏,它们列在"游戏结束"部分下.

Hen*_*rik 7

这就是我设法删除所有无效匹配的方法.

我检查了当前参与者的状态,如果被邀请,我调用了declineInviteWithCompletionHandler,否则我调用了participantQuitInTurnWithOutcome.

在两个完成块中,我然后调用removeWithCompletionHandler来删除匹配.

这会产生一些错误,但匹配仍然被删除,所以我的列表是干净的.

这里是一个关于如何避免开始这种状态的解决方法.这具有额外的好处,即如果邀请者在完成他/她的第一次转弯之前退出,被邀请者甚至不会得到通知.

在playerQuitForMatch中,首先结束转弯然后在完成处理程序中,立即退出匹配.像这样,

[match endTurnWithNextParticipants:[NSArray arrayWithObject:nextParticipant]
                                          turnTimeout:GKTurnTimeoutDefault
                                            matchData:nil completionHandler:^(NSError *error) {
                                                if (error) {
                                                    NSLog(@"%@", error);
                                                }

                                                [match participantQuitOutOfTurnWithOutcome:GKTurnBasedMatchOutcomeQuit
                                                                     withCompletionHandler:^(NSError *error) {
                                                                         if (error) {
                                                                             NSLog(@"%@" ,error);
                                                                         }
                                                                     }];
                                            }];
Run Code Online (Sandbox Code Playgroud)


Jos*_*osh 5

不幸的是,我遇到了完全相同的错误.为了帮助其他人理解问题,希望研究解决方案,您可以通过邀请朋友参加比赛来重新创建,然后在第一个回合中退出比赛,然后再向受邀玩家提交该回合.然后,主机播放器从Game Center中删除该匹配.在受邀玩家的设备上,他们将看到与上面引用的匹配项无法删除的匹配项.我尝试了所有类型的解决方案.

我还没有运气,但如果找到一个,我会用解决方案更新我的答案.我目前正在尝试发布游戏中心游戏,所以我必须找到一些解决方法.我会在接下来的一两天内得出结论.

更新:我查看了我的不可删除的比赛,它们几乎与你的相同,只是我的具有邀请状态的球员也有胜利的比赛结果.似乎将匹配置于无效状态的关键是让一个玩家状态为Invited而不是Done,但匹配状态为Ended.这是我们两个案例之间的共同点,而且这是Apple的商业游戏中心代码中的一个边缘案例.如果他们简单搞砸了这个边缘案例并且期望你"只知道"你不应该让玩家处于那种状态,那就不会让我感到惊讶(毫无疑问,如果你仔细阅读他们的文档,你将能够最终把它拼凑在一起).

我的结论是,苹果手上有一个边缘案例,很容易被忽视,因为只有当你退出新的比赛时才会发生这种情况,并且只有你邀请了一个朋友,两个你可能不经常测试的情况.此外,如果你没有不正确地设置匹配结果,我猜它永远不会发生,所以他们从来没有抓住它.

由于我尚未发货,我将配置我的应用以检测​​此状态下的匹配并忽略它们.我要向控制台报告这个状态下有多少匹配的数量,这样我就可以确保它不会超过这一点.然后,我将分析我的退出代码,并确保在这个边缘情况下我再也不能将匹配置于此状态.我认为,鉴于我们所知道的,我们必须积极主动,并且只是汲取了一些比赛的事实.

希望您尚未发货,因此错误案例匹配将本地化到Game Center Sandbox环境.实际上,不良匹配只是本地化到沙盒中的测试用户,所以一旦纠正了问题,您就可以抛弃该用户并开始使用新用户.如果您实施我的上述建议,您应该可以在执行此步骤之前确认您的应用是否正常运行.

如果有人能够找到一种方法来删除这些错误匹配,请告诉我们,但我希望我的建议和实际原因的识别将足以帮助您继续您的项目.


Sal*_*mir 5

我找到了解决方案.对于无效匹配,只需使用-participantQuitOutOfTurn方法然后使用-removeWithCompletionHandler方法.它将被完全删除.