2013-03-12 16 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)> 
> 

試合が終了したことを示していると思われます。しかし、参加者のうちの1人には結果があります:なし、私は信じる文書によって導かれていますが、終了したゲームには無効です。単にゲームを削除しようとすると得られます。

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.

同様

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

:参加者が、両方participantQuitInTurnWithOutcome:...endTurnWithNextParticipants:...の両方がエラーを与えます。間違ったことをやっているのですか、どういうわけか不可能なゲームを作りましたか?

P.S.私はまた、Game Centerのインターフェースを介してゲームを削除することはできません。そこでは「Game Over」セクションにリストされています。

+0

Henrikの回答が問題を解決するはずです。 declineInviteWithCompletionHandler: –

答えて

5

残念ながら、私はまったく同じエラーに遭遇しました。他の人がこの問題を理解するのを助けるために、解決策を研究するために、友だちを試合に招待することで再作成することができますが、最初のターンに試合を終了してから、その後、ホスティングプレイヤーはGame Centerから試合を削除します。招待されたプレーヤーのデバイスでは、上記のようなものがあり、削除できません。私はすべてのタイプの回避策を試しました。

私はまだ運がありませんでしたが、解決策を見つけたら答えを更新します。私は現在、ゲームセンターのゲームを出荷しようとしているので、これを回避する方法を見つけなければなりません。私は次の日か2日以内に結論を出すでしょう。

更新日: 私は削除不可能な試合を行ったが、招待状のプレイヤーにも勝者の試合結果があることを除いて、あなたとほぼ同じです。試合を無効な状態にする鍵は、1人のプレイヤーのステータスをDoneではなくInvitedにして、Match StatusをEndedにすることです。それは私たちの2つのケースの共通点であり、アップルのゲームセンターコードでは最悪のケースです。この辺のケースを単純に台無しにして、あなたがその状態にプレイヤーを置くはずではないことを「ちょうど知って」いることを期待すれば、私を驚かせることはできません(間違いなく、最終的にまとめてください)。

私の結論は、アップルは新しい試合をやめて、友人を招待した場合にのみ、頻繁にテストしないかもしれない2件の場合にのみ起こる可能性があるため、また、あなたが不適切に一致の結果を設定していない場合、私はそれが起こることはないと推測しているので、彼らはそれを捕まえたことはありません。

まだ出荷されていないので、この状態で一致を検出して無視するようにアプリを設定します。私はこの状態にある一致の数をコンソールに報告するつもりです。ちょうど私がこの点を過ぎて成長していないことを保証することができます。次に、私は終了コードを分析して、このエッジケースでは、私は決してこの状態に再び一致させることはできないことを確認します。私たちが前向きにしなければならないことを知っていると思って、いくつかの試合がスリップしたという事実を吸い取ってください。

あなたはまだ出荷されていないことが望ましいので、エラーケースの一致はGame Center Sandbox環境にローカライズされます。実際に、悪いマッチはサンドボックス内のテストユーザーに限定されているため、問題を修正したらそのユーザーを捨てて新しいユーザーから始めてください。上記の提案を実装する場合は、この手順を実行する前にアプリが正常に動作していることを確認する必要があります。

これらのエラーマッチが存在すると、実際にこれらのエラーマッチを削除する方法が見つかった場合は、私たちにお知らせください。私の提案と実際の原因の特定があなたのプロジェクトを進めるのに役立つことを願っています。

+0

すべての参加者に対して 'participant.matchOutcome = GKTurnBasedMatchOutcomeTied'を設定し、' [match removeWithCompletionHandler ...] 'を呼び出すことで、これらのエラーの一致を取り除くことができました。それは私のコードでは保持するものではありませんが、無効なゲームをクリアしました。 – Jon

4

似たような状況がありますが、若干異なります。試合を開始し、2番目のサンドボックスアカウントをプレイするように招待すると、2番目のプレーヤーが応答する前に最初のプレイヤーが終了してゲームを削除します。二プレイヤーは、ゲームを終了しようとすると、彼らはこのエラーを取得する:

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

だから、限り、すでに移動するための次の参加者は、状況があるので、私はそれが起こって、言うことができるように「完了」をどのI 「推測し、彼らはすでに終了しているためである。

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

うまくいけば、これは何もない場合は他の人が診断するのに役立ちます。回避策や解決策に対する他者の洞察を聞くことが大好きです。これがApple側のバグであれば、レーダーを書く価値があるようだ。

2

Appleテクニカルデベロッパーサポートが問題を確認しました。提出されたバグ報告。あなたは投稿し続けるでしょう。

+0

誰かがこれをフォローしているのを聞いてうれしいです。ありがとう、バレンティン。 – Zach

+0

これに関する最新情報はありますか?問題が追跡されているリンクを投稿してください。 – Drux

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

ありがとう!それは私のために完全に働いた! –

+0

それ!大変ありがとうございます。 – Binarian

5

解決策が見つかりました。無効な一致の場合は、-participantQuitOutOfTurnメソッドと-removeWithCompletionHandlerメソッドを使用します。それは完全に削除されます。

関連する問題