2023.2.20
ipaファイルとは何か
Xcode で開発したiOSアプリは、Xcode に含まれる Organizer ツールを使って署名され、拡張子が .ipa のファイルとして出力されます。InHouseアプリでも、AdHocアプリでも、AppStoreに申請するアプリでも、基本的には変わりません。
ipa ファイルを生成することはアプリの「開発」の終着点です。しかし同時に、アプリ「配布」(または「配備」)の世界のスタート地点でもあります。
開発(development)の世界と、配備(deployment)の世界を繋げる .ipa ファイルについて詳細を理解しておくことは、業務用iOSアプリに関係する全ての人にとって良いことでしょう。そこで、本稿では ipa ファイルを紐解き、解説します。
ipa ファイルは単なる zip ファイルである
ipa ファイルは特別なフォーマットのファイルと思われがちですが、実は単なる zip ファイルです。「アプリ」に必要なファイルを1つのフォルダに集めてzip化し拡張子を .ipa にしただけのもの、それがiOSアプリの実態です。ipa が iOS Package Archive の略であることからも分かります。
実際、ipa ファイルの拡張子を zip に変更してから unzip (展開)すると中身を見ることができます。以下は macOS のFinderで、あるアプリの .ipa ファイルを展開して見ている様子です。
Macのターミナルで見るともっと分かり易いでしょうか。
中身を明らかにしたこの .ipa ファイルは、iOS上では以下のような、画面中央にラベルが1つあるだけの超シンプルなアプリです。
.ipaファイルの中身は、アプリが複雑であればあるほど肥大化していきます。UIや見た目、振る舞いが一通り実装されたアプリでは .ipa ファイルは以下のようになり、ファイルもフォルダも多くなります。
アプリによって内容はかなり異なりますが、.ipaファイルの中に共通して含まれる要素を抜き出すと、代表的なものは以下であることが分かります。
ファイル名やフォルダ名 等 | 説明 |
---|---|
Info.plist | アプリそのものやビルド環境に関する情報 |
Pkginfo | iOSでは実質不要だが標準で含まれるファイル (参考 : Runtime Configuration Guidelines) |
Assets.car | アプリで使用する画像が収まったアセットファイル |
embedded.mobileprovision | 署名で使われた Provisioning Profile |
アプリ名 | アプリ名称そのままのファイル。実行バイナリ。Mach-O(マークオー)形式 |
_CodeSignature | 署名の検証データを含むファイルが格納されるフォルダ |
XX.lang | Storyboardのファイルや言語リソースのフォルダ。XXは言語識別子 |
各種リソースファイル | 画像や動画、PDFファイル等のアプリに内包させた実ファイル |
上記以外には、アプリの実装によって特別に追加されるファイルもあります。
例えば、ショートカット用の実装を含むアプリでは専用のファイルが含まれますし、(業務用アプリでは余りないと思いますが)StoreKitを使っている場合は、アプリ内課金アイテムの情報が記載されたファイルも含まれます。
ipa の中身を差し替えたり追加削除することはできない
zipファイルとして展開できるのなら、中身のデータを変更または差し替えてから、再びzip圧縮して拡張子を .ipa に戻したファイルは、iOSアプリとしてインストールできるのでしょうか?
残念ながら、できません。
.ipaファイルの中身を見るとアプリ内で使う画像やPDFファイル、そしてアプリアイコンの画像も含まれていますので、差し替えたくなる気持ちはわからなくもないです。ただ、アプリとしてまとめられていた中身を分解して変更したり差し替える行為は、立派な「改ざん」です。
iOSは、これを検出する仕組みを持っており、.ipaファイルに含まれる
- 実行バイナリ (アプリ名そのままのファイル。Mach-O形式)
- _CodeSignature
がその検出を可能とするデータを内包しています。具体的には、実行バイナリ中の署名機構に含まれる署名データ(前者)、そして署名時に計算される全ファイルのハッシュ値を収めたファイル(後者)、この2つで改ざん有無をチェックするようになっています。
興味のある方は、以下のAppleの公式ドキュメントが参考になりますので一読すると良いでしょう。
ということで、 .ipa ファイルの中身を何か変えたい場合は、実行バイナリ以外のリソースファイルであったとしてもXcodeからビルド or 署名を行う必要がありますので注意して下さい。
ipa の中身のデータは抜き取られる可能性がある
.ipa ファイルの構造を理解すると、業務用iOSアプリケーションではアプリ内に生のデータを含めることに神経質にならなければならないことがよく分かります。.ipa ファイルが入手されてしまうと内部データを容易に抜き取られるからです。
InHouse や AdHoc で業務用アプリを配布している場合は特に注意が必要です。メール添付での誤送信やOTA環境が誰でもアクセス可能になっている等に起因して.ipa ファイルが第三者に入手されると、大事なデータをそのまま抜き取られる可能性があります。
AppStoreの公開アプリや非表示アプリでも同様です。昨今は直接 .ipa ファイルを取得する手段は公にはありませんが、アプリをインストールしたiOS端末から .ipa ファイルとして取り出すことは比較的容易です。(特別なソフトウェアを使えば。入手も容易)
この種の心配はどこまでいってもキリがありませんのでトレードオフですが、ipa ファイルが単なる zip ファイルであることはネット上に多く情報発信されており周知の事実であることは認識しておきましょう。
従って、機密性の高い情報はXcodeのプロジェクトにそのままファイルとして登録するのではなく、
- アプリ起動後にサーバと暗号化された通信(https等)を行って取得する
- アプリ内にファイルを含めるなら特別な暗号化を施す
等の対策をしておくのが良いでしょう。
以上、.ipa ファイルの中身を紹介しました。本稿で紹介した .ipa ファイルに共通して含まれるファイルは、それぞれに技術的に面白いトピックがありますので、また別の投稿で解説してみたいと思います。