エモンのブログ(スマホアプリ作成日記) -25ページ目

エモンのブログ(スマホアプリ作成日記)

エモンのブログです。

GooglePlayとAppStoreにアプリをリリースしてます。
「詰将棋パラダイス」4500問無料で公開。
「みんなのしょうぎ」投票型の将棋対局。いずれもソーシャルアプリなので、ソーシャルゲーム作成に興味があるかたは是非ご覧ください。

1.はじめに

自分のAIRでつくった、詰将棋アプリとかデコポニテの魔女STGではユーザアカウント管理を行ってます。
IDとパスワードを決めてユーザ情報を管理する感じですな。これはランキングなどで使うことになります。
自分はAIRアプリはソーシャルゲームを作るのに最適だと思っているのでAIRにおけるユーザアカウント管理は必須項目になってきます。
今回は自分のとったやり方を書いてみます。
なお、実際のアプリはこちらです。実際にログインして確認してみてください。
デコポニテの魔女


2.環境のこと

自分の環境です。
クライアントサイド:AIR3.0※2.6以上なら大丈夫。
サーバサイド:CentOS5.X、MySQL5.X、PHP5.X※バージョンは覚えてませんが、あまり重要でないかと。問題はLAMPであるってことくらい。
フレームワーク:CakePHP
一応デコポニテの魔女STGのほうではSSL通信も完備してます。


3.考え方

まずIDとパスワードを要求し、ユーザアカウントの新規作成を促す。
IDとパスワードをDB上に保存。その際、ランダムな英数字を発行しセッションキーとしてDBに持っておく。
AIRのShardObjectを使ってそのセッションキーを保存しておく。
次回アプリ立ち上げ時にそのセッションキーをサーバに送り、そのセッションキーがサーバ上にあれば自動ログインする。
以下アプリ内で通信があったらセッションキーを再発行してAIR上とサーバ上を同期を取る。
ここで必要になる技術は3点でSheardObjectの管理、AIRからのリクエスト、サーバ上でのレスポンスになります。
今回はSheardObjectのみとしてあとは別記事にて記述していきます。


4-1.実装方法(自動ログイン部分)

SheardObject(以下SO)を使ってセッションキーの管理を行います。セッションキーのアクセサメソッドを作っておきましょう。
SOのキーは適当にアプリケーションIDとかにしておくとよいかも。
/**
* SOからセッションキーを取得します
*/
public static function getSessionKeyFromSo() {
var result:String = "1";
var mySo:SharedObject = SharedObject.getLocal(SOのキー);
//SOからセッションキーを取得
if(mySo.data.session_key != null) result = mySo.data.session_key;
return result;
}

次回は通信の方法について
AIRアプリに広告をのせてみました。
自分が取った方法をここへ連ねます。※実際のアプリはまだリリースしてません。2012年4月下旬くらいかな。そのときにまたブログを更新します。

手順0:おおまかな仕組み

基本AIRは外部ファイルとの連携が可能なので、外部の広告が貼られたHTMLを読み込めばOK。Flashでは昔からLoadMovieとかLoadVarsなどの通信手段があったので調べなくても広告は貼れるだろうとタカをくくっていた。


手順1:AIRアプリを作る

FlashCS5.5を使って、AS3.0で作成しました。今回は知り合いのアプリに広告を引っ付けることにしました。
通信が必須になるのでパーミッションのINTERNETアクセスにチェックをいれてパブリッシュします。


手順2:広告会社のアカウント作成

AD系のアカウントを取っておきます。ここではAD-STAさんを例にしてみます。
WEBサイトとして登録し、HTMLのタグを取得します。また、色々なサイトでAIRで広告貼付けは広告会社の規約に反しているかグレーみたいな記述があるので、一応AD-STAさんにメールで確認を取りました。いまのところ、今回のようにHTMLの広告をネイティブアプリに貼付けてもいいよという了承が得られたのは他にAmoAdさんがありました。他も了承を得ていましたが、色々な意味で動作が安定していたのはこの2つです。


手順3:広告HTMLの作成

タグを取得したら、プレーンなHTMLを作ってサーバにUPします。HTMLは以下のようになります。
<html>
<head>
<script type="text/javascript">
※AD-STAから取得したscript

</script>
※AD-STAから取得したscript

</head>
<body style="background-color:#000000; " topmargin="0" leftmargin="0" >
<div style="text-align:center; ">
<div id="adslt1" class="adsta_adv slt1" ></div>
</div>
</body>
</html>


なんのことはない、プレーンなHTMLですが、ポイントはbodyタグになりますか。ここは見た目の問題であって技術的な所ではないのですが、まず、topとleftのmarginを0にしておきます。こうしないとスマホから広告がはみだします。また背景色を黒にしておくと画面が締まっていい感じになるよね(by 京子)
また、iOS版の場合は横320pxでレンダリングしない場合があるので
<meta name="viewport" content="width=320" />
これも追加しておきましょう。
※自分の場合はiOS版とandroid版で呼ぶHTMLを変えてます。

手順4:ASにてStageWebViewで広告HTMLを表示

AIRでHTMLを表示するにはStageWebViewを使います。こいつの挙動はクセがあるので注意が必要ですな。今回はアプリ立ち上げからずっと一番下に広告を常駐させるスタイルをとりました。
まずこいつはFlash上のレイヤーを完全無視して一番上に登場し、一度作った場合位置を変えることができません。位置を変えるときは一旦削除してもう一度作成するしかないようです。

var webView:StageWebView = new StageWebView();
var url:String = "※広告のURL";

public function ※ドキュメントクラスのコンストラクタ {
stageWebView();
}

public function stageWebView() {
webView.stage = this.stage;
webView.viewPort = new Rectangle( 0, 720, stage.stageWidth+15, 100);
webView.loadURL( this.url );
webView.addEventListener(Event.COMPLETE,onComplete);
}

protected function onComplete(event:Event):void{
webView.addEventListener(LocationChangeEvent.LOCATION_CHANGE,update);
webView.removeEventListener(Event.COMPLETE,onComplete);
}

protected function update(event:LocationChangeEvent):void{
if(webView.location != this.url ){
event.preventDefault();
navigateToURL(new URLRequest(event.location));
this.stageWebView();
}
}

ドキュメントクラスにて実装しました。こんな感じでStageWebViewを使います。広告をクリックしたときにLocationChangeイベントが呼び出されますが、そこで得たURLを使って別windowが立ち上げます。かつ現在動作しているアプリに影響を与えたくないため、navigateToURLをしたあと、もう一度広告を表示させる関数を呼びます。

以上でAIRアプリに広告が貼り付きます。
.apkファイルはその知人が作るので、ここにはまだ掲載できませんが、.airファイルができたので
とりあえずPCのデスクトップ上で確認できます。
怒ラム缶PC版
googlePlay : 怒ラム缶


最後に

AIRで金稼ぎをする意味では広告が可能であります。また今後GREEさんやモバゲーさんがAIR SDKを公開しアプリ内課金もできるようになるはずなので、今は虎視眈々とAS3.0並びにサーバサイドの技術(JavaとかPHPとか)もすぐにできる体制を整えておきましょう。やるべきなのはAIRとサーバの通信なのです

デコポニテの魔女」の提供でこのブログは書かれております。
デコポニテの魔女はAndroid端末用簡易右スクロールシューティングゲームです。
Technology By: Adobe AIR & CakePHP
TokyoTyrantをインストールしていることを忘れていて、2回目のインストールをしたら、Tokyo先生が起動しなくなった。
コマンドラインからテストしてみるとこんなエラーが。
connection refused


またTokyoTyrant起動時にはこんなエラー?みたいな出力がでました。
Existing process: 5069


なのでTokyo先生を再起動
/usr/local/sbin/ttservctl restart


しかし再起動もできずハングしている模様。
No such process
Hanging process: XXXX
※ハングしちゃった


なのでTokyoTyrantとTokyoCabinetをmake uninstallし、もう一度installしなおしてみたが変わらず。
アンインストールしてもpidファイルが残ったままの様子。
起動は
/usr/local/sbin/ttservctlファイルでしていたので中身を見るとそのpidファイルがどこにあるかわかった。
basedir="/var/ttserver"
pidfile="$basedir/pid"


とあるのでここのpidファイルを削除。これで動くようになりました。