問題タブ [gkturnbasedmatch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - iOS Game Center GKTurnBasedMatchmakerViewController - 動作する場合と失敗する場合があります
ターンベースの対戦アプリ Wordiamo に取り組んでいます。Game Center を介してネットワーク化されています。GKTurnBasedMatchmakerViewController を介して新しいプレイヤーを招待する際に問題が発生しています。私はそれを展開します:
ビュー コントローラを起動した後、[Invite Friends] を押すと、正常に動作する場合があり (おそらく 30 ~ 50% の時間)、メッセージの招待状が表示されます。しかし、他の多くの場合、次のエラーが返されます。
エラー ドメイン=ExtensionErrorDomain コード=-5900 "(null)": 操作を完了できませんでした。(ExtensionErrorDomain エラー -5900。) 2017-11-13 17:53:10.616581-0800 Wordiamo[7733:1484145] viewServiceDidTerminateWithError:: エラー Domain=_UIViewServiceInterfaceErrorDomain Code=3 "(null)" UserInfo={Message=Service Connection Interrupted}
たまにしか起こらないこの失敗の原因は何ですか?ありがとう。
game-center - GKTurnBasedMatch - プレイヤー ( receivedExchangeReplies ) が CurrentParticipant に対してトリガーされない
だから私は何週間もこれに取り組んできましたが、ネットのどこにも答えが見つかりませんでした. ソースコードのコメント、さまざまなドキュメント、およびさまざまなソースReceivedExchangeReplies(GKPlayer, GKTurnBasedExchangeReply[], GKTurnBasedExchange, GKTurnBasedMatch)
は、交換のすべての受信者が応答またはタイムアウトしたときに関数が呼び出されることになっていると主張しています。交換の開始者と現在の参加者の両方に対して呼び出されることになっています。
しかし、私のアプリでは、ターンホルダーではなく、交換の開始者に対してのみ呼び出されます。現在のターンホルダーは、交換が完了したらマージして解決することになっているため、コーディングを続行できません。ただし、交換が完了したことを通知されないため、そうすることができません。
AuthenticationHandlerは正常に動作し、問題には関係ありません。
交換リクエストの送信方法は次のとおりです。
Replyで返信される:
その後、交換が完了すると、次のオーバーライドされた関数が自動的に呼び出されます。交換の開始者と現在のターンホルダーの両方について:
これは、上記の ObjectiveC 関数の Swift バージョンです。
今言ったような問題は、上記の関数が交換の開始者に対してのみ呼び出されているのに対し、現在のターンホルダーに対しては呼び出されていないことです(そうなるはずです)。現在のターンホルダーは、交換によって行われた変更をセーブゲーム データにマージすることを想定しています。彼は通知なしでは行動できないため、問題と問題を残す必要があるように通知されません。別の追加の取引所 (私が現在使用している回避策) によって手動で通知されるように彼を実装することもできますが、それはどういうわけか重要ではありません。
最初の 3 つのステップは問題なく機能しているように見えます。交換の開始者に通知されていることがわかります。唯一の問題は、ドキュメントとチュートリアルで説明されているように、4 番目の関数が自動的に呼び出されないことです。
私の最近の解釈の 1 つは、交換があまりにも速く完了し、リスナーがそれがアクティブであったことにまったく気付かないというものでした (交換は受信するとすぐに返信されます)。しかし、それはただの推測です。したかったとしても...交換への返信を遅らせるために何をしても(例えば、交換への参照を保存するDispatchQueue
、遅延した関数呼び出しに使用するなど)、交換がnilになるか、通信エラーが発生します(メッセージが別のプロキシ エラーで送信されます)。
基本的に、上記の関数が呼び出されることによってターンホルダーが本当に通知を受けることになっているのか、それとも変更された可能性があるのか 疑問に思います。
ここで助けていただければ幸いです。私は何週間もこれに取り組んできましたが、どこにも行きませんでした。他のすべては正常に機能しています。リスナーを直接実装するのではなく、GKLocalPlayer を利用する最新のアプローチで Swift の最新バージョンを使用しています (どこでも推奨されているように)。
よろしくお願いします、 Skeltek