EnterpriseアカウントのProvisioning Profileの有効期限が切れたので、差し替えを行いました。 備忘録がてら手順を纏めます。(参考にしたサイトと同じですが。。。)

前提

  • 再署名を行うipaファイルがあること。
  • 再署名に使用する証明書とProvisioning Profileが、作業を行うMacに存在すること。
  • iPhone構成ユーティリティがインストールされていること。

手順

今回使用するProvisioning ProfileをiPhone構成ユーティリティから作業用のディレクトリに書き出します。 (説明の中では、Provisioning Profileの名前をnew.mobileprovisionとします。)

ipaファイルを解凍します。ipaファイルはzipファイルなので、リネームして解凍してください。 (説明の中では、ファイル名をtest.app(ipa)とします。)

解凍すると、Payloadディレクトリの下にappファイルが作成されます。 これ以降の作業はターミナルで行います。

展開した時に作成されたPayloadディレクトリに移動します。

$ cd *****/Payload

appファイルにある_Codesignatureディレクトリ、及び配下のファイルを削除します。

$ rm -r test.app/_CodeSignature

appファイルにあるembedded.mobileprovisionを、新しいProvisioning Profileで置き換えます。

$ cp -p new.mobileprovision test.app/embedded.mobileprovision

codesignコマンドを使って、再署名を行います。 証明書の名前は、キーチェーンアクセスから確認できます。 ちなみに-fは、すでに存在する署名を強制的に置き換えるパラメータです。 また、-sは署名を行うパラメータです。

$ codesign -f -s (証明書の名前) \ 
--resource-rules test.app/ResourceRules.plist test.app

再署名に成功した場合、test.app: replacing existing signature というメッセージが表示されます。

展開したファイルから、再度ipaファイルを作成します。

$ cd..
$ zip -qr test.ipa Payload

詰まったところ

codesignを実行した時に、以下のようなメッセージが表示されました。

iPhone Distribution: Minimalab.com: ambiguous (matches iPhone Distribution: Minimalab.com and iPhone Distribution: MINIMALAB.COM. in /Users/****/Library/Keychains/login.keychain)

メッセージの内容は、「codesignコマンドで指定した証明書の名前から、複数の証明書が見つかったのでどれを使っていいかわからない」という内容です。 もしかしたらcodesignのパラメータなどでうまく対応できるのかもしれませんが、やりかたがわからなかったので、いったん使わない方の証明書をp12ファイルに書きだした後、再度実行しました。

さいごに

本当なら再ビルドの方が簡単なのですが、応急処置として覚えておくとよいと思います。

参考

iOS アプリのprovisioning profile差し替え方法 | Septeni Engineers Blog | セプテーニ エンジニアブログ