ソーシャルでは通信部分がキモとなりますが、主に3つのエラーハンドリングをせねばならんなあと昨日急に思い立ち、備忘録代わりとして記事を書いていきます。
1. タイムアウトエラー
原因は通信状態が悪かったり、サーバが落ちてるなどです。
サーバからの応答が返ってこないのに「LOADING...」の文字をいつまでも出すわけにはイカンですよね。
AIR側ではLOADINGと表示するのと同時にタイマーをセットしておきましょう。
this.timer=new Timer(5000,1);
this.timer.addEventListener(TimerEvent.TIMER, onTimer);
this.timer.start();
5秒サーバからの応答がない場合はonTimer関数が呼ばれますが、そこでは通信時に使っていたURLLoaderインスタンスのEvent.COMPLETEイベントを解除、LOADING...を止めて、適宜再通信ボタンを表示する。エラーメッセージとしては「通信エラーになりました。電波の良いところでもう一度やり直してください」ってな感じですかね。
2. セッション切れエラー
AIRアプリにおけるユーザアカウント管理をしてみた。(その1)でも書きましたが、ユーザアカウントを管理する場合はセッションキーを発行して、それをAIR側にSheredObjectか何かで保持しておく必要があります。
セキュリティの都合で一定時間経過したり、ユーザが別端末でログインした場合、そのセッションキーは切れてしまいます。無効になるわけですね。
その無効状態で通信し始めると当然DB更新などが行えないわけなのでどうにかしたいですよね。
まずはその発生状況から。
AIR側で通信する際に保持していたセッションキーをサーバへPOSTします。サーバ側でセッションキーの照合を行いますが、そのセッションキーが見つからない場合、cakeErrorでも投げときましょう。ここでのcakeErrorはトランザクションエラーやその他エラーとは違うので2番目の引数には別の値を入れておきますか。
cakeErrorについてはAIRアプリ制作のその2をご覧下さい。
以下は一例です。
//ユーザデータを取得
$userData = $this->model('User')->getUserDataFromSessionKey($sessionKey);
//ユーザデータが取得できない場合はエラー
if(empty($userData)) $this->cakeError('error', 1);
cakeError側はこんな感じ
function error($params=1) {
Configure::write('debug', 2);
$this->autoRender =false;
echo 'd=0&error='.$params;
}ここでAIR側にerror=1を返すことができます。
AIR側ではerror=1を受け取ったタイミングで通信時に使っていたURLLoaderインスタンスのEvent.COMPLETEイベントを解除、LOADING...を止める。エラーメッセージとしては「アカウントエラーになりました。再ログインしてください」ってな感じですかね。
非同期通信の良さとして、ログインwindowを今の画面のまま表示させることができ、ログインしたらそのままプレイ続行できるところにありますね。
3. サーバエラー
DB更新ミス、トランザクションエラー時におこります。適当にcakeErrorを投げることになるでしょうが$this->cakeError('error', 2);としてさっきとは違う情報をAIR側に投げてあげましょう。
AIR側でerror=2を受け取ったタイミングで通信時に使っていたURLLoaderインスタンスのEvent.COMPLETEイベントを解除、LOADING...を止める。再通信ボタンの表示をする。エラーメッセージとしては「サーバエラーになりました。解決しない場合はお問い合わせ下さい」ってな感じですかね。
| 「デコポニテの魔女」はスマートフォン用簡易右スクロールシューティングゲームです。 Android端末(google play)⇒ iOS端末(app store)⇒ Technology By: Adobe AIR & CakePHP |
