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 形式で記述されたアプリに関する情報郡となります。


(Base64エンコードされた特殊な文字列も含まれるのでかなり長い)

かなり長い出力になりますので

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 は特に使いこなせるようになって頂きたいコマンドです。

iOSアプリ開発で悩んだ時に、いつでも相談できる安心感

課題に直面する度に、ネットを検索して彷徨って、断片的な知識でオペレーションすることを繰り返していませんか?

B2C/B2Bの両分野で国内随一の知見と御支援実績を誇る弊社を、いつでも相談できる貴社の相談窓口として頂くことができます。

本サイトに裏付けられた情報の幅広さと深さで、貴社のお悩みを解決いたします。

本サイトはACNメンバーの(株)フィードテイラーが運営するエンタープライズiOS情報サイトです

最近の投稿