Bitriseのアプリインストールサイト
Bitriseでビルドしたアプリの成果物(iOSなら .ipa、 Androidなら .apk)には、 Public
install page を作ることができます。
このチェックをONにして得られ得るURL(QRコード)を関係者やテスターさんにお渡し、テストしたい端末で開けば、以下のようなインストールページが開きます。
このとき、Androidアプリであれば「Install」というボタンが表示されますが、 iOSアプリの場合は Installではなく、このように「Check compatibility」というボタンが表示されることがあります。
これがどういう理由で表示され、何をすると Installボタンに変化するのか、その仕組みを調査してみました。
Installボタンにする方法
まず最初に、これを Installボタンにしてアプリをインストールしたい場合の解決策を書いておきます。
1. Check compatibility ボタンを押す
ボタンを押すとこのようなダイアログが表示されるので、「許可」を押して構成プロファイルをダウンロードします。
2. 「設定」アプリを開く
iPhoneの設定アプリを開くと、Apple IDの設定のすぐ下あたりに、
- 「ダウンロード済みのプロファイル」
- 「プロファイルがダウンロードされました」
などの項目が増えているので、それをタップします。うまく見つけられない場合は、
- 「設定」-「一般」-「VPNとデバイス管理」
- 「設定」-「一般」-「プロファイルとデバイス管理」
あたりを開いてみてください。そこに、「Device Registration (Bitrise)」というプロファイルが見えると思うので、それをタップします。
開くとこのような表示が出るので「インストール」を選択し、インストールします。
3. インストールページのボタンが Install に変化する
プロファイルをインストールすると自動的にインストールページが開きます。最初は「Check compatibility」となっていた画面ですが、そのボタンが「Install」に変わっているはずですので、Installボタンを押してインストールしてください。
3.1. うまくいかないケース
構成プロファイルのインストールに成功しても、このような「The app is not allowed to be installed on your device.」というエラー表示がでてインストールができない場合があります。
これは構成プロファイルのインストールに失敗したわけではなく、このアプリのビルド(.ipa)の問題です。
具体的にいうと、 .ipaファイルに含まれる Ad Hoc Distribution プロファイル (プロビジョニングプロファイル) にこの端末のUDIDが含まれていないことを意味します。
この問題については、私の別の記事である 「iOSアプリ開発の「プロビジョニングプロファイル」「証明書」「署名」を今度こそちゃんと理解する」 をお読みください。
構成プロファイルのインストールはなぜ必要で何をさせられたのか?
アプリをインストールするという目的は上記手順を踏んでいただければ達成されますが、一方で、エンジニアとしてはこのBitriseのアプリインストールページがどうやって作られていて、何が起きているのかを知りたくなってしまいます。
具体的には、以下のような疑問が発生します。
- 何をみて Installボタンと Check compatibility ボタンが切り替わっているのか?
- Webサイトがこの端末のUDIDを知る方法はないはずだ! (あるならすごいセキュリティホール)
- 構成プロファイルをインストールすると iPhoneでは何が起こるのか?
- 言われるがままにインストールさせられたが、安全なのか?
- インストールしてもすぐに消えてなくなってしまうのも気になる
これを解説していこうと思います。
Installボタンと Check compatibility ボタンが切り替わるしくみ
まず、何をみてボタンが切り替わっているのかというと、それは、 この端末のUDIDが、このアプリの Ad Hoc Distributionプロファイルの Device一覧に含まれているかどうか で切り替わっています。こう少し細かく書くと、以下のような3つの状態があります。
- ①このデバイスのUDIDが不明な場合
- → 「Check compatibility」ボタンが表示される
- ②このデバイスのUDIDが判明し、Ad Hoc Distributionプロファイルの Device一覧に含まれていることが判明した場合
- → 「Install」ボタンが表示される
- ③このデバイスのUDIDが判明したが、Ad Hoc Distributionプロファイルの Device一覧に含まれていない ことが判明した場合
- → 「The app is not allowed to be installed on your device」が表示される
です。
WebアプリがUDIDをどうやって知るのか?
WebサイトがJavaScriptなどで直接 UDIDを入手することはできません。にもかかわらず、実際にはUDIDの値によって画面の表示が変わっています。これは一体どういうことでしょうか?
これは、JavaScriptが直接UDIDを入手しているわけではなく、 WebアプリのセッションにUDIDが紐づけられていて、それによって表示を切り替えているだけ です。
つまり、
- WebサーバーのセッションにUDIDが紐づいていない場合
- → 上記①になる
- WebサーバーのセッションにUDIDが紐づいていて、そのUDIDがAd Hoc Distributionプロファイルの Device一覧に含まれている場合
- → 上記②になる
- WebサーバーのセッションにUDIDが紐づいていて、そのUDIDがAd Hoc Distributionプロファイルの Device一覧に含まれていない場合
- → 上記③になる
というわけです。
WebサーバーはどうやってUDIDを入手するのか?
JavaScriptが直接UDIDを入手していないのだとして、なぜサーバーは端末のUDIDを知ることができるのでしょうか? その秘密こそ、今回の主役である「構成プロファイル」です。
構成プロファイルとは?
構成プロファイルというのは、iOS端末の設定(構成)を流し込むための設定ファイルです。以下のような場面で使用(インストール)したことがある方も多いのではないでしょうか。
- IIJmioのような MVNOの SIMを使う際に、「APN構成プロファイル」をインストール
- Wi-Fi接続設定をするために、「Wi-Fi構成プロファイル」をインストール
- 会社のVPN接続設定をするために、「VPN構成プロファイル」をインストール
- 会社や学校のモバイル端末を大量に管理するたのMDMツールを使うために、「構成プロファイル」をインストール
このように、iPhoneの設定画面でぽちぽちと設定する代わりに、ファイルをインストールすることで一気に設定できる仕組みが「構成プロファイル」です。
「Apple Configurator 2と構成プロファイルでWi-Fi接続情報を手軽に管理」 などもご参照ください。
Bitriseの Device Registration 構成プロファイル
今回インストールした Bitriseの Device Registration 構成プロファイルは、以下のような機能を持ったものになっています。
- 端末のUDIDを取得し
- そのUDIDを載せてサーバーにPOSTする
このしくみは、Appleの「Over-the-Air Profile Delivery and Configuration」というドキュメント に詳しく書かれています。
Over-the-Air Profile Delivery Concepts の図がわかりやすいです。
このように、構成プロファイルをインストールすると 2回のHTTP Postを通じてサーバーとデバイスが通信し、情報交換を行います。
この過程で端末のUDIDがサーバーにPOSTされます。
具体的な通信内容は Sample Responses のページに書かれています。
サーバーがUDIDをセッションに紐づける方法
Webアプリがわかる人であればもうわかったと思いますが、この構成プロファイルのPOSTによって、ユーザーの Safari上の Webセッションと端末のUDIDが紐づけられます。
連続したフローで書くと以下のようになります。
- Safariで初めて Bitriseのインストールページを開く
- サーバー上にセッションが作られ、セッションIDが Cookieとして Safariに保存される
- セッションにはまだUDIDが紐づいていないので、画面には「Check compatibility」というボタンが表示される
- ユーザーが「Check compatibility」ボタンを押すと、 **このWebセッションを判別できる何らかのキーを含んだ構成プロファイル
enroll.mobileconfigがサーバー上で生成され、ダウンロードされる - 構成プロファイルをインストールすると、iOSが UDIDを含んだPOSTリクエストを Bitriseサーバーに送信する
- そのUDIDはサーバー上のセッションに紐づけられる
- そのままWebページは元のインストールページにリダイレクト
- SafariでBitriseのインストールページが再度開かれるが、このタイミングでは、UDIDがセッションに紐づいているので、.ipaがインストール可能か判断できるので、表示を切り替える
- インストール可能: 「Install」 ボタンを表示
- インストール不可能: 「The app is not allowed to be installed on your device」エラーが表示
インストールページをわざわざこのようにしている理由
この仕組みをわざわざ作らず、直接 .ipaファイルを置いてしまってもいいのですが、インストール不可能な端末で Installをしようとしても何もエラーが出なかったりするので、トラブルが起こりやすいです。
構成プロファイルを使う方法であれば、インストール可能かどうかを事前に表示できるので、トラブルが少なくなります。
また、インストールできない場合でも、サーバーにはインストールできなかたUDIDが送られるので、追加する際はそのUDIDを使えばよく、UDIDを調べてもらう手間も省けます。
Bitriseのドキュメントによると Bitriseアカウントにログインした状態で構成プロファイルをインストールすると、UDIDが登録されていない場合は、テスト端末の追加画面が出てくるとあります。
(ちょっとすぐに試せる端末がないのですが、そうらしいです)
おわりに
絶対にインストールできるはずの端末で Bitriseの Public install pageの URLをひらいたら「Install」ではなく「Check compatibility」ボタンが出てきて、「???」となったのですが、仕組みを調べたらとてもすっきりしました!







