CordovaでlocalStorageを使う

Cordovaでもセーブがしたい

ここまでの作業でCordovaとJavaScriptでゲームを作る環境は整ってきました。

ここからは、ゲーム作りに役立ちそうな事を試して記事にしていこうと思います。

ゲームプレイに対して累積するデータ(獲得した得点の上位ランキングや、キャラクター強化に使えるポイント、進行フラグなど)であったり、オプションの設定であったりと、ゲームでは何かと次回に持ち越せる値を残しておきたいものです。

Cordovaではそれを実現する方法のひとつとして、HTML5で言うlocalStorageをそのまま使う事ができそうです。

スポンサードリンク
↓ 記事の続きはこちらから

AndroidとiOSだけを視野に入れるのならWebSQLを利用するのが良さそうです。

データベース(DB)を作るなら、ついでにあれもこれもDBで管理したいという夢が膨らむところですが、
「Windowsも意識したいなあ」とか思い出すと、IndexedDBと処理を分ける必要が出てきそうなので、どうにも一工夫必要になってくる様子。

Apache Cordova API Documentation – Storage
https://cordova.apache.org/docs/en/5.1.1/cordova_storage_storage.md.html
(404になってた)

Windowsマシンで気軽に開発して、要所要所でスマホ実機でチェック・・みたいなズボラ開発をしたい時、Windowsで動いてくれないのは明らかに困りますとも・3・

上記の記事でもプラグインを使う事をオプションとして提案していますが、過去にHSP製ゲームで作ってきたセーブデータの規模を省みても、そうそうMB単位のセーブデータになるとは思えないので、ひとまずlocalStorageで保存してみました。

必要な時がきたらプラグインも試してみようと思います。

HSP(少なくともHSP2時代)には、標準命令にメモリ内容を保持・再現できる関数が存在していませんでした。

そのためセーブデータを作りたい時は、必要な情報をすべて手動にてテキストファイルで書き出し&読み込みしてやる必要がありました。

一般的にセーブデータを作成するのはそういった作業だとは思いますが、今回localStorageで実現したい事も、この挙動にかなり近いものとなります。

localStorageとはなんぞや?

永続性のあるデータ保存ができるlocalStorage、揮発性のsessionStorage。
このふたつをあわせてWeb Storageと呼ぶ技術のようです。
ここでは扱いませんが、sessionStorageをうまく扱う用法も調べたいところ。

W3C – 『Web Storage』日本語訳 – HTML5.JP
html5.jpの関連ページを見に行く
ちなみにブラウザのストレージ容量についてまとめてくださっている下記ページによると
セーブできる容量はAndroid Browse(ChromeやFirefoxじゃなくて、日本語版で単にブラウザと呼ばれるあのアプリのことですかね)の上限である2MBにあわせる事になりそう。

モダンブラウザのストレージ容量と調査方法まとめ – HTML5 Rocks
html5rocks.comの関連ページを見に行く
資料によってはW3C(インターネット技術の標準化を推進する為に活動する機関)の定めを根拠にもっと大きな容量を示していたりします。

先ほどのWeb Storage日本語訳記事によるところ、そもそもW3CはWeb StorageをHTML5の仕様として定める事を断念しているようなので、根拠にするには頼りない所ではあります。

そのためここでは手を動かして調べて下さった方の情報を信じる事にします。
それでなくともW3Cの言う5MBを超えて保存してしまうのは、ブラウザに依存するので危険な香りがします。

さて、localStorageに保存されるのは実質JSONデータのようです。
(内部では保存に都合のよいデータに置き換えられている可能性はありますが)

つまりkeyとvalueのペアで保存されているようですので、容量的な観点でも注意が必要ですが、JSONで2MBならなかなか大容量のセーブ領域が確保できそうです。

localStorageの挙動を試す

そして試しに作ってみたのがこちら。

初回起動時はロードするべき値が無いのでif文はfalseとなりますが、
「セット」ボタンを押してから閉じるなりリロードするなりして、HTMLを読み込み直すと、localStorageに保存されたデータを拾うようになります。

「クリア」を押すとlocalStorageは破棄されるので、再び「セット」ボタンが押されるまでページ読み込み時のif文は成立しなくなります。

IEのlocalStorageはローカルで動かない

Chrome信者の私でも、流石に自分の作った物がIEで動くのかくらいは確認します。

するとなんかもう全然ダメってくらい動きません。
(ちなみにWeb Storageに対応しているのはIE8かららしい)
IEでローカル環境だとエラーと扱われてしまう

困り果てて原因を調べていると、そのものズバリな解答がありました。

localStorageまとめと注意事項-ITかあさん
kaasan.infoを見に行く

どうもIEだとWeb Storageをローカル環境で利用できないようです。
(ネット上のページであれば利用可能)
更に使用の許可をユーザー側に求める格好となります。

CordovaでWindows8用のアプリを作った時に、どう動くのでしょうかね??

今回はあくまでスマホと同じ挙動を維持しながらWindowsで開発する事を目指してのlocalStorage利用を目指したので、
現状Windows8アプリ(要はWindowsストアアプリという事か)を開発する環境を用意していないのですが、今後より多くのプラットフォームに対応させたい時、気がかりな点になりそうです。

目指す物はCordovaを使ったアプリですので詳しく触れていませんが、Web Storageはブラウザ毎に独立して保存領域を持っています。

通常の利用では(あえてプログラム側でそういう動作を目指さない限りは)、同じページを操作してもブラウザAとブラウザBで値を引き継ぎません。

Android上での挙動

Cordovaを使って実際にAndroidで動かしてみました。

環境構築記事を参考にして環境が整っているなら、後は最初からあるindex.htmlに上のソースをコピペして、コマンドラインでcordova run androidと入力するだけです。

初回起動時
localStorageセット前

「セット」をタップした後に閉じて、もう1回アプリを起動した状態
localStorageは予定通りの動作をしました

ちゃんとlocalStorageが動いている事がわかります。
画像が同じなので載せませんが、クリア後は「取り出した値~」の表示も消えました。

これでセーブ機能を実現できました。


コメントを残す

メールアドレスが公開されることはありません。