iOS重签名工具开发之路(介绍篇)

相关概念

证书:对iOS项目开发、发布资格进行授权的,主要会用到下面两种 :一个是Development开发证书,另外一个就是Distribution发布证书。具体存在形式就是我们开发人员经常收到并双击安装的那些p12文件。

描述文件:包含了证书信息,App ID,具备调试、测试权限的设备,以及应用的一些功能信息等等,后缀名Provisioning Profile,双击安装后,其实拷贝到了~/Library/MobileDevice/Provisioning Profiles目录下:

profile.png

重签名的解释:
当在Xcode进行archive或者通过脚本打包ipa的时候,通常到最后一步,要对包有一个签名过程,对签名起到关键作用的是配置好证书和描述文件。也就是一套证书,描述文件最终签名好一个对应的ipa。
而所谓的重签名的概念就是,可以把一个已经存在的ipa重新配置一套证书和描述文件,再签名生成一个新的ipa包。

开发背景

本人在一家手游公司,我们公司的游戏项目iOS包经常是几百兆,每次上线前正式打包需要十几分钟,而通常需要打出来好几种签名包:Development包(开发证书签名包),Distribution包(用于提审苹果商店包),有些时候还会用企业证书签名包给一些运营人员。这样三个包就需要三倍的打包时间,效率非常低

另外,我们公司比较依赖苹果提供的TestFight测试,而由于游戏包的包体比较大,每次提交苹果商店,TestFight后台审核生效的时间都在一个小时左右
我们各个游戏项目组都经常遇到这样的场景:用了十几分钟打出了dis包,提交苹果后台,QA等了一个小时后TestFight生效可以测试,结果测出了问题。然后修改完问题,又要十几分钟加上一个小时的等待。那如果在等待期间或者等待后又反复出问题,会极大地降低提审的效率。

利用重签名工具可以大大的节省以上的需求场景下所花费的时间。经测试利用重签名工具对一个300多兆的游戏ipa包进行重签只需要花费三四十秒左右。

目前的实践方案:
1.正式提审前,还按照之前正常的打包流程用dis(发布)证书打出一个ipa,用于正常的提审。
2.然后利用重签名工具把包重新签名为dev类型的包,两个包的二进制,以及资源,功能完全一样,因此交付给QA进行测试。
3.若运营或者渠道有需求,继续可以用企业证书重新签名,做分发。

个人开发重签名工具介绍

使用说明

开发了一个MAC APP应用,具有可视化的操作界面,且已经开源: GitHub入口

resign-tool.png

如上图所示,可以选择要签名的包文件,这个工具支持ipa,app,xcarchive三种文件作为签名源文件,重签名之后都会生成ipa
Provisioning Profile:用于选择描述文件,会像xcode一样检索所有双击安装在电脑上的描述文件,列举出来,会自动过滤掉过期的。
Signing Certificate: 选择对应的证书,同样会检索系统钥匙串安装的可用的证书,会自动过滤掉过期的。
new BundleID: 可以重新指定一个新的BundleID。
App Display Name: 可以重新设定一个app名字。
App Version: 可以重新指定version。
App Short Version: 可以重新指定Short version。

安装方法

1.直接下载源码使用xcode运行
2.从GitHub仓库releases找最新发布的dmg安装包,下载安装即可

命令行模式:

支持使用命令行调起签名功能:(前提是要通过dmg安装到应用目录下)
命令:

open -a ResignForiOS --args 

必加参数:
-i 要重签名的ipa/app/xcarchive文件路径
-p 描述文件路径
-c 证书名字,可以在终端使用security find-identity -v -p codesigning命令列出所有在钥匙串的证书,可以挑选出所需签名的证书名字
-o 输出ipa路径

使用举例:

open -a ResignForiOS  --args  -i /xxx/xxx.ipa  -p /xxx/xxx.mobileprovision -c "xxx: xx."  -o /xxx/xxx.ipa 

注意使用此命令行模式,执行命令之前,要关闭退出之前打开的窗口。

签名失败可能的问题以及解决方案

1.目标机有多个版本xcode,命令行环境下没有select对应的当前的xcode版本:

检查一下当前命令号环境下的xcode:

xcode-select --print-path

如果发现指定版本不是当前所用xocde,就使用以下命令指定xcode

sudo xcode-select -switch /Applications/XcodeXXX.app/Contents/Developer 
2.缺少Apple Worldwide Developer Relations Certification Authority证书

检查一下是否安装了AppleWWDRCA.cer:

security find-certificate -c "Apple Worldwide Developer Relations Certification Authority"

如果提示找不到,就打开 苹果官方证书下载地址 点击下载后,双击cer文件即可。OK。
ps:事实上如果缺少AppleWWDRCA.cer,所有申请的开发者证书,在钥匙串里面的显示都会变成不信任证书。

重签名过程中可能用到的有用的命令

1.查看app文件信息

codesign -vv -d /xxx/xxx.app 

能得到app文件签名,包名信息,TeamIdentifier等等:

Identifier=com.xxx.xxx
Format=app bundle with Mach-O universal (armv7 arm64)
CodeDirectory v=20200 size=24373 flags=0x0(none) hashes=754+5 location=embedded
Signature size=4682
Authority=iPhone Distribution: xxx Inc.
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=2017年12月28日 上午11:01:05
Info.plist entries=46
TeamIdentifier=xxx
Sealed Resources version=2 rules=13 files=228
Internal requirements count=1 size=176

2.查看描述文件信息

security cms -D -i /xxx/xxx.mobileprovision

等得到描述文件关联的app包名,过期时间,证书信息,应用配置信息Entitlements,TeamIdentifier等等很多的信息,这些信息也是重签名过程中用到的。

在接下来,我会把工具的一些原理,解析描述文件,代码调用命令执行,实施过程中遇到的一些问题以及解决方法等等,继续进行补充:iOS重签名工具开发之路(原理篇)

推荐阅读更多精彩内容