Xcode
iOS
証明書
プロビジョニングプロファイル

iOSアプリで証明書の情報を参照する


背景


  • エンタープライズな現場では定期的にアプリをビルドし直す必要がある

  • アプリ配布側ではなく、現場でアプリを使って証明書(プロビジョン)の期限をチェックしたいという要望がある


方針


  • 実行中のアプリからプロビジョンにアクセスする方法はなさそうなので

  • ビルド時にプロビジョンの情報を取り出して設定アプリに埋め込む


実装


準備


  • 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}"


  • 結果

    screen_shot_iphone


  • めでたしめでたし