モバイルアプリの強制アップデートに関する調査メモとアイデア
はじめに
モバイルアプリ(スマホアプリ)の強制アップデート(アップデートのお知らせ)に関して調べたり、検討したりしたので簡易的なメモを残しておく
強制アップデート(アップデートのお知らせ)とは、↓のようなアプリ起動時に「最新版があるよ」と通知するようなやつ。
TL;DR
- 案1: 自サーバ内でバージョン情報を管理
- 案2: Firebase Remote Config
- 案3: アプリ内で App Store, Google Play にアクセス(スクレイピング)
- 案4: 案3’ と 案1(もしくは案2) との組合せ
- 案5: ライブラリを利用して実装
- NativeScript のみ: NativeScript AppSync
目次
詳細
前置き
- あくまで 調査/検討 段階でのメモ書き。実装はできてないので、上手くいかない案などあるかも
- 参考ページの情報が古く、2020/07/11 現在でも使える方法でない可能性あり
- Swift, Kotlin(Objective-C, Java) での Native App 作成経験はないので、変なことを書いてる可能性あり
- 今は NativeScript (NativeScript-Vue) を使った開発をしている
結論(自分の考えた方法)
ざっくりレベルで各案について記載。
案1: 独自にサーバで管理して API などでバージョン情報を返却
サーバ内で DB なりファイルなりで、最新バージョン情報を手動で管理。
上記の情報をアプリ起動時などに取得し、アプリが保持しているバージョン情報と比較して、古ければダイアログを表示する。
- サーバが必要
- バージョン情報を手動管理、ってのがモヤッとする
- とは言えシンプルでわかりやすくはある
案2: Firebase Remote Config を使う
Firebase Remote Config でバージョン情報を管理。
あとは取得先が異なるだけで、基本的な流れは 案1 と同じ。
- サーバ不要
- バージョン情報は手動更新 (※REST API もある。後述)
- これもシンプル
実例もあり、以下あたりが参考になるはず(試してはいない
- Firebase Remote Configを利用して強制アップデートをおこなう - wootan’s diary
- Firebase Remote Configを使って強制アップデート機能を実装してみた - Qiita
- Firebase Remote Configを使ってアプリバージョンアップを実装する|shogo yamada|note
案3: アプリ内で App Store, Google Play にアクセス(スクレイピング)
アプリ内から App Store や Google Play にアクセスして、最新のバージョン情報を取得。
ダイアログ表示まわりに関しては他案と同じ。
- サーバ不要
- 手動での最新バージョン情報管理が不要
- アプリ内にスクレイピング処理の実装が必要
- App Store, Google Play の HTML 構造が変わると機能しなくなるかも
参考: iOSアプリのアップデートをお知らせする | スーパーソフトウエア東京
iOS は https://itunes.apple.com/jp/lookup?id=<trackId>
へのアクセスで情報が取得できる。
Google アプリ (https://apps.apple.com/jp/app/id284815942
) の場合は、284815942
が <trackId>
なので、https://itunes.apple.com/jp/lookup?id=284815942
にアクセスすると各種情報が取得できる。
1 | { |
※bundleId
を使って http://itunes.apple.com/lookup?bundleId=com.google.GoogleMobile
とかでも OK。
その他スクレイピングに関するページ。
- Android get play store app version - Stack Overflow
- ios - Check if my app has a new version on AppStore - Stack Overflow
案4: 案3’ と 案1(もしくは案2) との組合せ
アプリから App Store や Google Play へのアクセスは行わずに、サーバ上で各サイトから最新バージョン情報を取得。
自サーバで管理する情報、あるいは Firebase Remote Config で管理する情報を更新。
あとはこれまでと同じ。
- サーバが必要
- 手動での最新バージョン情報管理が不要
- アプリ内でスクレイピングしないので、Android/iOS それぞれでの実装が不要
- App Store, Google Play の HTML 構造が変わってもアプリのアップデートは不要(サーバ側の処理を変えれば良いので)
Remote Config の値の置き換えも↓の方法で更新できる(はずな)ので、管理を自動化できる。
ステップ 5: Remote Config のデータに置き換わる JSON データを公開する
※例によって試してないので注意
案5: ライブラリを利用して実装
Android
参考: アプリ内アップデートをサポートする | Android デベロッパー | Android Developers
公式手段が用意されている模様。
アップデートの有無の確認 で情報を取得して、ダイアログを表示するなり、アップデートを開始するなり、とすれば良さそう。
以下の実例も参考になるはず。
iOS
Siren
ArtSabintsev/Siren を使うと簡単に実装できるっぽい。
以下の実例も参考になるはず。
Updates
rwbutler/Updates というのもある。
以下の実例も参考になるはず。
ボツ案: 公式 API を使う
公式に API が用意されてるのでは、と思い調べたがダメそう。
Android
Google Play Developer API | Android デベロッパー | Android Developers
ざっと見たけど、それらしい API 自体が無さそう。(自分が見つけられてないだけかもなので、気になる人は探してみて)
iOS
App Store Connect API | Apple Developer Documentation
使えそうな API 自体はあるんだけど、認証が必要なのでアプリ側に認証情報込みで組み込むのは、ちょっと微妙かなという印象。
たぶんバージョン情報取れるんじゃないかなとは思うが、ちゃんと見てない。
共通的に気を付けた方が良いこと
アップデート有無の 確認/表示 の頻度
アプリでスクレイピングする頻度 or サーバ(or Firebase)にバージョン情報を取得しにいく頻度、最新バージョンがあった場合のダイアログ表示頻度、はちゃんと検討した方が良い。
何も考えずに「起動するたびにダイアログ表示」とかにすると、ユーザーからウザがられる(UX 低下する)と思うので、一度確認や表示したら一定期間は空けるようにした方が良さそう。
「起動するたびにバージョン情報確認」も正直無駄なので、同じように一定期間は空けるようにすべきと思う。
NativeScript 限定案: NativeScript AppSync を使う
NativeScript/nativescript-app-sync
v1.0.0 が 2019/06/19 リリースなので、割と新しめのプラグイン。
最新バージョンは 2019/12/11 リリースの v2.0.0。
※GitHub 冒頭に NOTE: NativeScript AppSync is currently in beta ...(略)
と書かれている通り β版なので利用の際は注意。
自分もさらっと見ただけ(試してない)が、App Store や Google Play を介さずに更新パッケージをアプリに適用できるプラグインの模様。
詳細は以下記事や GitHub を参照。
Enable Live Updates of Your iOS and Android Apps Using NativeScript AppSync
※試したら記事書くと思う
まとめ
- 案1: 自サーバ内でバージョン情報を管理
- 案2: Firebase Remote Config
- 案3: アプリ内で App Store, Google Play にアクセス(スクレイピング)
- 案4: 案3’ と 案1(もしくは案2) との組合せ
- 案5: ライブラリを利用して実装
- NativeScript のみ: NativeScript AppSync
その他・メモ
某有名アプリの挙動を確認したところ、自サーバから API で最新バージョン情報、アップデート通知に利用するメッセージ内容を返却していた。
なので、案1, 案4 も的はずれなことを言っているわけではなく、割と現実的な手法であることは確認できている。
参考文献
記事中に記載のものたち
関連記事
- NativeScript, JsBarcode でバーコードを 生成/描画
- NativeScript でデバイスの輝度(明るさ)を制御する
- NativeScript-Vue でネイテイブアプリの開発(チュートリアル + α)
- NativeScript で生体認証(FaceID, TouchID, Android 指紋認証)
- NativeScript-Vue で QRコードの読取り
- NativeScript で入力範囲外タップでキーボードを非表示にする
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア