iOS打包发布那些事儿
摘要:一个iOS应用最终能在用户的设备上使用,是经过了开发 -> 打包 -> 发布 -> 下载安装过程的。为了更易于理解,以及避免从一开始就陷入细节,本文将逆序讲述整个过程。
一、背景
在iOS开发中,大概每个新手都被各种配置、证书、打包和发布等事情折腾过,我亦如此。
教程一搜一大堆,照着教程1234也能做下来。但是在这个过程中,我会产生很多问号:
- 为什么程序能在模拟器上运行,却无法在真机上运行?
- 为什么不是每个人都能在本地打包?具备什么条件才能打包?
- 为什么需要证书,描述文件?
- 生成证书的原理是怎样的?
- … …
很多事情是知其然而不知其所以然。
为了解决心中的疑惑,我借着项目的机会,研究了一番整个打包发布的流程,以及流程中每一步操作的背后都发生了什么。
之后便总结成了这篇文章,分享给大家,希望能使新手iOS开发同学对iOS的打包、发布和证书体系有更直观的了解。
一个iOS应用最终能在用户的设备上使用,是经过了**开发 -> 打包 -> 发布 -> 下载安装
**的过程的。
为了更易于理解,以及避免从一开始就陷入细节,本文将逆序讲述整个过程。
二、iOS应用的安装方式
作为一个iOS用户,我能通过哪些途径安装app?
App Store
App Store是Apple官方的App发布平台。在App Store中搜索并安装App,也是作为一个普通用户最常用的安装方式。
TestFlight
TestFlight是Apple官方的App测试平台。在上架到App Store之前,可以通过TestFlight邀请一部分用户参与测试,类似于网络游戏的公测。
App Center, FIR…
除了官方的Apple Store之外,市面上还存在着App Center, FIR等非Apple官方的App管理平台。在开发过程中,我们通常会将各个环境的App上传到这些非官方的平台中,用于日常测试;另外,我们也会将其作为企业级应用的最终发布平台。
通过Xcode安装到真机
通过Xcode安装到模拟器
在开发过程中,DEV们作为特殊的iOS用户,也会通过IDE直接在真机或模拟器上进行开发和测试。这里把真机和模拟器分开,是因为它们确有不同。关于不同之处,我们将会在后文中谈到。
上面列出的,是用户,以及DEV、QA同学最常用的5种安装方式。那么这篇文章是要讲打包和发布,为什么我们要了解这些安装方式呢?
是因为不同的安装方式本身,背后就对应着不同类型的发布方式。
或者更严谨的说,不同类型的发布方式,就决定了用这种发布方式打出来的app,最终能通过哪种安装方式安装到机器上。
三、iOS应用的发布方式
作为打包的那个人,我能通过选择发布方式,来决定我的应用能让哪些用户、通过何种安装方式下载安装
虽然我们有着以上不同的安装方式,但其实本质上都是从某个平台上,下载一个软件包到本地并安装(Xcode除外)。
不同的平台做的也是同样的事情,即提供一个存放软件包的仓库,可供用户下载软件包。
发布
,就是把软件包上传到发布平台。这步就无需赘述了。
那么我们再往前一步:打包
。
简单来说,所谓打包,就是将源码转换成iOS系统的软件包-ipa文件iPhone application archive
。
对于一个iOS应用,它的打包过程包括:
- 选择发布方式
- 选择证书和描述文件
- 编译 & 签名
- 导出ipa文件
本节我们关注第一步:选择一个发布方式。
Apple提供了4种发布方式:
(图1 iOS应用的发布方式)
- App Store Connect -上架App Store以及TestFlight的app,用于生产环境发布
- Ad Hoc - 部分机器可安装的app,用于非生产环境的测试
- Enterprise - 企业级应用发布
- Development - 与Ad Hoc类似,只有后续步骤所需要的证书和描述文件不同
结合上文,安装方式和发布方式之间的关系可以表示成:
(图2 安装方式和发布方式之间的关系)
我们再对比它们之间的主要区别:
(图3 安装方式和发布方式之间的区别)
从上图中我们能得出一些结论:
- 能从App Store和TestFlight上安装使用的,一定是App Store Connect的发布方式。
- 只有App Store中app和企业级应用没有安装数量上的限制。
- 只要向真机上安装app,无论选择哪种安装方式或发布方式,都需要证书,签名,描述文件。
这里我自己的一些额外猜想是,Apple通过发布方式上的限制,确保真正public的应用只能通过Apple审核 ,App Store下载安装。
但大家可能会发现,企业级应用也没有任何安装数量上的限制,甚至不需要审核。那是否可以把企业级应用public的发布呢?
答案是否定的。
首先,企业级应用需要Apple企业账号,Apple对于企业级账号的发放是非常严格的。
其次,Apple规定企业级应用的下载途径不可公开,若发现公开则会有封号,应用失效的后果。
因此,虽然从能力上看企业级应用能被安装在任意一台机器上,但是从途径上Apple限制了可能性。
至于只要向真机上安装app,都需要证书,签名,描述文件,我猜测这是对每一台设备负责吧。
现在我们讲完了打包的第一步发布方式,下一步就是选择证书和描述文件。
我们已经知道,只要向真机上安装app,哪怕是Xcode直接运行,就都需要证书,签名,描述文件。
那么这些资源从哪来、怎么来,就是我们接下来的话题。
四、Apple Developer Account和Member Center
作为负责打包发布的人,我要如何、在哪管理开发和发布所需要的资源?
证书、描述文件等资源被维护在Member Center
中。它是开发者的资源管理中心,可以全生命周期管理:
- 证书,签名,描述文件等资源
- TestFlight、Apple Store上的应用
- … …
登陆Member Center需要开发者账号Apple Developer Account
。
开发者账号有不同的类型。不同类型的开发者账号对应的Member Center拥有不同的能力。
1. 开发者账号的种类
(图4 开发者账号的种类)
从大类上,开发者账号分为三种:个人、组织和教育机构。教育机构这个类别我并没有接触过,也就不在这里深入。
在4个小类中,公司和个人类型的账号只有能否有团队成员这一个区别。因此实际上很多开发者会把个人类型的账号转为公司类型,便于团队协作。
也正是因为大多数应用都需要不止一个DEV来开发,所以比较常用的开发者账号类型就是支持development team
的公司和企业级应用。
对于公司和企业级应用,二者之间除了账号的年费不一样之外,最重要的区别在于,它能否将应用上架App Store。
那么为什么企业级账号无法将应用上架App Store呢?
这里大概解释一下:
从前文我们已经知道,想要上架App Store,就必须选择App Store Connect
的发布方式。
选了某种发布方式之后,后续步骤所需要的证书,描述文件等的类型也是不一样的。
在Member Center中,企业级账号只能生成发布企业应用所需的证书,无法生成App Store Connect的发布方式所需的证书,当然也就没有上架App Store的能力。
同样,公司账号也无法生成企业级证书,无法发布企业级应用。
2. Member Center的用途之:管理ID、设备、证书、描述文件
全生命周期管理ID、设备、证书、描述文件,是Member Cente最重要的功能之一。
下面,我们分别看看它们的概念、用途和生成方式。
(1)ID - 唯一标识符,根据用途分为App ID、Music ID、Merchant IDs等
目前我们只考虑最简单的情况,就只介绍iOS应用必须的,用于标识一个或一组应用的App ID。
下图即用公司类型的开发者账号注册一个App ID的过程:
(图5 注册一个App ID)
从图中我们可以的看出:
- App ID需要指定应用平台
- App ID与Team ID绑定在一起。即,Apple知道一个应用的ID是注册在哪个开发者账号下的,也只允许这个账号内的成员在真机上调试或打包。
- App ID指定了应用的
capabilities
,如:获取WI-FI信息、使用钱包、健康、SIRI…
(2)设备 - 能安装该开发者账号下的应用的设备
设备的概念就更简单了。每个苹果设备都有一个唯一标识符UDID - Unique Device Identifier
。
将某个设备注册到开发者账号下,就是在注册时将该设备的UDID填入。同一台设备可以被注册到多个开发者账号下。
可以理解为开发者账号通过UDID列表,形成自己的设备资源池。
(3)证书 - 由Apple 证书认证中心颁发的,用于确保应用内容可靠性和完整性的凭证
证书分为两种:
- 开发证书,用于日常开发;
- 发布证书,用于应用发布。
生成一个证书的步骤也很简单:
只需要在借助keychain在本地生成一个CSR文件
,然后通过开发者账号上传,成功后就会存在于证书资源池中,在失效前可随时使用下载(这里我们只需要了解生成证书的步骤,至于这个过程中都发生了什么,以及证书如何能确保应用的可靠性,我们后面会详述)。
(图6 生成一个证书)
(4)描述文件 - 一个ID,设备,证书的集合
你可能已经发现了,前面的ID,设备和证书的都是各自独立的,我们看不到它们之间有任何的联系。
而描述文件正是把这些资源整合到一起的集合。
一个描述文件包含:
- 一个App ID
- 开发或发布证书
- 一组可安装该应用的设备列表(非必有)
描述文件会被打包到应用中,描述该应用的App ID、持有的发布证书、以及能被哪些设备安装。
描述文件与证书一样,也分开发和发布两大类型。其中,发布又被细分为Ad Hoc
、App Store
、Enterprise
类型。
还记得前面说的4种发布方式吗?它们和描述文件的类型是一一对应的。
在打包的第一步选择了一个发布方式后,第二步就必须要选择相应的描述文件。
生成一个描述文件的步骤,就是选择一个类型,然后在开发者账号下的ID、设备、证书资源池中选出资源,将它们整合到一起。
最后,我们用更直观的图来表述描述文件与安装方式、发布方式之间的关系:
(图7 描述文件与安装方式、发布方式之间的关系)
至此,我们已经大致了解了开发者账号和它管理的App ID、证书、设备和描述文件,能够完成打包的第二步了。
接下来就是第三步编译和签名,我们重点关注签名。
签名与证书紧密相关。
为了更好的了解签名的原理和作用,我们将从证书开始讲起。
五、证书的生成
上一节讲过证书的生成步骤:
借助keychain在本地生成一个CSR文件
通过开发者账号将CSR上传至Member Center
从Member Center下载证书
但看这个描述,我们根本无法得知每一步的原理和目的。比如:CSR是什么,有什么用;上传CSR成功为什么能生成一个证书?这中间Apple又做了什么?
相信这些问题在这一小节结束后,你会知道答案。
1. 生成CSR文件: Keychain -> 证书助理 -> 从证书颁发机构请求证书
(图8 生成CSR文件)
CSR(Certificate Signing Request)
文件是用keychain生成的,包含了请求证书者的个人信息的,用于向Apple证书颁发机构(Apple Worldwide Developer Relations Certification Authority
,为了简单理解,后文统称Apple Root CA
)申请证书的一个文件。
(图9 CSR文件的内容)
想象一个场景:如果你去银行办理一张储蓄卡,那么银行就会要求你提供身份证,并填一份申请单,添上姓名、籍贯、常用住址等个人信息。
我们简单做一下类比:Apple Root CA就相当于银行,证书相当于储蓄卡,CSR文件就相当于储蓄卡的申请单。
生成CSR的时候发生了什么?
- 通过非对称加密,在本地生成了证书的公钥和私钥,保存在Keychain中(虽然与非对称加密的方式并不一致,但为了便于理解,我们把私钥类比成储蓄卡密码)
- 将公钥和个人信息一起组合形成了CSR
这里插播一点对非对加密的简单理解:通过非对称加密生成的一对公钥和私钥,它们能互相解密出经过对方加密后的信息,并且也只有它们才能解密。
如果我们将+和-分别定义为加密和解密,那么:
(图10 非对称加密)
2. 通过开发者账号将CSR上传至Member Center
成功后,我们就能在Member Center上下载证书了。
回到办理银行卡的流程:你将身份证、申请单交给工作人员,工作人员确认你本人和身份证相符,然后经过一系列的操作,最终会把办理好的银行卡交给你。
银行卡中是包含了你的个人信息的,因为办理很多的业务,都需要你本人携带身份证,并保证和开户信息一致。
这正是对应了当前这一步。
类比于银行工作人员的一系列操作,Apple Root CA在从CSR到证书的过程中做了什么呢?
首先,Apple Root CA是有一个由自己颁发的证书的(CA证书)。同样,这个证书也有它对应的公钥和私钥。
当我们将CSR传给Apple Root CA,它会在验证身份之后,后用CA证书的私钥,对公钥和部分个人信息做加密,然后连同CSR中的公钥一起,形成证书,并记录在Member Center中。
(图11 证书生成的原理)
3. 从Member Center下载证书
下载证书到本地并安装。由于证书中包含证书的公钥,我们本地保存着证书的私钥,所以它们在Keychain中可以匹配得上:
(图12 安装证书到本机)
六、签名
加密应用的内容
打包的第三步:编译和签名。对应用签名,就是用证书的私钥加密应用的内容。签名会一并打包到应用中。
签名是打包的必需步骤。
签名需要证书的私钥。
证书的私钥保存在证书申请人的keychain中。
(图13 App的签名)
因此:
- 作为非证书申请人,如果你想在本地打包,则需要向证书申请人请求私钥。
- 作为证书申请人,请像保护银行卡密码一样保护私钥,尽量不分发私钥。分发私钥意味着其他人可以以你的名义打包和发布应用。
至此,我们已经介绍完了打包的核心步骤。
那么我们为什么需要证书和签名呢?
七、证书和签名的作用
用证书验证签名,从而保证App来源可信
前面我们讲了签名和证书的生成过程,这里终于到了展现它们用处的时候了。
我们将通过2步验证,最终相信应用的可靠。
首先我们来回顾前面的内容:
- 描述文件中包含有证书
- App中包含有描述文件和签名
除此之外,iOS设备默认装有并信任Apple Root CA证书。
(图14 iOS 设备上的App和Apple Root CA证书)
下面我们开始验证:
1. 用Apple Root CA证书,验证应用证书的有效性
应用证书的签名,是由Apple Root CA的私钥加密应用证书的公钥和一些个人信息得到的。
如果用Apple Root CA证书中的公钥,能解密应用证书的签名得到应用证书上公钥,则能证明应用证书是由Apple颁发的。
(图15 验证App证书的有效性)
2. 用验证过的应用证书,验证应用签名的有效性
应用签名,是由应用证书的私钥加密应用内容得到的。
如果用应用证书中的公钥,能解密应用签名得到应用的内容,则能证明签名有效,应用可信。
(图16 验证App签名的有效性)
八、不是总结的总结
通过以上内容,我们了解到iOS应用打包发布的流程,和证书体系。
在这里,我刻意的没做总结。
开篇的那些问题,大家找到答案了吗?
文/ThoughtWorks 王叁
更多精彩商业洞见,请关注微信公众号:ThoughtWorks洞见
iOS打包发布那些事儿相关推荐
- Unity iOS打包发布流程
一.版本说明 Unity 2020.3.33f MacOS Monterey 12.3.1 XCode 13.4.1 二.开发者账号 苹果开发者平台 https://developer.apple.c ...
- flutter ios打包_Flutter项目之iOS应用的打包发布流程
微信公众号:Hi Flutter 关注可了解Flutter开发及IT科技资讯.问题或建议,请公众号留言;如果你觉得本文内容对你有帮助,欢迎赞赏 .No.1 Flutter打包发布iOS应用 No.3 ...
- iOS自动化打包发布之fastlane 实现 发布AppStore 蒲公英
iOS自动化打包发布之fastlane 实现 fastlane官方文档 前提插件配置 首先要安装xcode-select 然后安装fastlane sudo gem install fastlane ...
- 基于H5的App在IOS App Store的打包发布流程
基于H5的App在IOS App Store的打包发布流程 0.说明 1.ios证书配置 (1)创建CSR文件 (2)申请开发者证书 (3)申请推送证书 (4)申请provisioning profi ...
- Flutter IOS 新建打包发布全流程 2023 版
大家好,我是 17. 上一篇写完 Flutter Android 打包保姆式全流程 2023 版 后,小伙伴 MannaYang 和 Mapleeeeeee 留言说要看 IOS 打包的流程.于是 17 ...
- Flutter开发之iOS应用打包发布(23)
Flutter iOS android 编译打包 安卓开发者如何使用Flutter打包IOS应用 https://www.jianshu.com/p/a052cbfd12fa Flutter的菜鸟教程 ...
- iOS最新打包发布流程
关于如何发布iOS应用到App Stroe,苹果开发者中心已经给出了很详细的说明.和普通的iOS应用一样,使用React Native开发的iOS应用也需要使用普通的iOS应用的发布流程,总的来说,主 ...
- Flutter 搭建 iOS 命令行服务打包发布全保姆式流程
theme: smartblue 在以前的 < Android 和 iOS 打包提交审核指南> 里介绍了 Flutter 下打包 Android 和 iOS 的指南,不过这部分内容主要介绍 ...
- Hbuilder,HbuilderX 打包发布 ios 应用
1.Hbuilder,HbuilderX需要打包发布ios应用条件 ①.需要苹果Apple ID,需要开通苹果开发者账户,需要交纳费用. ②.在开发者中心创建证书,应用,添加测试设备及创建profil ...
最新文章
- linux网站配置文件,Linux网站服务器配置文件
- 前端开发需要了解的JS插件
- 多行匹配.+表示分组的错误
- java缩放浏览器_javascript检测浏览器的缩放状态实现代码
- PostgreSQL在win7上安装详细步骤
- 正月初四 | 2月15日 星期一 | 特斯拉否认推出16万元更便宜车型;中国首位百亿票房导演诞生;冷光烟花纳入烟花爆竹管理...
- 127_Power PivotPower BI DAX计算订单商品在库时间(延伸订单仓储费用)
- Jmeter 新手教程
- 项目管理学习笔记二:信息系统服务管理
- DNS全局负载均衡(GSLB)基本原理
- Python--SQLite学习(10.29)
- 元气骑士机器人旁边建筑_元气骑士:锤落谁家?锤子更适合机器人还是能双持的骑士呢?...
- 丈夫创业前后累计11次
- 按功能说明计算机中有哪些类型的寄存器?
- UPS不间断电源原理与选用配备技巧
- 在线教育开源源码:线上教育如今各种“陷阱营销”,应如何规避?
- android 方向传感器,10.11 传感器专题(2)——方向传感器
- java imageio temp_Java ImageIO.setUseCache方法代碼示例
- WIN10下配置Yolov3(VS2019,GPU)+opencv训练自己的数据集(绝对详细,小白型记录)
- 第7章第29节:四图排版:四张图片并列排版 [PowerPoint精美幻灯片实战教程]
热门文章
- [Discuz 插件] SEO天涯海角 3.1.0 正式版.rar
- Tensorflow搭建卷积神经网络识别手写英语字母
- 新倩女幽魂维护服务器时间表,《倩女幽魂2》周常维护服务器合并候选名单
- Backtrader-Date Feeds之如何加载数据
- fix feeds/telephony/net/freeswitch/Makefile
- Discuz 论坛 版主回复后在帖子列表后加版主回复字样
- C++中的取余函数%、remainder、fmod以及matlab中的取余函数mod
- Camtasia studio2023最新版录制编辑视频软件功能介绍
- 微信小程序 | 小程序系统API调用
- 315/433无线模块解码