Titanium Mobileでバージョンアップした時にだけ動く処理を組み込む

23日にtrimit!をリリースして3日ほど経過しました。

公開されるまでに見つかった不具合を修正したバージョン(v1.1.0)を早速申請したのですが、その際に新しい設定項目を追加してみました。当然v1.0.0にはないものなので、デフォルト値を設定する必要があります。

今回、バージョンアップ時の処理を追加してみました。アプリのバージョンが変わった時に1度だけ動く仕組みです。

 

プロパティを使ってデータを永続化する

設定画面の設定値を保存しておいたり、次回続きから作業できるように画面の状態を記憶しておくために、データを永続化する必要があります。これをやらないとアプリ起動のたびに設定が初期化されてしまうことになりますので。

Titanium Mobileでデータを永続化する場合、プロパティを使うのが便利です。もちろんファイルやデータベースを使用することもできます。設定画面のスイッチの値や入力した文字列などの読み書き程度ならプロパティを使うのが一番お手軽だと思います。

trimit!では設定画面の各設定値を保存する用途で使っています。

プロパティの読み書きには、Ti.App.Propertiesを利用します。プロパティの値の種類によってgetter/setterメソッドが用意されています。例えばgetIntで整数値のプロパティ値を取得したり、setStringで文字列のプロパティ値を設定したり、という感じです。詳しくはリファレンスをご覧ください。

 

サンプル

アプリ起動時に必ず実行するようにしますので、app.js の頭の方にこの処理を入れます。

// 現在のバージョンを取得(tiapp.xmlの設定値)
var currentVersion = Ti.App.getVersion();

// インストール後、初回起動時
var lastVersion; // 前回のバージョン
if (!Ti.App.Properties.hasProperty('currentVer')) {
	// プロパティ'currentVer'が存在しない。初めてこのアプリを起動したということ。
	lastVersion = '0.0.0'; // 次のバージョンアップチェックで必ず処理に入るようにv0.0.0としておく
} else {
	// 前回のバージョンを取得
	lastVersion = Ti.App.Properties.getString('currentVer');
}

// バージョンアップチェック
if (String(lastVersion) < String(currentVersion)) {
	// 今回バージョンアップした

	// バージョンアップ時に必要な処理(初期バージョンにはなかったプロパティ値を新設)
	Ti.App.Properties.setString('hogehoge', Ti.App.Properties.getString('hogehoge', 'ほげほげ'));
	Ti.App.Properties.setBool('isFugafuga', Ti.App.Properties.getBool('isFugafuga', true));

	// 現在のバージョン番号をcurrentVerプロパティに設定
	Ti.App.Properties.setString('currentVer', currentVersion);
}

動作はソース内のコメント通り、ということになるんですがバージョンアップしていたら、hogehogeとisFugafugaという2つのプロパティを新設するものとします。

ただ、今後もバージョンアップのたびに必ずプロパティ値を設定してしまうことになってしまうので、getString(またはgetBool)した内容をsetString(またはsetBool)するようにし、存在していない場合のみデフォルト値設定するようにします。

アプリの現在のバージョン番号を'currentVer'に保管しています。それと、Ti.App.getVersion()で取得した現在のバージョン番号を文字列比較して、大きければバージョンアップしている、と判断して、その時だけ必要な処理を動かすようにしています。

Ti.App.Properties.setString('hogehoge', Ti.App.Properties.getString('hogehoge', 'ほげほげ'));

バージョンアップの際に、'hogehoge'をgetStringした結果をsetStringすることで、バージョンアップ前の値を引き継ぐようにします。getStringした際に、プロパティが存在しない場合にはgetStringのデフォルト値(第2引数)の'ほげほげ'が返ります。

 

ご注意

上記のソースだと手抜きしてしまっているのですが、バージョンアップチェックのif 文は、文字列比較を行なっているので同一の形式にしか対応できません。例えば'1.9.0'から'1.10.0'に更新した時とか、'9.0.0'から'10.0.0'にメジャーバージョンアップした時には文字列比較ではバージョンアップとして認識されないという問題があります。

ピリオドで区切られた各値とも2桁以上の番号で運用しそうな場合は他の判定方法に変更する必要があります。桁数が合うようにゼロサプライするとかピリオドでsplitして大小判定するとかしないといけません。