iOS重签名
参考:
https://github.com/DanTheMan827/ios-app-signer
本项目:https://github.com/h42330789/ios-app-signer
前言
日常遇到重签名一般都是在做超级签内部分发或从Appstore下载一个APP包来,换一个bundleId重签进行安装到不能再Appstore正常下载APP的手机上做研究使用,这几种场景一般都是更换bundleId、更换签名实现,但一些特殊的场景,比如为了正常收到原bundleId对应的推送,期望要重签才能安装上,但是bundleId还能保留之前的,这样就既能安装ipa包又能收到推送了
一、从这个地址https://github.com/DanTheMan827/ios-app-signer
下载或Fork一份源码到自己仓库
问题1:直接运行会报错
1
2
Showing Recent Errors Only
/Users/macbookpro/Documents/study/ios-app-signer/iOS App Signer.xcodeproj: Signing for "iOS App Signer" requires a development team. Select a development team in the Signing & Capabilities editor.
将开发者账号 解决方案:
在 Signing & Cpabilities
-> Signing
-> macOS
-> Signing Certificate
-> 改成Sign to Run Locally
问题2:使用最新的Xcode15运行时会报错,提示支持的macos版本过低 解决方案:
在 General
-> Minium Deployments
-> macOS
-> 改成支持的版本比如11.0
代码调用栈及说明
一、读取描述文件
MainView -> init -> awakeFromNib -> populateProvisioningProfiles -> ProvisioningProfile.getProfiles()
1.1、使用FileManager
读取/Users/xxx/Library/MobileDevice/Provisioning Profiles
下的所有xxx.mobileprovision
文件
1.2 使用Process
调用命令/usr/bin/security cms -D -i
读取xxx.mobileprovision
的信息
1.3 使用PropertyListSerialization.propertyList
解析数据成字典
1.4 过滤查找出所有未过期的描述文件放入到可选列表中
二、读取证书
MainView -> init -> awakeFromNib -> populateCodesigningCerts -> getCodesigningCerts\
2.1 使用Process
调用命令/usr/bin/security find-identity -v -p codesigning
读取证书信息
三、检查Xcode-select环境
3.1 检查命令/usr/bin/xcode-select -p
是否安装了Xcode
3.2 如果没有战争Xcode,使用命令安装/usr/bin/xcode-select --install
选择及操作 1、选择描述文件chooseProvisioningProfile
chooseProvisioningProfile
-> checkProfileID
—- 2、开始签名 doSign
-> startSigning
-> 没有选择导出地址的选择导出地址 -> controlsEnabled
-> signingThread
-> makeTempFolder
2.1 检查证书是否正常
testSigning
-> codeSign
-> Process
创建临时文件:/var/folders/xxxx/com.DanTheMan827.AppSigner.xxx/test-sign
2.1.1 检查证书是否正常
1
/usr/bin/codesign -f -s Apple Development: xxxxx@aaaa.com (WASWERD2) --generate-entitlement-der
2.1.2 验证任务 testSigning
-> Process
->
1
/usr/bin/codesign -v /var/folders/xxxx/com.DanTheMan827.AppSigner.xxx/test-sign
2.1.3 删除临时文件
1
2
# 在新的线程执行签名
Thread.detachNewThreadSelector(#selector(self.signingThread), toTarget: self, with: nil)
2.2 修改APP信息
2.2.1 让可执行文件有可执行755的权限 /bin/chmod 755 CFBundleExecutablePath
2.2.2 修改bundleId、appName、version
创建临时文件夹
1
2
3
#/usr/bin/mktemp -d -t Bundle.main.bundleIdentifier
/usr/bin/mktemp -d -t com.DanTheMan827.AppSigner
# /var/xxxx/_9/xxxx/T/com.DanTheMan827.AppSigner.xxx