Xcodeのプロビジョニングプロファイル(.mobileprovision)をcliで更新する

fastlaneなどの最新のCIツールやXcodeのGUIを使えばいろいろ勝手に処理してくれるので最近ではあまる使わないのですが、その昔Xcodeのプロビジョニングプロファイル(.mobileprovision)をcliから更新する必要にせまられて作ったスクリプトです。

このスクリプトをプロビジョニングプロファイル(.mobileprovision)が保存してあるディレクトリで実行するとその内容を解析してXcodeが保存しているプロビジョニングプロファイル(/Users/[ユーザー]/Library/MobileDevice/Provisioning Profiles/に保存されている)の古いプロビジョニングプロファイルと入れ替えます。

```bash:update_mobileprovision.sh
#!/bin/bash

function on_exit()
{
  if [ -f ${MOBILEPROVISION_FILE}.plain ]; then
    rm -f ${MOBILEPROVISION_FILE}.plain
  fi
  if [ -f ${OLD_MOBILEPROVISION_FILE}.plain ]; then
    rm -f ${OLD_MOBILEPROVISION_FILE}.plain
  fi
}

trap on_exit EXIT

USER=`whoami`

MOBILEPROVISION_FILES=`find /Users/${USER_NAME}/Library/MobileDevice/Provisioning\ Profiles/ -maxdepth 1 -type f | sed 's!^.*/!!'`
for MOBILEPROVISION_FILE in ${MOBILEPROVISION_FILES}; do
  #echo ${MOBILEPROVISION_FILE}
  /usr/bin/openssl smime -in ${MOBILEPROVISION_FILE} -inform der -verify > ${MOBILEPROVISION_FILE}.plain 2>/dev/null
  MOBILEPROVISION_UUID=`/usr/libexec/PlistBuddy -c "Print UUID" "${MOBILEPROVISION_FILE}.plain"`

  BETA_ACTIVE=`/usr/libexec/PlistBuddy -c "Print Entitlements:beta-reports-active" "${MOBILEPROVISION_FILE}.plain" 2>/dev/null || true`
  #echo ${BETA_ACTIVE}
  APP_IDENTIFIER=`/usr/libexec/PlistBuddy -c "Print Entitlements:application-identifier" "${MOBILEPROVISION_FILE}.plain" 2>/dev/null || true`
  if [ "${BETA_ACTIVE}" = "true" ]; then
    # Maybe Production
    TARGET_ENV='AppStore'
  else
    TASK_ALLOW=`/usr/libexec/PlistBuddy -c "Print Entitlements:get-task-allow" "${MOBILEPROVISION_FILE}.plain" 2>/dev/null || true`
    #echo ${TASK_ALLOW}
    if [ "${TASK_ALLOW}" = "true" ]; then
      # Maybe Development
      TARGET_ENV='Development'
    else
      # Maybe AdHoc
      TARGET_ENV='AdHoc'
    fi
  fi
  #echo ${TARGET_ENV}
  TERM_ID=`/usr/libexec/PlistBuddy -c "Print Entitlements:com.apple.developer.team-identifier" "${MOBILEPROVISION_FILE}.plain" 2>/dev/null || true`
  #echo ${TERM_ID}
  APP_ID=`echo ${APP_IDENTIFIER} | sed -e "s/^${TERM_ID}\.//g"`
  #echo ${APP_ID}

  # Remove old mobileprovision
  OLD_MOBILEPROVISION_FILES=`(cd "/Users/${USER}/Library/MobileDevice/Provisioning Profiles/" ;ls *.mobileprovision)`
  for OLD_MOBILEPROVISION_FILE in ${OLD_MOBILEPROVISION_FILES}; do
    #echo ${OLD_MOBILEPROVISION_FILE}

    /usr/bin/openssl smime -in "/Users/${USER}/Library/MobileDevice/Provisioning Profiles/"${OLD_MOBILEPROVISION_FILE} -inform der -verify > ${OLD_MOBILEPROVISION_FILE}.plain 2>/dev/null

    BETA_ACTIVE=`/usr/libexec/PlistBuddy -c "Print Entitlements:beta-reports-active" "${OLD_MOBILEPROVISION_FILE}.plain" 2>/dev/null || true`
    #echo ${BETA_ACTIVE}
    OLD_APP_IDENTIFIER=`/usr/libexec/PlistBuddy -c "Print Entitlements:application-identifier" "${OLD_MOBILEPROVISION_FILE}.plain" 2>/dev/null || true`
    if [ "${BETA_ACTIVE}" = "true" ]; then
      # Maybe Production
      OLD_TARGET_ENV='AppStore'
    else
      TASK_ALLOW=`/usr/libexec/PlistBuddy -c "Print Entitlements:get-task-allow" "${OLD_MOBILEPROVISION_FILE}.plain" 2>/dev/null || true`
      #echo ${TASK_ALLOW}
      if [ "${TASK_ALLOW}" = "true" ]; then
        # Maybe Development
        OLD_TARGET_ENV='Development'
      else
        # Maybe AdHoc
        OLD_TARGET_ENV='AdHoc'
      fi
    fi
    #echo ${OLD_TARGET_ENV}
    OLD_TERM_ID=`/usr/libexec/PlistBuddy -c "Print Entitlements:com.apple.developer.team-identifier" "${OLD_MOBILEPROVISION_FILE}.plain" 2>/dev/null || true`
    #echo ${TERM_ID}
    OLD_APP_ID=`echo ${OLD_APP_IDENTIFIER} | sed -e "s/^${OLD_TERM_ID}\.//g"`
    #echo ${OLD_APP_ID}

    if [ "${OLD_APP_IDENTIFIER}" = "${APP_IDENTIFIER}" ] && [ "${OLD_TARGET_ENV}" = "${TARGET_ENV}" ]; then
      rm -f "/Users/${USER}/Library/MobileDevice/Provisioning Profiles/"${OLD_MOBILEPROVISION_FILE}
    fi
    rm -f ${OLD_MOBILEPROVISION_FILE}.plain
  done

  if [ ! -f "/Users/${USER}/Library/MobileDevice/Provisioning Profiles/${MOBILEPROVISION_UUID}.mobileprovision" ]; then
    cp "${MOBILEPROVISION_FILE}" "/Users/${USER}/Library/MobileDevice/Provisioning Profiles/${MOBILEPROVISION_UUID}.mobileprovision"
  fi
  rm -f ${MOBILEPROVISION_FILE}.plain
done
```