介绍
1、IPA是ZIP压缩文件,可以直接用zip命令压缩解压
2、IPA 重签名需要准备p12证书、mobileprovision描述文件
3、IPA里面可能包含动态库(.framework , .dylib),也需要重签名
4、IPA里面的扩展(.appex)也有自己的mobileprovision,不复用主App。
5、扩展(.appex)的mobileprovision的id要和App的mobileprovision里面的id保持一致。例如主App是 A.B.C,那么扩展的必须是A.B.C.xxxx 。
6、重签名时,应要重新设置Info.plist里EXTENSION_GROUP值,修改为 group.主App的bundle_id
,例如group.A.B.C
命令
压缩解压缩
unzip 老包.ipa
zip -r 新包.ipa Payload/ SwiftSupport/ # 如果没SwiftSupport可以不添加
查看本地的签名证书列表
security find-identity -v -p codesigning
# 会输出证书的HASH值和证书名
打印mobileprovision的基本信息
主要获取application-identifier,为后面修改InfoPlist里面的bundle做准备
/usr/libexec/PlistBuddy -c \"Print Entitlements:application-identifier\" /dev/stdin <<< $(/usr/bin/security cms -D -i mobileprovision文件路径 )
修改InfoPlist的bundle id
/usr/libexec/PlistBuddy -c "Set:CFBundleIdentifier 新id" "/需要修改的bundle路径如framework/Info.plist"
读取InfoPlist的bundle id
使用defaults,比较简单
defaults read /需要读取的bundle路径如framework/Info CFBundleIdentifier
# 注意,不添加.plist后缀
生成entitlements
# 先获取全部信息
security cms -D -i "embedded.mobileprovision路径" > 输出的plist文件路径"
# 提取entitlements信息
/usr/libexec/PlistBuddy -x -c 'Print:Entitlements' 全部信息的plist文件路径 > 输出entitlements信息的plist文件路径
重新签名
/usr/bin/codesign --continue -f -s "证书HASH或者名字" --entitlements "entitlements信息的plist文件路径" "需要签名的bundle如framework、appex、app"
流程
1、准备好证书和mobileprovision文件
2、解压缩ipa
3、复制对应mobileprovision到app目录、appex目录,并重命名为embedded.mobileprovision
4、修改app、appex的Info.plist文件里的bundle id和EXTENSION_GROUP值
5、生成entitlements信息文件
6、用codesign对app、appex重新签名
7、使用app的证书文件对动态库重新签名
8、把重新签名后的文件压缩为ipa