【iOS技术】APP的签名和重打包的学习

APP的签名

其实对于签名这块我了解的也比较少,但是通过这段时间的学习,我发现ipa的签名主要分两个部分也就_CodeSignature这个文件夹和embedded.mobileprovision**这个文件

  • _CodeSignature文件夹中包含了一系列的验证信息
  • embedded.mobileprovision,证书配置文件中可以找到我们appID等等的相关信息

工具介绍

背景

有时候我们会有这种情况,打包好的ipa说要改一个图片,但是我们懒得重新Archive的时候我们就可以用上这个方法。

实践

我这里说只需要ipa((╯‵□′)╯︵┻━┻但是我没有写好测程序),好吧我这里准备了一个程序GBA4iOS自然这个不是我开发的APP,虽然是开源的可是我怎么编译都通不过…那我们就下载这个GBA4iOS进行实践吧

1、先解压ipa

解压很简单通过归档文件解压,解压后我们会获得下面这样的目录
请输入图片描述

目录就不用我详细介绍了吧

2、找到.app文件显示包内容就会是下面这样的文件夹

请输入图片描述

这里我们可以看到箭头中的两个文件是我们需要修改的

3、删除签名文件

删除_CodeSignature和embedded.mobileprovision文件

如果是自己的APP

修改完.app中的资源文件后

  • 执行下面的操作冲签名 由于是自己的APP 所以秘钥对啥的都已经有了

    /usr/bin/codesign -f -s “钥匙串中的签名证书的名字(iPhone Distribution:xxxx)” –entitlements “entitlements.plist” “Payload/.app文件的文件名.app”

  • 然后压缩成ipa

    zip -qr “$NEW_IPA.ipa” Payload entitlements.plist

如果是其他人的APP

由于bundleID是不能重复的,而且我们没有对方的证书和配置文件~
所以我们最简单的方法就是重新申请一个appID然后修改.app中的info.plist。将plist中的bundleID修改成我们新申请的appID。

let’s do it

1、申请APPID 和 mobileprovision 并且下载下来放到文件夹根目录

请输入图片描述

2、这里我们需要用到一个文件Plist文件entitlements.plist 关于这个的使用其实我还摸得不是特别清楚。

经过实践我发现entitlements中的数据其实都是来源于mobileprovision的所以我们就需要用到工具篇中的mobileprovision-read,读取里面的数据了。
那么生成的方法有两种

  • 创建Plist然后从mobileprovision中拷贝下面这个键值对中的内容(这是一种比较麻烦的方法)
    请输入图片描述
  • 通过命令行创建 执行一下命令行

/usr/libexec/PlistBuddy -x -c “print :Entitlements “ /dev/stdin <<<
$(security cms -D -i “你的mobileprovision文件路径”) >
entitlements.plist

命令执行完毕后自然会生成一个plist文件 你可以按照其他资料资料中的数据进行局部修改

3、重新打包

先cd到Payload的同级目录 将entitlements.plist也拷贝到这个目录

  • 将新的mobileprovision拷贝到.app的根目录

cp “你的mobileprovision文件路径” “Payload/$APPNAME.app/embedded.mobileprovision”

  • 重新执行签名

/usr/bin/codesign -f -s “钥匙串中的签名证书的名字(iPhone Distribution:xxxx)” –entitlements “entitlements.plist” “Payload/.app文件的文件名.app”

等待执行完毕后 选择.app 显示内容 你就会看到新的_CodeSignature文件夹

  • 压缩成ipa

zip -qr “$NEW_IPA.ipa” Payload entitlements.plist

测试ipa是否可以安装

可以使用工具中提到的 mobiledevice install_app xxx.ipa
或者直接找一台机器装装看就好了

最后

上面都是用自带的命令的 现在也有一个工具叫iResign原理就是上面我说的差不多学会了之后可以使用这个工具就好了~ 我们不重复造轮子 可是我们必须知道轮子的构造~ 这个工具可以去github搜索就找到了