在一些情况下,我们需要对一个ipa文件用不同的证书进行重新签名,期间也许还需要改变应用的bundle id。网上找到的关于重签的文章,大多是针对简单应用的。这儿针对复杂结构应用的重签给出一个方案。
所谓复杂结构应用,这儿是指具备以下特点:
- 具有一个或多个扩展(extension)
- 需要添加额外的功能(capability),如:App Groups
我们假定需要被重签的应用文件为:testapp.ipa。该应用有两个扩展:ext1和ext2。
需要准备东西:
- 新的iPhone Distribution,或者Apple Distribution签名证书,并确保证书的私钥已经导入到钥匙串中。
- 如果要改变应用的bundle id,需要准备对应的profile文件,主应用及扩展都需要。假设他们的文件名为:testapp.mobileprovision, ext1.mobileprovision, ext2.mobileprovision。
具体步骤:
-
解压ipa文件:
unzip testapp.ipa
解压后会得到一个名称为”Payload“的目录。
-
重新获取到应用的功能列表。
我们在xcode中为应用添加功能后,这些信息会记录到扩展名为“entitlements”的文件中,如:testapp.entitlements。但这些文件我们在ipa文件中是找不到的,其中的信息在签名过程中融入到签名数据中了。
那现在我们需要从签名数据中重新获取这些能力信息,包括主应用及扩展:codesign -d --entitlements :- Payload/testapp.app > testapp.entitlements
codesign -d --entitlements :- Payload/testapp.app/PlugIns/ext1.appex > ext1.entitlements
codesign -d --entitlements :- Payload/testapp.app/PlugIns/ext2.appex > ext2.entitlements现在我们得到了3个entitlements文件。将这3个文件中team id, bundle id, group id等信息修改为重签后的值。
-
用新的profile文件覆盖已有的文件。
cp -f testapp.mobileprovision Payload/testapp.app/embedded.mobileprovision
cp -f ext1.mobileprovision Payload/testapp.app/PlugIns/ext1.appex/embedded.mobileprovision
cp -f ext2.mobileprovision Payload/testapp.app/PlugIns/ext2.appex/embedded.mobileprovision -
将以下文件中的bundle id,group id等信息修改为重签后的值:
- Payload/testapp.app/Info.plist
- Payload/testapp.app/PlugIns/ext1.appex/Info.plist
- Payload/testapp.app/PlugIns/ext2.appex/Info.plist
-
修改其它需要修改的信息,这个因应用不同而不同。
-
使用新的证书,及修改后的entitlements文件对应用进行重签名。两个扩展和主应用需要按照从里到外的顺序分别签名。
codesign --entitlements ext1.entitlements -f -s "NEW_CODE_SIGN_IDENTITY" Payload/testapp.app/PlugIns/ext1.appex
codesign --entitlements ext2.entitlements -f -s "NEW_CODE_SIGN_IDENTITY" Payload/testapp.app/PlugIns/ext2.appex
codesign --entitlements testapp.entitlements -f -s "NEW_CODE_SIGN_IDENTITY" Payload/testapp.app其中"NEW_CODE_SIGN_IDENTITY"为新证书的名称。
-
重新打包:zip -qr testapp-resigned.ipa Payload
Done.