はじめに
個人・法人に関わらずアプリ開発で必ず通る道が、 Google / Apple のアプリ審査です。
アプリを初めてリリースするときやバージョンアップ毎にアプリ審査が行われますが、審査には少し時間がかかります。
去年の話ですが、コロナの影響でAndroidの審査が1週間以上かかることが話題になっていました。
Androidアプリの公開用レビューもCOVID-19の影響で遅れがちに
審査は数年前に比べれば早くなりましたが、緊急の不具合修正で即リリースして反映したい時など問題になってきます(iOSは「App Reviewの優先処理(特急審査)」というものもありますが、審査はなくならないので待ち時間は多少あります)
そこで今回は、アプリ審査なしでアプリに変更を加える方法や、そもそもどういうことができるのかを調べてみました。
注意
- 本記事が原因で生じたいかなる損害において責任を負いませんので、あらかじめご容赦ください
- 本記事はあくまでも調査結果をまとめたもので、実際の運用経験に基づくものではありません
- 本記事で紹介した内容を使用したとしても、アプリの主要な目的や機能を変更するような改修は行うべきではありません
- App Store Reviewガイドライン のソフトウェア要件 2.5.2 に以下の記述があります
2.5.2 Appはバンドル内で完結している必要があります。他のAppを含め、指定されたコンテナエリア外に対するデータの読み書き、またはAppの特徴や機能を導入したり変更したりするコードをエリア外からダウンロード、インストール、実行することは許可されません。実行形式のコードの学習や開発、学生によるテストを目的とした教育用Appでは、コードが他の目的で使用されないという、限られた状況での使用に限り、コードのダウンロードが許可される場合があります。こうしたAppでは、ユーザーがApp上でソースコードの全体を確認し、編集できるようにしておく必要があります。
Firebase Remote Config
概要
アプリ内のパラメータをサーバ側で更新することによって、アプリの動作や外観を変更できるクラウドサービス。
考えられるユースケース
- 外観の変更
- A/B テストの実施
- パーセンテージ ロールアウト(更新した機能の段階的なリリース)
- 強制アップデート・メンテナンスなどの表示のトリガー
対象プラットフォーム
- Android, iOS, Web, C++, Unity
その他、注意点
- 一度フェッチするとキャッシュされるため、値の更新をしても即再フェッチされない。
- フェッチ間隔はデフォルトで12時間。変更可能。
- 設定可能なパラメータ数は2000個、条件は500個の上限制限がある
公式ドキュメント、参考HP
- Firebase Remote Config(公式ドキュメント)
- Firebase の Remote Config を使ってアプリ設定をサーバで管理
- 【Unity】UnityのRemote Configを導入してみた
Alternate Icons
概要
ユーザー操作や特定の条件時など任意のタイミングで、ホーム画面のアプリアイコンを変更できる。
考えられるユースケース
- ホーム画面のアプリアイコンの変更
対象プラットフォーム
- iOS(iOS10.3以降)
その他、注意点
- アイコンを変更したタイミングで、ユーザーにダイアログで通知される
- 対象アイコンは事前にアプリにバンドルしておく必要がある
- アプリがフォアグラウンドにある状態でのみ変更可能
- 時限式、サイレントプッシュ通知経由での変更はできない
公式ドキュメント、参考HP
- App Icon – User-Selectable App Icons(公式ドキュメント)
- How to Programmatically Change your App Icon — iOS Swift Guide
- iOS アプリのアイコンを申請なしですぐに変更?! Alternate Icons を試してみた
ADEP(Apple Developer Enterprise Program) での配布
概要
AppStore に公開しない社内専用のアプリ。
考えられるユースケース
- 社内での業務用ツールとしての利用
対象プラットフォーム
- iOS
その他、注意点
- ADEP を利用するための契約審査がある
- 契約違反にあたる社外への配布が頻発したこともあり、契約審査は厳しくなっている
- 社員が100名以上在籍する法人
- 利用台数の制限なし
公式ドキュメント、参考HP
OTAアップデート(Hot patching、Hot Code Push)
ここでのOTA(Over The Air)アップデートとは、 App Store・Google Play Store のアプリ審査を通さずに、アプリの挙動を変更できる仕組みのことを指します。
セキュリティ対策や緊急性の高いバグの修正、ゲームの新規イベントの各種パラメータ変更などで利用されており、以下のようなものがあります。
- CodePush
- Expo
- ionic
- Rollout.io、jsPatch(※現在使用不可ですが、参考のために記載)
「Rollout.io、jsPatch」で後述しますが、Apple はOTAアップデートを禁止しています。ただ一部例外的に認められています。
CodePush
概要
- OTAアップデートをサポートするためのクラウドサービス
- React Native と Cordova をサポート
- Microsoft が開発
公式ドキュメント、参考HP
Expo
概要
- React Native の開発支援サービス
- カメラでの撮影や位置情報の取得処理などのネイティブコードを書かずに ExpoSDKの API で実装できる
その他、注意点
- デフォルトでOTAアップデート有効
- 以下の内容は OTAアップデートはできない
- SDKのバージョン
- アイコン
- アプリ名
- スプラッシュ画面
- アプリの owner、scheme
- facebookScheme
- アセットバンドル
Expo – Limitations(公式ドキュメント)
- インストール直後のアプリ起動時は、ストアにアップされているバージョンになり、アプリ再起動するとOTAアップデートしたバージョンになる
- もしOTAアップデートを複数回していた場合は、その回数分のアプリ再起動が必要
- 使い分けとして、大きな機能変更は通常のバージョンアップでアプリ審査通してリリース。
軽微な変更・改修はOTAアップデート。というのが良さそう
公式ドキュメント、参考HP
Ionic
概要
Angular をベースに、HTML5アプリの開発に特化して作られた JavaScript フレームワーク。
対象プラットフォーム
Web, iOS, Android
公式ドキュメント、参考HP
Rollout、jsPatch
※これは現在使用できませんが、参考のために記載します
概要
2017年3月 Rollout.io や jsPatch を組み込んでいる公開済みのアプリに、Appleからガイドライン違反の可能性を指摘されました。
This includes any code which passes arbitrary parameters to dynamic methods such as dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations(), and running remote scripts in order to change app behavior or call SPI, based on the contents of the downloaded script.
これには、dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations() などの動的メソッドに任意のパラメータを渡すコードや、ダウンロードしたスクリプトの内容に基づいてアプリの動作を変更したり SPI を呼び出したりするためにリモートスクリプトを実行するコードが含まれます。Even if the remote resource is not intentionally malicious, it could easily be hijacked via a Man In The Middle (MiTM) attack, which can pose a serious security vulnerability to users of your app.
Apple Developer Forums
リモートリソースが意図的に悪意のあるものでなくても、Man In The Middle(MiTM)攻撃によって容易に乗っ取られてしまい、アプリのユーザーに深刻なセキュリティ上の脆弱性をもたらす可能性があります。
Rollout.io や jsPatch は dlopen()など指摘されているAPIを使っていたため問題視され、2017年6月以降はこれらを使っているアプリはリジェクトされることになりました。
CodePush などは例外的に認められている
例外として、 WebKit や JavaScriptCore で実行されるコードに関しては認められています。
CodePush や Expo などはネイティブコードの挙動を変更することはせず、JavaScriptCode上で動いているため問題ない(dlopen()など指摘されているAPI未使用)
公式ドキュメント、参考HP
- AppleのHot Code Pushリジェクト問題、React Nativeへの影響は?
- AppleはなぜiOSアプリの「ホットパッチング」を禁止したのか
- いまだ根強い「Man in the middle」攻撃、二要素認証突破も
Repro
概要
管理画面上で登録したメッセージを、アプリ審査なしで画像やボタンのついたカスタマイズ可能なダイアログを表示できる。
また、外観や動作の変更できるUXオプティマイザーという機能もある(ベータ版)
考えられるユースケース
公式ドキュメントより抜粋
・カートに商品を入れたあと購入に至らなかったユーザーに対しクーポンを配信する
Repro – Webメッセージ
・コンバージョンをあげるために、数日前に登録したユーザーに適切なナビゲーションを表示する
・たとえばUXオプティマイザーを利用して背景色を制御する実装を行えば、管理画面から値を更新するだけで季節に応じて背景色を変えることが可能になります
Repro – UXオプティマイザー(ベータ版)
対象プラットフォーム
Web, iOS, Android
その他、注意点
UXオプティマイザー部分に関して、公式ドキュメントに以下の記述があります。
公式ドキュメントより抜粋
・ユーザーの承認が必要なタイプのアップデートを行わないこと。信頼できないアプリであるとみなされ、場合によってはアプリがリジェクトされるなどのリスクがあります。
Repro – UXオプティマイザー(ベータ版)
・セキュアなデータ・プライバシー保護の必要のあるデータを取得する用途に利用しないこと。
・プラットフォームの制限や規約を回避しようとしないこと。
類似の他のサービス
公式ドキュメント、参考HP
まとめ
いかがだったでしょうか?
パラメータでアプリ内の挙動を変更する場合は Firebase Remote Config、 動的にダイアログを表示したい場合は Repro などのサービスを利用して実現できますし、ゲームのパラメータ変更や緊急性の高いバグ修正などは React Native の CodePush などで出来るようですね。
アプリ機能が大幅に変わるような変更は問題になりますが、思わぬ不具合に対応するために知っておくと便利ではないでしょうか。