卸下GKTurnBasedMatch其处于无效状态(Removing a GKTurnBasedMa

2019-08-17 12:55发布

我做了一些实验,试图了解的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:...都给出错误:

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

为好。 我是不是做错了什么还是我莫名其妙地创建一个不可移动的游戏?

PS我也无法删除通过游戏中心游戏提供的界面,在那里他们的“游戏结束”一节中列出。

Answer 1:

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

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


Answer 2:

不幸的是,我已经运行到完全相同的错误。 为了帮助其他人了解这个问题,在研究解决的希望,你可以邀请朋友来一场比赛,但随后的第一回合中退出比赛你曾经提交翻到邀请的玩家之前重新创建。 然后,托管玩家将删除游戏中心比赛。 在邀请的玩家的设备,他们将有一场比赛,看起来像一个上面提到的,这是不能被删除。 我已经尝试了所有类型的解决方法解决方案。

我已经没有任何运气,但我会更新我的答案了一个解决方案,如果我找到一个。 目前我正在试图推出一款游戏中心的游戏,所以我必须要找到一些解决这个方式。 我有两个在第二天的结论。

更新:我去了我的非可删除的比赛中,他们几乎是一样的你,除了我的球员与被邀请的状态也赢得了比赛的结果。 它似乎把比赛拖入无效状态的关键是要有一个球员的状态被邀请的,而不是做,但有比赛状态的结束。 这是我们的两种情况之间的共同元素,它在苹果的bizantine游戏中心代码的边缘情况。 如果只是简单地搞砸了这个边缘情况下它不会让我感到吃惊,并希望你能“只知道”你不应该把球员在那个状态(毫无疑问如果你看过他们的文档不够紧密,你就可以最终这个拼凑在一起)。

我的结论是,苹果已经在他们的手的边缘情况下悄无声息容易,因为它,如果你退出了新的比赛只可能发生,只有当你邀请的朋友,分为两种情况你可能不经常测试。 另外,如果你不设置匹配的结果不正确我猜测它永远不会发生,所以他们只是没有抓到它。

因为我还没有发货,我将配置我的应用程序,以检测匹配在这种状态下,而忽略他们。 我要到控制台报告有多少比赛是在这种状态下的计数,就这样我可以保证其不发展过去这一点。 然后,我要分析我戒烟的代码,并确保在此边缘情况,我根本就从来没有把比赛拖入这种状态下一次。 我认为,鉴于我们知道我们必须要积极主动,只是吸了一个事实,即有些比赛滑倒通过。

希望你尚未发货的,所以错误匹配的情况下将定位于游戏中心沙箱环境。 其实,坏的比赛只是局限于在沙盒测试用户,所以你可以只丢掉用户,并开始与新的用户,一旦你已经纠正您的问题。 如果要实现我的上述建议,你应该能够确认您的应用程序采取这一步骤之前正常工作。

如果任何人都可以真正找到一种方法来消除这些错误匹配,一旦存在,请让我们知道,但我希望我的建议和实际原因的鉴定将足以帮助您继续与您的项目。



Answer 3:

我找到了解决办法。 对于无效的比赛只使用-participantQuitOutOfTurn方法,然后-removeWithCompletionHandler方法。 这将完全删除。



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

希望这将有助于其他诊断,如果没有别的。 很想听听别人的走向办法或解决方案的见解。 如果这是在苹果公司的一个bug,它看起来像它可能是值得提起的雷达。



Answer 5:

苹果技术开发人员支持证实了这一问题。 提交错误报告。 将及时向大家发布。



文章来源: Removing a GKTurnBasedMatch which is in an invalid state