2024.9.30
Provisioning Profile を読み解くために使いこなしたいコマンド security と plutil
これまで Provisioning Profile について何度か投稿してきました。iOSアプリ開発現場を何かと悩ませる最たるものですね。
Provisioning Profile を制するものは iOS アプリ開発の運用フローを制すると言っても過言ではありません。Provisioning Profile が理解できるとiOSアプリ開発を見通す解像度がグッと上がります。
本稿では、その Provisioning Profile を読み解くのに便利なツール、security コマンドと plutil コマンドを紹介します。いずれも macOS のターミナルから使うコマンドラインツールです。
開発者でない方は「よく分からない」「自分には関係ない」と思われるも知れませんが、業務用iOSアプリに関係する立場なら必ず役立つ知識ですので、流し読み程度でokですので雰囲気だけでも掴んで下さい。順に見ていきましょう。
Provisioning Profile の形式
iOSアプリ毎に必須である(そして常に我々を悩ませる) Provisioning Profile は、拡張子が .mobileprovision というファイルです。
中身は、CMS(Cryptographic Message Syntax)という標準規格により署名/暗号化されており、そのテキストはXMLで記述された plist となっています。
plist は Property List の略称で、その名の通り設定値の一覧を記述することに特化した形式です。具体的な例をあげると、
<key>ExpirationDate</key> <date>2024-11-30T07:22:27Z</date> <key>TeamName</key> <string>feedtailor Inc.</string> <key>Entitlements</key> <dict> <key>application-identifier</key> <string>123456ABCD.jp.feedtailor.sample.b2bios</string> </dict> ...(略)...
こんな具合に設定値がXMLで並びます。上記の例だと、
- Provisioning Profile の期限は2024/11/30であること
- チーム名は feedtailor Inc. であること
- AppIDがプレフィックス含めて 123456ABCD.jp.feedtailor.sample.b2bios であること
などが分かります。このようにアプリに関する様々な情報について、その名称(key)と値(value)の組み合せがXML記法でひたすら並んで plist を構成します。この plist を CMS というフォーマットで署名/暗号化して、拡張子を .mobileprovision にしたものが Provisioning Profile です。
ということは…。まずは署名を検証し暗号化を解かなければならないことが分かります。次に復号された結果の plist を解釈しなければなりません。
今回紹介するのはそれぞれに有用なツールで、前者が security コマンド、後者は plutil コマンドです。いずれもmacOSには標準でインストールされていて、ターミナルで各コマンドを入力して使います。
デベロッパーの方はぜひ手元のターミナルを使い、以下解説を参考に Provisioning Profile の中身をのぞいてみて下さい。
security
まず .mobileprovision をデコードしてみましょう。security コマンドを使います。色んなことができますが、Provisioning Profile 解読の文脈では以下のパラメタ指定だけ知っていれば十分です。
security cms -D -i [Provisioning Profile へのパス]
cms は文字通り署名/暗号化の形式であるCMS(Cryptographic Message Syntax)のことです。-D はデコードを意味し、-i に続く文字列で対象となる Provisioning Profile ファイル名(パス)を指定します。
その他のオプションに興味ある方は、
security cms
とだけ入力してエンターして下さい。詳細が表示されます。
正しくコマンドが入力できていると、以下のように Provisioning Profile の中身が表示されます。これが plist 形式で記述されたアプリに関する情報郡となります。
かなり長い出力になりますので
security cms -D -i sampleapp_appstore.mobileprovision | less
のようにパイプを繋げて less コマンドに渡したり、
security cms -D -i sampleapp_appstore.mobileprovision > sampleapp_appstore_plist.xml
のようにファイル出力してから、テキストエディタで開いても良いでしょう。syntax highlight 機能を備えたエディタで開くと随分と見易くなります。
plutil
前述の security コマンドで、Provisioning Profile の中身である plist を見ることができました。
抜き出せたのだからもうこれで十分…とも言えますが、もう一つ知っておくと便利なのが plutil コマンドです。plutil は plist utility の略で、plist の一部分の表示や変換、書き換えや削除ができたりします。このコマンドを使って plist をもっと自由自在に扱えるようになっておくとよいです。
独自形式で全貌を見易く表示する
XMLは人間にはちょっと読みにくく冗長です。plutil にはこれをかなりスッキリ読み易く表示するオプション -p があります。plist をXMLファイルとして出力している場合は以下のように使います。
plutil -p [plistのファイルパス]
出力は以下のようになります。
生のXMLを眺めるよりはるかに見易いですね。また、plutil コマンドは標準入力を食わせることもできますので、security コマンドとパイプで繋いで使うほうが楽でしょう。
security cms -D -i [Provisioning Profile へのパス] | plutil -p -
plutil の末尾の – は標準入力をパースするという意味です。
特定のkeyの値を出力する
Provisioning Profile の期限日時だけを知りたいとか、どのアプリ(BundleID)用の Provisioning Profile だったかを確認したい…ってなピンポイントで情報を見たい時に使えるテクニックです。–extract オプションを以下のように使います。
plutil -extract "ExpirationDate" raw [plistのファイルパス] -o -
plist をファイル出力したものに対して実行すると、こんな結果になります。
plutil -extract "ExpirationDate" raw b2biossample-2.xml -o - 2024-11-30T07:22:27Z
Provisioning Profile の期限を表す ExpirationDate の値だけを抜き出せました。オプションでは raw形式 (そのまま) で標準出力に出すという指定をしています。-o オプションは出力の指定で、-o の後の – は標準出力を意味しています。
特定の key を抜き出す場合も、実は security cms からパイプで繋いだほうが楽です。
security cms -D -i [Provisioning Profile へのパス] | plutil -extract [抜き出したいkey] raw - -o -
こんな感じで指定した Provisioning Profile の特定の値を抽出することができます。また Entitlement のように plist がXMLの階層構造を持っている箇所を抜き出したい場合は . で繋いで表現します。
security cms -D -i b2biossample-2.mobileprovision | plutil -extract "Entitlements.application-identifier" raw - -o - 123456ABCD.jp.feedtailor.sample.b2bios
これはアプリの BundleID を抜き出している様子ですね。結構使えそうだと思いませんか?
以前のProvisioning Profile は開発環境Macのどこに格納されているのかという投稿で、あるアプリ用のProvisioning Profile を洗い出すため、以下のように書けると紹介しました。
% find ~/Library/MobileDevice/Provisioning\ Profiles \ -type f -name "*.mobileprovision" -newermt "2023-10-01" \ -exec sh -c ' \ security cms -D -i "$1" | \ plutil -extract "Entitlements.application-identifier" raw - -o - | \ grep -q "XXXXX" && \ echo "${1##*/}" \ ' _ {} \;
まさにこの5,6行目が、今回紹介した内容そのままとなっています。
特定フォルダ配下にある .mobileprovision ファイル全てについて BundleID を抽出して、アプリを表す文字列(例ではXXXXXと表現)が含まれる場合のみ、Provisioning Profile のファイル名を出力する…というワンライナーになっています。
このように、特定要素を抜き出す方法を知っていると Provisioning Profile を調べる効率が上がって便利です。ぜひ活用してみて下さい。
以上、Provisioning Profile を読み解くにあたって役立つコマンドを2つ紹介しました。1つ目に紹介した security は特に使いこなせるようになって頂きたいコマンドです。