Siv3Dで学ぶHTTP通信 #3 バージョンアップの確認と更新
お待たせしました!Siv3Dで学ぶHTTP通信の3回目ですっ!
今回はバージョンアップの確認と実際に更新するところをやってみようと思います。締切に間に合わなくて完成する前に公開、後から完成版を配布なんてことよくありますしね笑
後から配布にしたって、またサイトに赴いてもらえるとは限りませんし、せっかくプレイしてくれているなら完成品をプレイしてもらいたいですしね。
ランチャーとアプリの分離
更新を行う以上、一度アプリを削除する必要がありますが、基本的に実行中のアプリ自身を削除するのは難しいです。そこで実際にユーザーが使うアプリケーションとその起動を行うランチャーに実行ファイルを分けます。図にするとこんな感じです。
※今回扱う更新とはリソースファイルの追加ではなく、実行ファイルそのものの入れ替えという体でやります。
なので、今回扱う実行ファイルは2つになりますが、アプリケーションの方はexeファイルならなんでもいいので、ランチャーの方をSiv3Dで作っていきたいと思います。
サーバー側
まず、ランチャーを作る前にサーバー側を用意したいと思います。更新の確認のためだけにいちいちゲームデータをダウンロードしていては無駄にもほどがあるので、新しいバージョンがあるかだけ伝える用のファイルとしてinfo.jsonを用意しておきます。
info.jsonに必要な情報は最新のバージョンがいくつなのかと、そのURLです。おそらく、バージョンアップを行っても何かあった時ように旧バージョンも残すのが普通ですから、決まったURLだけではいろいろ不便でしょう。
サーバー側にはこのinfo.jsonとアプリをzipファイルにしたものを置いておきます。
ランチャー
ランチャーを作るにあたって一番の問題はランチャー側からアプリの場所を必ず把握できるようにしておく必要があるのと、アプリの場所をユーザーにいじられると面倒ということです。環境変数いじるのもあれですし、APIで取得できるパスにアプリを保存してしまおうと思います。今回はUACに引っかかりたくないのでAppDataを使いますが、環境によらずに取得できるパスであればどこでも構いません。
後は更新を行った際にローカルに今保存してあるアプリのバージョンがいくつなのかを保存しておきます。今回はランチャーのプログラムで出力していますが、もし決まっているならアプリの入っているzipファイルに含めるのもありかもしれません。
書き込みやダウンロードに失敗した時の挙動が書かれていませんがご容赦ください。また、フォルダを圧縮したものを展開すると、そのフォルダ分階層が深くなってややこしいことになるので、フォルダではなく複数のファイルを圧縮した体で書いています。インクルードしているファイルの詳細はGitHubに上がっています。
まず、サーバーからinfo.jsonをダウンロードしてきてローカルのバージョンと比較します。info.jsonをダウンロードするだけならかなり速く処理が完了するはずです。
ローカルが存在しない(初回起動)または最新版が公開されている場合サーバーからデータをダウンロードして展開、古いデータを削除した後、保存します。そのあとは、保存した実行ファイルを起動してランチャー自身は終了します。
まとめ
今まではSiv3Dの機能紹介という一面が強かったですが、今回は実用的なところまで踏み込んでみました。
Siv3DはJanuary 2016からexeファイル単体で機能するようになりました。また、Optionalのリソースを削減すれば上のプログラムの場合、9MB近くまで小さくすることが可能なのでインストーラとしても使うことが可能です。今回は画面に何も表示されませんが、ダウンロード中に遊べるインストーラなんて素敵ですね!
次回はDLCコンテンツという体でサーバー側でもプログラムを動かす予定です!