まずはスクリプト
#!/bin/sh
set -x
input=$1
bundle_identifier=$2
provision=$3
codesign="$4"
entitlements=$5
output=`basename ${input%.*}`.ipa
workdir=${output%.*}.payload
rootdir=$(cd `dirname $0` && pwd -P)
rm -rf $workdir
mkdir $workdir
case "$input" in
*\.ipa)
# ipaを解凍
cp $input $workdir
(cd $workdir && unzip -q $output)
rm $workdir/$output
;;
*\.app)
mkdir $workdir/Payload
cp -r $input $workdir/Payload
;;
*)
exit 1
;;
esac
app=`ls -d $workdir/Payload/*.app`
# 署名を削除
rm -r $app/_CodeSignature
# プロビジョニングプロファイルを上書き
cp $provision $app/embedded.mobileprovision
# プロビジョニングプロファイルに合わせたバンドルIDに変更
plutil -replace CFBundleIdentifier -string $bundle_identifier $app/Info.plist
# 再署名
codesign --force --sign "$codesign" --entitlements $entitlements --timestamp=none $app
# ipaにパッキング
(cd $workdir && zip -qr $output Payload)
entitlements とは
entitlementsファイルはアプリに対する機能の設定であり、下記のフォーマットをベースに Capabilities の設定が追記される。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>$(TEAM_ID).$(BUNDLE_IDENTIFIER)</string>
<key>com.apple.developer.team-identifier</key>
<string>$(TEAM_ID)</string>
<key>keychain-access-groups</key>
<array>
<string>$(TEAM_ID).$(BUNDLE_IDENTIFIER)</string>
</array>
</dict>
</plist>
書き換えに利用したいプロビジョニングプロファイルとバンドルIDでプロジェクトを xcodebuild でビルドすると、最後のほうで下記のような出力を得られるので、この *.app.xcent を利用するのが楽。
/usr/bin/codesign --force --sign XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --entitlements /Users/takezoh/testapp/build/Unity-iPhone.build/Release-iphoneos/Unity-iPhone.build/shared.app.xcent --timestamp=none /Users/takezoh/testapp/build/Release-iphoneos/shared.app
いつ使うん?
iOSはプロビジョニングプロファイルにより、インストールできるデバイスに制限があるので、貰ったipaを検証するときや、再配布する際に使ってます。