2013-03-12 53 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方法。它將被完全刪除。