美文网首页iOS DevelopmentiOS开发点点滴滴iOS点点滴滴
iOS重签名工具开发之路(介绍篇)

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

作者: Johankoi | 来源:发表于2018-02-28 18:24 被阅读571次

相关概念

证书:对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重签名工具开发之路(原理篇)

相关文章

网友评论

  • xiaofengl:重签后,可视化页面,那个bundleID是自动获取embedded.mobileprovision里面的,没发修改了,但我想bundle保持重签名之前的,可以吗?
    Johankoi:@天道酬勤_XJL 应该是可以重新填的
  • 墨凌风起:如果项目中有多个target呢,主target可以选证书,其他的target呢?
    Johankoi:@虎邦国主 打包只能选一个target吧。
    墨凌风起:@心随我所动 打出来的包如果包含多个target呢?就像shareExtension 分享
    Johankoi:我这是对打出来的包。。做重签名。。不关心xcode配置。
  • 明谣_罗潇:很厉害,我下载了你工程跑起来,可签名出来的ipa包bunld id,证书都没变啊,反正目前还不能安装,我也研究你的代码,看看能否找到问题。关于最后写到:继续进行补充,iOS重签名工具开发之路(原理篇),期待这么久还没看到哈~
  • 56d35fdf1a2a:麻烦问一下 原有的包 解压后我替换里面一些东西 比如图片、bundle资源之类的 重签后可以正常使用吗
    56d35fdf1a2a:@心随我所动 还有个问题 github这个工具 我选择描述文件后 自动选择包名都是错误的 这个是什么问题呢
    56d35fdf1a2a:@心随我所动 重签的流程我没搞太懂 还没试
    Johankoi:@来自蒙塔基的罡蛋 你试过了吗
  • 豫风:厉害了,:+1: ,顺便分享一组漂亮的转场动画
    https://www.jianshu.com/p/fbfbcb75dc4b
  • 24125cd48243:我想问一下,重签过后的包,我再修改这个包里面的 plist 文件的内容,是不是必须再重签才能用呢?
    Johankoi:@Onegeng 我刚说了。。刚才做了实验之后。。修改plist之后,的确需要重签。。没说你结论不对。说你的得出结论的理由不对。。。
    Johankoi:@Onegeng 因为我在做这个重签名的应用的时候,分析最终的codesign命令的时候,觉得似乎跟校验plist无关。。但刚才实验过之后,发现确实需要重签一下才有效。。但你的结论结果是对的,理由不对。重签过程并没有对plist进行重签,而是比对Info.plist里面的BundleId是否符合embedded.mobileprovision文件中的。。所以。。苹果的签名机制是对代码二进制起效果的。。
    Johankoi:应该不用。。重新压缩成ipa就阔以。不过我没这么搞过

本文标题:iOS重签名工具开发之路(介绍篇)

本文链接:https://www.haomeiwen.com/subject/vcgbxftx.html