前言

还记得刚开始学iOS的时候,以为真机测试只是插上线,command+R就好,直到实践了才发现,这么多步骤都些什么鬼(╯°□°)╯︵┻━┻,什么申请证书,profile,加设备ID…敢再繁琐一点吗?所以一直以来都在吐槽。最近刚好有空,便找个时间来理解下苹果这个流程以及这么做的目的,并记录下来。

内容

非对称加密

这里可能涉及到密码学的一种->非对称加密,这里大家自行了解下,等我有空再整理一篇非对称加密出来。

真机测试流程

首先,我们先来看一下真机测试的流程:

  1. 申请证书(cer)

    我们从Mac电脑的钥匙串工具->从证书颁发机构请求证书,拿到一个CertificateSigningRequest.certSigningRequest文件,然后到苹果开发者平台创建证书的时候提交这个文件,他才会让你创建并给你下载。

  2. 添加APP ID

    苹果开发者平台添加你的Bundle ID,创建APP ID。

  3. 添加Device ID

    苹果开发者平台添加你要真机测试的设备UDID,创建Device ID。

  4. 创建描述文件(profile)

    苹果开发者平台创建描述文件,需要选择你刚才添加的APP ID和Device ID,才能创建并下载。

  5. 运行到手机

    把1和4创建好的证书描述文件双击下,Comman+R,没意外的话,就可以运行到我们的iPhone。

兜了一圈,我们才把APP装到我们iPhone,为什么一向追求简单的苹果会让开发者都这么大圈子呢?

其实吧,这是跟苹果追求的另一个方向->安全有关,为了保证APP安装到iPhone上都是苹果认证的,审核通过的,所有APP必须只能从App Store下载,所以简单来说,苹果应该有一种非对称加密的机制,开发者传APP到苹果服务端,苹果用他的私钥加密APP,而解密的公钥就存放在iPhone上,只能用公钥才能解密,然后安装,这是正常普通用户下载APP使用的流程。

但是,对于开发者来说,他要真机测试,不可能每次都传到App Store上,下载下来测试吧?这样太不人性化了吧?

所以苹果想出了个方法,也就是上面说的真机测试的流程。下面我就简单分析下这个流程实际上是做了什么,首先在Mac电脑有一对公钥私钥,假设称为公钥M,私钥M,苹果服务器和手机有一对公钥私钥,假设称为公钥A,私钥A。

  1. 申请证书(cer)

    申请证书,实际是这样的,咱们的Mac电脑生成公钥M和私钥M,然后把公钥(CertificateSigningRequest.certSigningRequest)传给苹果,苹果用他的私钥A加密公钥M和公钥M的HASH,生成证书(ios_development.cer)。

  2. 添加APP ID

  1. 添加Device ID
  1. 创建描述文件(profile)

    把APP ID,Device ID和权力文件(就是我们Ad Hoc,通知等信息)打包成一个profile文件(ProfileDevelopment.mobileprovision)。

  2. 运行到手机

    重点来了
    Mac电脑编译,打包APP,运行到手机,这个APP里面包含:证书profile私钥M加密可执行文件后的APP签名APP的可执行文件。到手机做的操作:用手机的私钥A解密证书,因为证书是苹果服务器的私钥A加密的,只有公钥A才能解密,解开证书后,再拿证书里面的公钥M,解开由Mac电脑的私钥M加密的APP签名,确认这两步都能成功解密后,再去验证profile里的手机ID,APPID,验证成功,便安装到手机上。

这,就是整个大概流程,苹果用了两次验证,来保证了两点:

  1. 装到手机上的APP必须是苹果允许的
  2. 开发者不会无限制的装到很多台设备上

哔哔了那么多,感觉还不如画张图好理解:

看到这里,其实聪明的读者应该可以猜到了,我们平时弄的p12文件,其实就是Mac电脑的私钥M,发给别的同事,打包到APP,他那边才能到真机才能够解密验证呀。

总结

理解其中的本质有助于解决我们日常真机测试遇到的问题,作为iOS开发者,always Stay Hungry. Stay Foolish.