January 09, 2020

IPA の再署名処理

プログラミング
iOS

いろいろな事情で、iOS 用アプリの再署名 (resign) をしないといけないケースが発生することがあります。開発とパブリッシャが違うとか。

数年前とは少し変わっている様子だったので、基本的な処理をまとめます。

証明書のインストール

あらかじめ証明書はマシンに設定しておきます。

手元の PC なり、Jenkins などを動かすビルドマシンなりに設定しておきましょう。

トラブルシューティング

指定した証明書を使用してくれない事があるので、古いものは削除してからやったほうが良いです。

一度証明書を全部消して、必要なものだけをインストールしておくと確実かなと思います。

必要な情報を準備する

  • リサイン元の IPA ファイルを準備する
  • リサインする mobileprovision を準備する
    • ファイルだけあれば良いので、マシンにインストールされている必要はありません
  • 証明書から、Certificate 名, TeamID を確認しておく

手順

ここでは、作業ディレクトリを準備して置くことにします。

% mkdir workdir
% cd workdir
% mv /path/to/xxx.ipa ./
% unzip xxx.ipa

以下のファイルを作成して実行します。
最初の変数を適宜書き換えてください。

#!/bin/sh -ex

bundleId=com.example.app
mobileprovision=example.mobileprovision
certificate='iPhone XXXX: Xxxxxxx'
teamId=XXXXXXXXXX

# change Bundle ID
plutil -replace 'CFBundleIdentifier' -string $bundleId Payload/*.app/Info.plist

# generate entitlement.plist
codesign -d --entitlements :- Payload/*.app > entitlements.plist
plutil -replace 'application-identifier' -string "${teamId}.${bundleId}" entitlements.plist
plutil -replace 'com\.apple\.developer\.team-identifier' -string $teamId entitlements.plist

# resign
rm -rf Payload/*.app/_CodeSignature/
cp $mobileprovision ./Payload/*.app/embedded.mobileprovision
codesign -f -v -s "${certificate}" --entitlements entitlements.plist Payload/*.app

# zip
zip -qr RESIGNED.ipa Payload/

実行すると、再署名された IPA が生成されます。

適切な端末にインストールできるか確認しましょう。

上記手順は差し替えだけですが、再署名後のフォルダ名を変更したりとかそういった事が必要なケースもあるかもしれません。
スクリプト内に処理を追加すれば対応できます。

参考