我正在做一些实验,试图了解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)>
>这似乎表明比赛已经结束了。然而,其中一位参与者的结果是:没有,我是由医生领导的,他们认为对于一个结束的游戏是无效的。试图简单地删除游戏会给出:
由于一个或多个参数无效,请求的操作无法完成。
在试图设定结果和结束游戏时,会给出:
由于会话处于无效状态,无法完成请求的操作。
我想我可能无法删除这个游戏,因为本地玩家是主动参与者,但是participantQuitInTurnWithOutcome:...和endTurnWithNextParticipants:...都给出了错误:
由于会话处于无效状态,无法完成请求的操作。
也是。是我做错了什么,还是我创造了一个不可移动的游戏?
我也无法通过游戏中心提供的界面移除游戏,他们被列在“游戏结束”部分。
发布于 2013-04-22 13:06:20
这就是我如何设法删除所有无效的匹配。
我检查了当前参与者的状态,如果被邀请,我调用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);
}
}];
}];发布于 2013-03-16 05:08:18
不幸的是,我也遇到了同样的错误。为了帮助其他人理解这个问题,希望研究一个解决方案,你可以邀请一个朋友参加比赛,然后在第一轮比赛中退出比赛,然后再提交给被邀请的玩家。然后,主机玩家从游戏中心移除比赛。在被邀请玩家的设备上,他们将有一个匹配,看起来像上面引用的,不能被删除。我尝试过各种各样的解决方案。
我还没有任何运气,但我会更新我的答案,如果我找到一个解决方案。我目前正试图推出一个游戏中心的游戏,所以我必须找到一些方法绕过这一点。我会在接下来的一两天内得出结论。
更新:我检查了我的非删除的比赛,他们几乎和你的一样,除了我的球员的邀请状态也有获胜的比赛结果。使比赛进入无效状态的关键似乎是邀请一个球员状态而不是完成,但是要结束比赛状态。这是我们两种情况之间的共同元素,在苹果的比占庭游戏中心代码中,这是一个边缘的例子。如果他们只是简单地搞砸了这个边缘的情况,并期望你“只知道”你不应该让玩家处于那种状态(毫无疑问,如果你仔细阅读了他们的文档,最终你就能把它们拼凑在一起),我也不会感到惊讶。
我的结论是,苹果在他们的手上有一个很容易被忽视的边缘情况,因为只有当你退出一场新的比赛,只有当你邀请了一个朋友时,才会发生这种情况,而且只有当你邀请一个朋友时,你可能不会经常测试两种情况。而且,如果你没有不恰当地设置比赛结果,我猜这是永远不会发生的,所以他们从来没有抓住它。
由于我还没有发布,我将配置我的应用程序来检测这种状态下的匹配,并忽略它们。我将向控制台报告有多少匹配处于这种状态,这样我就可以确保它不会超过这一点。然后,我将分析我的退出代码,并确保在这种边缘情况下,我再也不能将匹配放到这种状态。我认为,考虑到我们所知道的,我们必须积极主动,吸取一些比赛失败的事实。
希望您还没有发布,因此错误案例匹配将本地化到游戏中心的Sandbox环境中。实际上,糟糕的匹配只是局限于沙箱中的测试用户,所以一旦您纠正了问题,您就可以丢弃该用户,并从新用户开始。如果您执行我的上述建议,您应该能够确认您的应用程序是正常工作,然后采取这一步骤。
如果有人能够找到一种方法删除这些错误匹配一旦存在,请告诉我们,但我希望我的建议和确定的实际原因将足以帮助您继续您的项目。
发布于 2013-04-26 16:11:10
我找到了解决办法。对于无效匹配,只需使用-participantQuitOutOfTurn方法,然后使用-removeWithCompletionHandler方法。它将被完全移除。
https://stackoverflow.com/questions/15373903
复制相似问题