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の記事が参考になりました。
$ 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
あとは出力結果を比較すればプロファイルがインストールされているかのチェックコマンドとして活用できそうですね。