一直以来,在网上搜索重签名工具,搜索到的工具比如(wps重签名助手)等,基本上都需要重置info.plist里面的包名,否则经常失败,但是却看到某些提供企业签名服务的服务商却可以不修改包名实现重签app,通过整理重签名步骤,大概猜想一下验证思路,整理本文章.
分为2个模块,分别是:
- 重签名app步骤(你不需要改包名)
- 个人猜想不改包名可以成功原因
重签名步骤
1 . 修改ipa文件为zip格式,并且解压,解压完为Payload文件夹
2 . 进入Payload文件夹下 某某.app 文件夹,显示包内容
3 . 移除当前目录下的_CodeSignature文件夹
-
将我们用来重签名的embedded.mobileprovision文件(来源是开发者中心账号创建的并且下载的,不多讲)移动替换到目录下
查看目录下是否存在子工程,比如说 wedget子工程,如果存在,请移除(我暂时不会也没尝试是否带着子工程可以签名成功,理论上应该可以成功,但是需要充分签名所有的二进制文件)
首先查看FrameWorks文件夹 找到frameWorks文件夹,查看是否存在frameWork文件,如果存在子的frameWork,那么需要对每一个都签,挨个对frameWork执行签名操作
此处签名的命令为:
codesign -fs "iPhone Distribution: 你的发布证书团队名称 自己在钥匙串查看" ***.framework(frameWork路径)
//如果替换签名成功,会显示 ***.framework : relpacing existing signature
-
frameWork文件夹内的frameWork签名之后,那么我们下一步需要获取我们用来签名的embedded.mobileprovision文件中包含的权限信息对我们的Payload文件夹签名
获取embedded.mobileprovision的信息的命令为:
通过下属命令获取里面的文件信息
security cms -D -i embedded.mobileprovision
/*
终端会打印出来所有信息,我们需要选择Entitlements为key的字典,将其copy出来,
*/
copy的模块内容如下:
可以在xcode中,选中plist文件,右键,openAs--SourceCode,将内容copy进去保存即可
将上面的文件命名为elements.plist(任意名字都可以,为了方便理解)文件放到Payload同级目录下(其实放哪都行,只是为了操作方便)
然后使用我们后续的命令,对文件夹进行签名
//--no-strict -- 关键字是不严格的签名 然后配置我们创建的plist 然后进行签名,签名成功也会显示类似frameWork的签名替换
codesign -fs "iPhone Distribution: 你的发布证书团队名称 自己在钥匙串查看" --no-strict --entitlements=/Entitlements.plist /Payload/XDl.app
ps: 可以使用命令查看app签名信息:
//查看app签名信息
codesign -vv -d Example.app
得到信息如图:
-
最好一部便是递归压缩文件,将文件压成ipa
命令如下:
// zip -r 保留的ipa名字.ipa Payload/
zip -r resign.ipa Payload/
- 然后就可以安装到合适的设备上了 中间步骤不需要改包名
个人猜想为什么不修改包名仍旧能够成功
- 通过查看_codeSign文件夹,看到里面是对app下的文件资源都进行了签名结果记录,里面包含info.plist,所以个人猜测苹果将包名(其实是info.plist)当做一个资源文件进行摘要,并没有检验里面的内容,只要确保是开发者签发的就可以
但是我认为这是不安全的,我认为应该也去检验info的信息,就和使用配置文件的权限去对整体文件夹签名一样,需要配置文件里面的包名和info.plist一样,也可能是苹果认为一般打包都是xcode做的,其实我们跑别人包名的时候,xcode会不让跑,让更换包名,难道把检验步骤交给了xcode?个人猜测,不知道有没有同学有别的想法,可以给我提供点思路及想法,谢谢