ad-hoc用IPAパッケージを再ビルドしないで修正してみた

業務的に同一のソースコードからBundle IdentifierやAppアイコン、スプラッシュイメージが異なるだけのIPAパッケージをいくつも作る必要があった。
今までは差分ファイルを切り替えるシェルスクリプトと自動ビルドさせるシェルスクリプトを組み合わせてパッケージの数だけ再ビルドを行っていた。
これがソースコードに変更がないのであれば既存のIPAパッケージを元に、再ビルド無しにパッケージを作ることが可能だというのでやってみた。

やりたいこと

既存のIPAパッケージを元に、

  • Appアイコン、スプラッシュイメージの差し替え
  • Appタイトルの変更(Sample1 -> Sample2)
  • Bundle Identifierの変更(com.myapp.sample2 -> com.myapp.sample2)
  • 別のプロビジョニングプロファイルに切り替える
  • 別の署名に切り替える
必要な物
  • Xcode
  • IPAパッケージ
  • codesignコマンド(Mac OS付属)
  • 別のプロビジョニングプロファイルのファイル(myprovision2.mobileprovision)
  • 別のCode Signing Identityの名前(iPhone Distribution: MyDistribution2)
  • 別のAppアイコンとスプラッシュイメージ
手順

1.適当なフォルダにIPAパッケージをunzipする
以下の様なフォルダ構造で解凍される

Payload
└Sample.app
  ├Info.plst
  ├Default.png
  └(略)
iTunesMetadata.plist

2.xcodeでPayload/Sample.app/Info.plistファイルを編集して保存
3.Payload/Sample.app内のAppアイコン、スプラッシュイメージを差し替える
4.myprovision2.mobileprovisionファイルをembedded.mobileprovisionという名前でPayload/Sample.app以下に上書きコピー
5.xcodeでiTunesMetadata.plistを編集してInfo.plistと合わせておく

6.ターミナルを起動して以下のコマンドを実行

export EMBEDDED_PROFILE_NAME=embedded.mobileprovision
export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate"
codesign -f -s -vv "iPhone Distribution: MyDistribution2" -i "com.myapp.sample2" ./Payload/Sample.app

環境変数EMBEDDED_PROFILE_NAMEとCODESIGN_ALLOCATEはcodesignが必要とする


7.PayloadフォルダとiTunesMetadata.plistをまとめてzip
8.zipしたファイルの拡張子ipaに変更


その他
  • Xcodeはv5.x使ってます
  • Xamarin.iOSでビルドしたパッケージでも可能
  • パッケージ内のInfo.plistはビルド時に付加情報が書き込まれてあるので、ビルドを通していないInfo.plistを上書きコピーなどして使ってはいけない。もし使ってしまった場合はインストールに失敗するパッケージになる(codesignコマンドでエラーはでない)。
  • Info.plistファイルは元々バイナリ形式になっているが、XML形式でも問題はおきない。
  • 差し替える画像(PNG)は最適化してなくても問題はおきない。
  • 言語リソース等も差し替え可能。