2013-03-12 43 views
15

我正在做一些试验以尝试了解GameKit,并且我制作了一个简单的游戏和一个列出我的玩家匹配的界面。我试图添加在比赛中使用removeWithCompletionHandler:方法删除游戏的功能,但我无法删除似乎已进入无效状态的GKTurnBasedMatch删除处于无效状态的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)> 
> 

这似乎表明,比赛已经结束。然而,其中一位参与者的结果是:无,我认为文档认为这对于已结束的游戏无效。试图简单地删除游戏带给:

The requested operations could not be completed because one or more parameters are invalid.

试图设置的结果和结束比赛,得到:

The requested operation could not be completed because the session is in an invalid state.

我想也许是因为本土球员是主动我不能删除游戏参加者,但两者participantQuitInTurnWithOutcome:...endTurnWithNextParticipants:...都给出错误:

The requested operation could not be completed because the session is in an invalid state.

为好。我做错了什么,或者我是否创造了一个无法移动的游戏?

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

+0

Henrik的答案应该可以解决您的问题。您需要调用declineInviteWithCompletionHandler: – 2013-04-22 20:08:22

回答

5

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

我还没有任何运气,但我会更新我的答案与解决方案,如果我找到一个。我目前正在尝试发布Game Center游戏,因此我必须找到解决方法。我会在接下来的一两天内得出结论。

更新: 我检查了我的不可删除的匹配项,它们几乎与您的一样,除了具有邀请状态的玩家也具有Won的匹配结果。看起来把比赛置于无效状态的关键是让一个球员的状态为Invited而不是Done,但是匹配状态为Ended。这是我们两种情况之间的共同元素,这是Apple bizantine Game Center代码中的一个边缘情况。如果他们只是搞砸了这个边缘情况并且希望你“知道”你不应该让这些球员进入这个状态(毫无疑问,如果你仔细阅读他们的文档,你就能够最终将它们拼凑在一起)。

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

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

希望你还没有发货,所以错误案例匹配将本地化到游戏中心沙箱环境。实际上,不良的匹配只是本地化到沙箱中的测试用户,因此,您可以放弃该用户,并在您纠正问题后立即从新用户开始。如果你实施我的上述建议,你应该能够确认你的应用程序正常工作,然后再采取这一步骤。

如果任何人都可以找到方法来删除这些错误匹配一旦存在,请告诉我们,但我希望我的建议和确切的实际原因足以帮助您继续您的项目。

+0

我可以通过为所有参与者设置'participant.matchOutcome = GKTurnBasedMatchOutcomeTied'来移除这些错误匹配,然后调用'[match removeWithCompletionHandler ...]'。这不是我会保留在我的代码中,但它清除了无效的游戏。 – Jon 2013-07-16 15:05:35

4

我有类似的情况,如果稍有不同。我开始一场比赛,邀请第二个沙盒帐户进行比赛,然后第一个球员在第二个球员回应之前退出并删除比赛。当第二个玩家试图然后退出了比赛,他们得到这个错误:

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> 
    > 

希望这会帮助别人诊断,如果没有别的。很想听到别人对解决方法或解决方案的看法。如果这是苹果公司的一个漏洞,似乎值得提供一个雷达。

2

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

+0

很高兴听到有人关注此事。谢谢,Valentyn。 – Zach 2013-04-11 17:35:11

+0

这有什么更新?你可以发布一个链接问题跟踪。 – Drux 2013-08-27 06:18:37

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); 
                     } 
                    }]; 
              }]; 
+0

谢谢!这对我来说非常合适! – 2013-04-22 20:08:45

+0

那!谢谢你。 – Binarian 2013-07-22 16:22:17

5

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

相关问题