相关概念
证书:对iOS项目开发、发布资格进行授权的,主要会用到下面两种 :一个是Development开发证书,另外一个就是Distribution发布证书。具体存在形式就是我们开发人员经常收到并双击安装的那些p12文件。
描述文件:包含了证书信息,App ID,具备调试、测试权限的设备,以及应用的一些功能信息等等,后缀名Provisioning Profile,双击安装后,其实拷贝到了~/Library/MobileDevice/Provisioning Profiles目录下:
重签名的解释:
当在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入口
如上图所示,可以选择要签名的包文件,这个工具支持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运行
命令行模式:
支持使用命令行调起签名功能:(打开源码工程运行macho-sign target,从Products目录拷贝出同名的可执行二进制文件) 命令:
Usage:
$ ./macho-sign
Commands:
+ resign - resign a mach-o type file
Options:
--filepath [default: ] - A mach-o type file path use to resign.
--provisionPath [default: ] - select a mobileProvision file.
--bundleid [default: ] - change bundle identifier in the info.plist of target ipa or other mach-o excuable file.
--displayName [default: ] - change bundle displayName in the info.plist of target ipa or other mach-o excuable file.
--bundleVersion [default: ] - change bundleVersion in the info.plist of target ipa or other mach-o excuable file.
--bundleShortVersion [default: ] - change bundleShortVersion in the info.plist of target ipa or other mach-o excuable file.
--certificate [default: ] - input name of the certificate in login keychan to resign.
--outputPath [default: ] - outputPath after resign.
使用举例:
./macho-sign resign --filepath /xxx/xxx.ipa --provisionPath /xxx/xxx.mobileprovision --certificate "xxx: xx." --outputPath /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重签名工具开发之路(原理篇)