删除处于无效状态的GKTurnBasedMatch

我正在做一些尝试来学习GameKit,我做了一个简单的游戏和一个界面,列出了我的玩家的匹配。 我正在试图增加使用removeWithCompletionHandler:方法去除游戏的能力,但是我在删除似乎进入无效状态的GKTurnBasedMatch时遇到了问题。

有问题的比赛的po打印:

 $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:...endTurnWithNextParticipants:...都给出了错误:

请求的操作无法完成,因为会话处于无效状态。

以及。 我做错了什么,或者我创造了一个无法移动的游戏?

PS我也无法通过Game Center提供的界面删除游戏,他们在“游戏结束”部分列出。

这是我设法删除所有无效的比赛。

我查看了当前参与者的状态,如果被邀请,我调用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); } }]; }]; 

不幸的是,我遇到了同样的错误。 为了帮助他人理解问题,希望研究一个解决scheme,你可以通过邀请朋友参加比赛,然后在第一回合中退出比赛,然后将这个回合提交给被邀请的球员来重现这一点。 然后,主持玩家从Game Center中移除该比赛。 在被邀请的玩家的设备上,他们将有一个看起来像上面提到的那个匹配,不能被删除。 我试过所有types的解决方法。

我还没有任何运气,但如果我find一个解决scheme,我会更新我的答案。 我目前正在试图发布一个游戏中心游戏,所以我必须find解决办法。 我会在接下来的一两天内得出结论。

更新:我去了我的不可删除的比赛,他们几乎与你的一样,除了我的玩家与邀请状态也有比赛结果韩元。 似乎把比赛置于无效状态的关键是让一个球员状态被邀请而不是完成,但是具有匹配状态是结束的。 这是我们两个案例之间的共同点,这是苹果游戏中心代码中的一个边缘案例。 如果他们搞砸了这个边缘案例,并且希望你“知道”你不应该让这些玩家进入这个状态,这并不会让我感到惊讶(毫无疑问,如果你仔细阅读他们的文档,你将能够最终把这件事拼凑起来)。

我的结论是,苹果手边有一个很容易被忽视的边缘案例,因为只有当你退出一场新的比赛时才会发生这种情况,只有当你邀请朋友的时候,两种情况你可能不会经常testing。 另外,如果你不是不恰当地设定比赛结果,我猜测它永远不会发生,所以他们只是从来没有抓到它。

由于我还没有发货,我要configuration我的应用程序检测匹配在这种状态,并忽略它们。 我要向控制台报告在这个状态下有多less场比赛,这样我就可以确保它不会超过这个时间点。 然后,我要分析我的退出代码,并确保在这种边缘情况下,我完全不能再将匹配放入此状态。 我认为,我们知道我们必须积极主动,并且吸取了一些赛事滑落的事实。

希望你还没有发货,所以错误的情况下匹配将本地化到游戏中心沙箱环境。 事实上,不好的比赛只是本地化到你的testing用户在沙箱,所以你可以扔掉那个用户,并开始一个新的用户,一旦你纠正了你的问题。 如果你实施我的上述build议,你应该能够确认你的应用程序正常工作,然后再采取这一步骤。

如果任何人都能find方法来删除这些错误匹配一旦存在,请让我们知道,但我希望我的build议和确定的实际原因足以帮助您继续您的项目。

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

我有类似的情况,如果稍有不同。 我开始比赛,邀请第二个沙箱帐户玩,然后第一个玩家退出并删除游戏,然后第二个玩家可以回应。 当第二个玩家试图然后退出游戏,他们得到这个错误:

 Error quitting match in turn: Error Domain=GKErrorDomain Code=22 "The requested operation could not be completed because the specified participant is invalid." UserInfo=0x1f5de800 { GKServerStatusCode=5097, NSUnderlyingError=0x1f58b610 "The operation couldn't be completed. status = 5097, Invalid state: turn sent to playerId:1952436619 in slotIndex: 0 for sessionId: 698b074b-fa0b-4505-834f-1b4305b7eecb : expected slot state: Active but found: Inactive", NSLocalizedDescription=The requested operation could not be completed because the specified participant is invalid. } 

据我所知,这是因为下一个参与者已经有了“完成”的状态,我猜测这是因为他们已经退出了:

 <GKTurnBasedMatch 0x1f532b20 id:698b074b-fa0b-4505-834f-1b4305b7eecb status:Open message: taken:2013-03-30 19:53:47 +0000 created:2013-03-30 18:29:09 +0000 current:<GKTurnBasedParticipant 0x1f532b80 - id:G:1952433332 (local player) status:Active outcome:None lastTurn:2013-03-30 19:53:47 +0000> participants: <GKTurnBasedParticipant 0x1f532b70 - id:G:1952436619 status:Done outcome:Lost lastTurn:2013-03-30 18:29:10 +0000> <GKTurnBasedParticipant 0x1f532b80 - id:G:1952433332 (local player) status:Active outcome:None lastTurn:2013-03-30 19:53:47 +0000> > 

希望这会帮助别人诊断,如果没有别的。 希望听取其他人对解决方法或解决scheme的见解。 如果这是苹果方面的一个缺陷,似乎可能值得提供一个雷达。

Apple技术开发人员支持确认了这个问题 提交错误报告。 会及时向大家发布。