つばくろぐ @takamii228

知は力なり

macOSにインストール済みのプロビジョニングプロファイルの情報を確認する

Apple Developer Programで発行したプロビジョニングプロファイル(*.mobileprovisionのファイル)はXcode経由だったりファイル自体のダブルクリックでmacOS端末へインストールされ、ipaファイル作成のときに利用されます。

今回、複数のプロビジョニングプロファイルを複数のmacOS端末にインストールして管理する必要があったので、すべてのプロファイルがすべてのマシンにきちんとインストール済みか否かを確認したくなりました。そのときに調べた結果をまとめます。

プロビジョニングプロファイルのインストール先

プロビジョニングプロファイルはインストールすると以下のフォルダに${UUID}.mobileprovisionというファイル名で保存されます。

$ ls $HOME/Library/MobileDevice/Provisioning\ Profiles/*                                                  
/Users/takami228/Library/MobileDevice/Provisioning Profiles/1018cb3f-51c0-4ac2-9f70-81af1e7a52c1.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/2f3a3f52-13af-4a6c-937d-10028146d5ae.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/3d943dc2-ce76-4fb1-a70e-aba05ad9fbc6.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/40acedbd-366c-405d-9a58-ff1b5bd7645e.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/4a898d9e-bae1-448f-b4d0-02fc90cb9bb5.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/701406dd-b5eb-45eb-8096-45bea60f8020.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/737b93bf-b562-4cc3-b8db-126b2e52016d.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/8eedc147-de04-437c-a0dc-00ce0c863764.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/900f557d-6536-46fb-8e17-9fe1b3b08a51.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/bcd30cf8-8386-4f88-9fca-d1128e144eac.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/c1d35546-c60e-40a7-9736-918613eecede.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/c5e116cc-2584-473e-ac67-75a723893266.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/daacc73a-41ce-4367-b2b2-5b97bef776de.mobileprovision

プロビジョニングプロファイルの中身を確認する

プロビジョニングプロファイルの中身はそのままだと表示できません。securityコマンドを使うことでplistファイル形式のテキストに変換ができます。

$ security cms -D -i /Users/takami228/Library/MobileDevice/"Provisioning Profiles"/1018cb3f-51c0-4ac2-9f70-81af1e7a52c1.mobileprovision
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>AppIDName</key>
    <string>flutteripatest</string>
    <key>ApplicationIdentifierPrefix</key>
    <array>
    <string>xxxxxxxx</string>
    </array>
    <key>CreationDate</key>
    <date>2021-07-02T04:56:27Z</date>
    <key>Platform</key>
    <array>
        <string>iOS</string>
    </array>
    <key>IsXcodeManaged</key>
    <false/>
         ...
</dict>
</plist>%  

plistファイルをJSON形式に変換してほしい情報を出力する

plistファイルはxmlチックなデータ形式になっているのでそのままだと扱いにくいです。PlistBuddyをコマンドを使っても良いのですが、securityコマンドとパイプでつないで利用したい場合は一度テキスト出力しないといけないので面倒です。

そこでplutilコマンドで無理やりJSON形式に変換してjqコマンドで必要な情報を出力することにします。

こちらのstackoverflowの記事が参考になりました。

stackoverflow.com

$ security cms -D -i "/Users/takami228/Library/MobileDevice/Provisioning Profiles/1018cb3f-51c0-4ac2-9f70-81af1e7a52c1.mobileprovision" | \
    sed -Ee 's#<(\/)?dat[ae]>#<\1string>#g' | plutil  -convert json -r -o - -- -
{
  "AppIDName" : "flutteripatest",
  "ApplicationIdentifierPrefix" : [
    "xxxxx"
  ],
  "CreationDate" : "2021-07-02T04:56:27Z",
  "DER-Encoded-Profile" : 
   ....
}%                                                                                                                                            

しかし出力されたjson形式のうちBundleIDを表すキーとして"application-identifier"があるのですが、こちらはハイフンを含むのでjqコマンドを通すとエラーになっています。そこで"application_identifier"というアンダースコアに置換することでjqコマンドをパイプすることにします。

$ security cms -D -i "/Users/takami228/Library/MobileDevice/Provisioning Profiles/1018cb3f-51c0-4ac2-9f70-81af1e7a52c1.mobileprovision" | \
    sed -Ee 's#<(\/)?dat[ae]>#<\1string>#g' | plutil  -convert json -r -o - -- - | \
    sed -Ee s/"application-identifier"/"application_identifer"/g | \
    jq -r
{
  "AppIDName": "flutteripatest",
  "ApplicationIdentifierPrefix": [
    "xxxxxxx"
  ],
  "CreationDate": "2021-07-02T04:56:27Z",
  "DER-Encoded-Profile": 
  ....
  "Entitlements": {
    "application_identifer": "xxxxxxxxxx.com.takamiii.flutter.ipa",
    "com.apple.developer.team-identifier": "xxxxx",
    "get-task-allow": true,
    "keychain-access-groups": [
      "xxxxx.*",
      "com.apple.token"
    ]
  },
  "ExpirationDate": "2022-07-02T04:56:27Z",
  "IsXcodeManaged": false,
  "Name": "flutteripa",
  "Platform": [
    "iOS"
  ],
  "ProvisionedDevices": [
    "xxx",
    "xxx",
    "xxx"
  ],
  "TeamIdentifier": [
    "xxxx"
  ],
  "TeamName": "Masanori Takami",
  "TimeToLive": 365,
  "UUID": "1018cb3f-51c0-4ac2-9f70-81af1e7a52c1",
  "Version": 1
}

あとはmobileprovisioningファイルが置かれているフォルダでforループを回せばインストール済みのプロファイル情報一覧が取得できます。 例えばBundleID(application-identifier)とprovisining profileのUUIDと有効期限を一括出力する場合は以下のようにかけます。

#!/bin/sh

for filepath in $HOME/Library/MobileDevice/"Provisioning Profiles"/*; do
  security cms -D -i "${filepath}" | sed -Ee 's#<(\/)?dat[ae]>#<\1string>#g' | \
    plutil  -convert json -r -o - -- - | \
    sed -Ee s/"application-identifier"/"application_identifer"/g | \
    jq -r '. | .Entitlements.application_identifer + " " + .UUID + " " + .ExpirationDate'
done

出力は以下のようになります。

$ ./run.sh 
xxxxxxxxxx.com.takamiii.flutter.ipa 1018cb3f-51c0-4ac2-9f70-81af1e7a52c1 2022-07-02T04:56:27Z
xxxxxxxxxx.com.takamiii.appcentersample 2f3a3f52-13af-4a6c-937d-10028146d5ae 2021-04-05T06:11:07Z
xxxxxxxxxx.takamii228.GeoLocationTracking 3d943dc2-ce76-4fb1-a70e-aba05ad9fbc6 2019-03-08T12:29:30Z
xxxxxxxxxx.com.takamiii.xcodevalidate 40acedbd-366c-405d-9a58-ff1b5bd7645e 2021-12-05T05:52:12Z
xxxxxxxxxx.* 4a898d9e-bae1-448f-b4d0-02fc90cb9bb5 2021-12-05T06:44:01Z
xxxxxxxxxx.com.takamiii.firebaseAppDistribution 701406dd-b5eb-45eb-8096-45bea60f8020 2022-01-10T06:12:26Z
xxxxxxxxxx.com.takamiii.flutter.ipa 737b93bf-b562-4cc3-b8db-126b2e52016d 2021-12-05T05:52:12Z
xxxxxxxxxx.com.takamiii.appcentersample 8eedc147-de04-437c-a0dc-00ce0c863764 2022-10-18T11:46:36Z
xxxxxxxxxx.com.takamiii.firebaseAppDistribution 900f557d-6536-46fb-8e17-9fe1b3b08a51 2022-01-10T06:11:03Z
xxxxxxxxxx.com.takamiii.appcentersample bcd30cf8-8386-4f88-9fca-d1128e144eac 2022-10-18T11:45:27Z
xxxxxxxxxx.com.takamiii.xcodevalidate c1d35546-c60e-40a7-9736-918613eecede 2021-12-05T06:05:12Z
xxxxxxxxxx.com.takamiii.xcodevalidate c5e116cc-2584-473e-ac67-75a723893266 2021-12-05T06:43:38Z
xxxxxxxxxx.com.takamiii.push-test daacc73a-41ce-4367-b2b2-5b97bef776de 2021-07-13T04:32:53Z

あとは出力結果を比較すればプロファイルがインストールされているかのチェックコマンドとして活用できそうですね。