背景
- エンタープライズな現場では定期的にアプリをビルドし直す必要がある
- アプリ配布側ではなく、現場でアプリを使って証明書(プロビジョン)の期限をチェックしたいという要望がある
方針
- 実行中のアプリからプロビジョンにアクセスする方法はなさそうなので
- ビルド時にプロビジョンの情報を取り出して設定アプリに埋め込む
実装
準備
- macOS 10.14.4 / Xcode 10.2 / iOS 12.2
- XcodeプロジェクトのBuild Phasesにスクリプトを追加
プロビジョンプロファイルの場所は?
-
EXPANDED_PROVISIONING_PROFILE
でUUIDを取得できるので -
${HOME}/Library/MobileDevice/Provisioning\ Profiles/${EXPANDED_PROVISIONING_PROFILE}.mobileprovision
でアクセスする
プロビジョンプロファイルの中身をみる
- プロビジョンプロファイルはそのままでは処理できる形式ではないので
security
コマンドを使用する
$ security cms -D -i xxx.mobileprovision
- 余分なデータを取り除いたplist形式のものが標準出力にでてくる(この出力を
PROVISION_PLIST
とする)
必要な情報を取得
- あとはいつもの
PlistBuddy
で必要な情報を取得
# 作成日
$ PlistBuddy -c 'Print :CreationDate' /dev/stdin <<< ${PROVISION_PLIST}
# 有効期限
$ PlistBuddy -c 'Print :ExpirationDate' /dev/stdin <<< ${PROVISION_PLIST}
# App ID
$ PlistBuddy -c 'Print :Entitlements:application-identifier' /dev/stdin <<< ${PROVISION_PLIST}
設定アプリに埋め込む
- こちらもいつもどおり
$ PlistBuddy -c "Set :PreferenceSpecifiers:2:DefaultValue ${CREATION_DATE}" "${SETTING_PLIST_PATH}"
完成
- スクリプトの全体像(アプリのバージョンやプロビジョンプロファイルのUUIDも出力してます)
SETTING_PLIST_PATH=${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist
PLIST_BUDDY=/usr/libexec/PlistBuddy
APP_VERSION=$(${PLIST_BUDDY} -c "Print CFBundleShortVersionString" "${PRODUCT_SETTINGS_PATH}")
${PLIST_BUDDY} -c "Set :PreferenceSpecifiers:1:DefaultValue v${APP_VERSION}" "${SETTING_PLIST_PATH}"
PROVISION_PATH=${HOME}/Library/MobileDevice/Provisioning\ Profiles/${EXPANDED_PROVISIONING_PROFILE}.mobileprovision
PROVISION_PLIST=$(security cms -D -i "${PROVISION_PATH}")
CREATION_DATE=$(${PLIST_BUDDY} -c 'Print :CreationDate' /dev/stdin <<< ${PROVISION_PLIST})
EXPIRATION_DATE=$(${PLIST_BUDDY} -c 'Print :ExpirationDate' /dev/stdin <<< ${PROVISION_PLIST})
IDENTIFIER=$(${PLIST_BUDDY} -c 'Print :Entitlements:application-identifier' /dev/stdin <<< ${PROVISION_PLIST})
${PLIST_BUDDY} -c "Set :PreferenceSpecifiers:2:DefaultValue ${CREATION_DATE}" "${SETTING_PLIST_PATH}"
${PLIST_BUDDY} -c "Set :PreferenceSpecifiers:3:DefaultValue ${EXPIRATION_DATE}" "${SETTING_PLIST_PATH}"
${PLIST_BUDDY} -c "Set :PreferenceSpecifiers:4:DefaultValue ${IDENTIFIER}" "${SETTING_PLIST_PATH}"
${PLIST_BUDDY} -c "Set :PreferenceSpecifiers:5:DefaultValue ${EXPANDED_PROVISIONING_PROFILE}" "${SETTING_PLIST_PATH}"