Post

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.

将开发者账号 image 解决方案:
Signing & Cpabilities -> Signing -> macOS -> Signing Certificate -> 改成Sign to Run Locally image

问题2:使用最新的Xcode15运行时会报错,提示支持的macos版本过低 image 解决方案:
General -> Minium Deployments -> macOS -> 改成支持的版本比如11.0 image

运行成功 image


代码调用栈及说明

一、读取描述文件

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
This post is licensed under CC BY 4.0 by the author.