对IPA包进行重签名是iOS开发或分发中的常见需求,主要用于更换证书、修改应用信息、企业掉签重签、适配不同分发渠道等等。
一、重签名前的准备工作
-
必备材料:
- 有效的开发者证书 :企业证书(
iOS Distribution
)或个人/公司证书(Apple Developer
)。 - 描述文件(
.mobileprovision
) :需与证书匹配,重命名后替换为embedded.mobileprovision
。 - 需重签名的IPA文件:确保文件未损坏且结构完整。
- 有效的开发者证书 :企业证书(
-
环境配置:
- Xcode :安装最新版,确保
codesign
命令行工具可用。 - Ruby环境 :部分工具依赖Ruby(如
sigh
),需通过Homebrew安装。
- Xcode :安装最新版,确保
二、签名步骤(本次只整理了命令行重签)
- 解压IPA文件
bash
unzip app.ipa -d temp
- 删除旧签名
bash
rm -rf temp/Payload/*.app/_CodeSignature
- 替换描述文件
bash
cp embedded.mobileprovision temp/Payload/*.app/embedded.mobileprovision
- 修改配置:修改Bundle ID与新描述文件一致
bash
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.new.bundleid" temp/Payload/*.app/Info.plist
- 生成授权文件(entitlements.plist)
bash
security cms -D -i embedded.mobileprovision > profile.plist
/usr/libexec/PlistBuddy -x -c 'Print:Entitlements' profile.plist > entitlements.plist
- 逐层重签名
- 签名动态库/Frameworks(若有)
bash
# 第一种
codesign -f -s "新证书名称" temp/Payload/YourApp.app/Frameworks/*.framework
# 第二种
find Payload/*.app -name "*.framework" -exec codesign -f -s "新证书名称" --entitlements entitlements.plist {} \;
- 签名主应用
bash
codesign -f -s "iPhone Distribution: Company Name" --entitlements entitlements.plist temp/Payload/*.app
- 重新打包IPA
bash
# 第一种
zip -r resigned.ipa Payload
# 第二种
zip -qr resigned.ipa Payload
用Transporter上传,若结构错误,则会提示:Validation failed (409)The lPA is invalid. lt does not include a Payload directory.
注意:
打包代码需要放在Payload当前文件目录,必须符合标准的IPA结构
IPA 本质是一个压缩包(zip格式),其标准结构为:
bash
YourApp.ipa
├── Payload/ # 必须存在的顶级目录
│ └── YourApp.app # 实际应用包
├── SwiftSupport/ # 可选(Swift依赖)
└── Symbols/ # 可选(调试符号)
三、常见问题及解决方案
-
安装后闪退:
- 原因:动态库未签名、证书失效或描述文件不匹配。
- 解决:检查所有嵌套库是否签名,确保证书在有效期内。
-
Bundle ID冲突:
- 重签名时需将IPA的Bundle ID改为描述文件允许的ID。
-
企业证书风险:
- 公开分发可能导致证书被封,建议内部分发使用蒲公英、fir.im等平台。