iOSのipa(app)のProfileを異なるTeamのものに置き換えて実機で動かす

(2020-03-24)

Profileを置き換えて有効期限やDevice IDを更新する。

iOSアプリのProvisioning profile - sambaiz-net

codesignでの試み

.ipa をunzipすると .app が出てくる。

$ unzip my-test-app.ipa
$ tree Payload/
Payload/
└── my-test-app.app
    ├── Base.lproj
    │   └── LaunchScreen.storyboardc
    │       ├── 01J-lp-oVM-view-Ze5-6b-2t3.nib
    │       ├── Info.plist
    │       └── UIViewController-01J-lp-oVM.nib
    ├── Info.plist
    ├── PkgInfo
    ├── _CodeSignature
    │   └── CodeResources
    ├── embedded.mobileprovision
    └── my-test-app

codesign で entitlements を確認する。

$ codesign -d --entitlements :- my-test-app.app > entitlements.plist
$ cat entitlements.plist 
<?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>****.net.sambaiz.test-app</string>
	<key>com.apple.developer.team-identifier</key>
	<string>****</string>
	<key>get-task-allow</key>
	<true/>
	<key>keychain-access-groups</key>
	<array>
		<string>****.net.sambaiz.test-app</string>
	</array>
</dict>
</plist>

--force で上書き署名する。entitlementsなしで署名すると The application could not be verified になった。

$ codesign --force \ 
--sign "Apple Development: *****@***** (******)" \ 
--entitlements entitlements.plist \ 
my-test-app.app

これでデプロイしたところ A valid provisioning profile for this executable was not found のエラーが出た。 単にcodesignするだけでは embedded.mobileprovision は元のままだ。 また、Teamが異なればApp IDのPrefixも異なるので entitlements.plistInfo.plist を編集する必要があったりとなかなかやることが多い。

fastlaneのsighでのresign

調べてみるとfastlaneのsigh でresignするとApp IDの変更や embedded.mobileprovision の置き換えなどもやってくれるらしい。

fastlaneのインストール。

$ brew install fastlane
$ fastlane -v
fastlane 2.143.0

$ export FASTLANE_USER=****@****
# store password in the macOS Keychain
$ fastlane fastlane-credentials add -u ${FASTLANE_USER}

resignする。Profileはマニュアルで作ってダウンロードするか、 ~/Library/MobileDevice/Provisioning Profiles を探して使う。

$ fastlane sigh resign my-test-app.ipa --signing_identity "Apple Development: ****" -p "****.mobileprovision"

これをios-deployでデプロイしたところ無事成功した。便利。 試しにデプロイするDeviceを外したProfileでresignしてみると The executable was signed with invalid entitlements でインストールできなくなったので新しいProfileが効いてそうだ。

$ unzip my-test-app.ipa
$ ios-deploy --debug --bundle Payload/my-test-app.app

参考

ipa ファイルを再署名する

ipaファイルのProvisioningを差し替える - Qiita

iOS受託開発における署名付け替えの技術 - Qiita