苹果真机测试原理
前言
还记得刚开始学iOS的时候,以为真机测试只是插上线,command+R就好,直到实践了才发现,这么多步骤都些什么鬼(╯°□°)╯︵┻━┻,什么申请证书,profile,加设备ID…敢再繁琐一点吗?所以一直以来都在吐槽。最近刚好有空,便找个时间来理解下苹果这个流程以及这么做的目的,并记录下来。
内容
非对称加密
这里可能涉及到密码学的一种->非对称加密,这里大家自行了解下,等我有空再整理一篇非对称加密出来。
真机测试流程
首先,我们先来看一下真机测试的流程:
申请证书(cer)
我们从Mac电脑的钥匙串工具->从证书颁发机构请求证书,拿到一个
CertificateSigningRequest.certSigningRequest
文件,然后到苹果开发者平台创建证书的时候提交这个文件,他才会让你创建并给你下载。添加APP ID
苹果开发者平台添加你的Bundle ID,创建APP ID。
添加Device ID
苹果开发者平台添加你要真机测试的设备UDID,创建Device ID。
创建描述文件(profile)
苹果开发者平台创建描述文件,需要选择你刚才添加的APP ID和Device ID,才能创建并下载。
运行到手机
把1和4创建好的
证书
和描述文件
双击下,Comman+R,没意外的话,就可以运行到我们的iPhone。
兜了一圈,我们才把APP装到我们iPhone,为什么一向追求简单的苹果会让开发者都这么大圈子呢?
其实吧,这是跟苹果追求的另一个方向->安全
有关,为了保证APP安装到iPhone上都是苹果认证的,审核通过的,所有APP必须只能从App Store下载,所以简单来说,苹果应该有一种非对称加密的机制,开发者传APP到苹果服务端,苹果用他的私钥加密APP,而解密的公钥就存放在iPhone上,只能用公钥才能解密,然后安装,这是正常普通用户下载APP使用的流程。
但是,对于开发者来说,他要真机测试,不可能每次都传到App Store上,下载下来测试吧?这样太不人性化了吧?
所以苹果想出了个方法,也就是上面说的真机测试的流程。下面我就简单分析下这个流程实际上是做了什么,首先在Mac电脑有一对公钥私钥,假设称为公钥M,私钥M,苹果服务器和手机有一对公钥私钥,假设称为公钥A,私钥A。
申请证书(cer)
申请证书,实际是这样的,咱们的Mac电脑生成公钥M和私钥M,然后把公钥(CertificateSigningRequest.certSigningRequest)传给苹果,苹果用他的私钥A加密公钥M和公钥M的HASH,生成证书(ios_development.cer)。
添加APP ID
- 添加Device ID
创建描述文件(profile)
把APP ID,Device ID和权力文件(就是我们Ad Hoc,通知等信息)打包成一个profile文件(ProfileDevelopment.mobileprovision)。
运行到手机
重点来了
Mac电脑编译,打包APP,运行到手机,这个APP里面包含:证书
,profile
,私钥M加密可执行文件后的APP签名
,APP的可执行文件
。到手机做的操作:用手机的私钥A解密证书,因为证书是苹果服务器的私钥A加密的,只有公钥A才能解密,解开证书后,再拿证书里面的公钥M,解开由Mac电脑的私钥M加密的APP签名,确认这两步都能成功解密后,再去验证profile里的手机ID,APPID,验证成功,便安装到手机上。
这,就是整个大概流程,苹果用了两次验证,来保证了两点:
- 装到手机上的APP必须是苹果允许的
- 开发者不会无限制的装到很多台设备上
哔哔了那么多,感觉还不如画张图好理解:
看到这里,其实聪明的读者应该可以猜到了,我们平时弄的p12文件,其实就是Mac电脑的私钥M,发给别的同事,打包到APP,他那边才能到真机才能够解密验证呀。
总结
理解其中的本质有助于解决我们日常真机测试遇到的问题,作为iOS开发者,always Stay Hungry. Stay Foolish.