关于ios:iOS打包的那一些事情

45次阅读

共计 6075 个字符,预计需要花费 16 分钟才能阅读完成。

一、背景

在 iOS 开发中,大略每个老手都被各种配置、证书、打包和公布等事件折腾过,我亦如此。

教程一搜一大堆,照着教程 1234 也能做下来。然而在这个过程中,我会产生很多问号:

  • 为什么程序能在模拟器上运行,却无奈在真机上运行?
  • 为什么不是每个人都能在本地打包?具备什么条件能力打包?
  • 为什么须要证书,形容文件?
  • 生成证书的原理是怎么的?
  • … …

iOS 开发交换技术群:563513413,不论你是大牛还是小白都欢送入驻,分享 BAT, 阿里面试题、面试教训,探讨技术,大家一起交流学习成长!

很多事件是知其然而不知其所以然。

为了解决心中的纳闷,我借着我的项目的机会,钻研了一番整个打包公布的流程,以及流程中每一步操作的背地都产生了什么。

之后便总结成了这篇文章,分享给大家,心愿能使老手 iOS 开发同学对 iOS 的打包、公布和证书体系有更直观的理解。

一个 iOS 利用最终能在用户的设施上应用,是通过了 开发 -> 打包 -> 公布 -> 下载安装 的过程的。

为了更易于了解,以及防止从一开始就陷入细节,本文将逆序讲述整个过程。

二、iOS 利用的装置形式

作为一个 iOS 用户,我能通过哪些路径装置 app?

  1. App Store

    App Store 是 Apple 官网的 App 公布 平台。在 App Store 中搜寻并装置 App,也是作为一个普通用户最罕用的装置形式。

  2. TestFlight

    TestFlight 是 Apple 官网的 App 测试 平台。在上架到 App Store 之前,能够通过 TestFlight 邀请一部分用户参加测试,相似于网络游戏的公测。

  3. App Center, FIR…

    除了官网的 Apple Store 之外,市面上还存在着 App Center, FIR 等非 Apple 官网的 App 治理平台。在开发过程中,咱们通常会将各个环境的 App 上传到这些非官方的平台中,用于日常测试;另外,咱们也会将其作为企业级利用的最终公布平台。

  4. 通过 Xcode 装置到 真机
  5. 通过 Xcode 装置到 模拟器

    在开发过程中,DEV 们作为非凡的 iOS 用户,也会通过 IDE 间接在真机或模拟器上进行开发和测试。这里把真机和模拟器离开,是因为它们确有不同。对于不同之处,咱们将会在后文中谈到。

下面列出的,是用户,以及 DEV、QA 同学最罕用的 5 种装置形式。那么这篇文章是要讲打包和公布,为什么咱们要理解这些装置形式呢?

是因为不同的装置形式自身,背地就对应着不同类型的 公布 形式。

或者更谨严的说,不同类型的公布形式,就决定了用这种公布形式打进去的 app,最终能通过哪种装置形式装置到机器上。

三、iOS 利用的公布形式

作为打包的那个人,我能通过抉择公布形式,来决定我的利用能让哪些用户、通过何种装置形式下载安装

尽管咱们有着以上不同的装置形式,但其实实质上都是从某个平台上,下载一个软件包到本地并装置(Xcode 除外)。

不同的平台做的也是同样的事件,即提供一个寄存软件包的仓库,可供用户下载软件包。

公布,就是把软件包上传到公布平台。这步就无需赘述了。

那么咱们再往前一步:打包

简略来说,所谓打包,就是将源码转换成 iOS 零碎的软件包 -ipa 文件iPhone application archive

对于一个 iOS 利用,它的打包过程包含:

  1. 抉择公布形式
  2. 抉择证书和形容文件
  3. 编译 & 签名
  4. 导出 ipa 文件

本节咱们关注第一步:抉择一个公布形式。

Apple 提供了 4 种 公布形式:

图 1 iOS 利用的公布形式

  1. App Store Connect – 上架 App Store 以及 TestFlight 的 app,用于生产环境公布
  2. Ad Hoc – 局部机器可装置的 app,用于非生产环境的测试
  3. Enterprise – 企业级利用公布
  4. 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 证书认证核心颁发的,用于确保利用内容可靠性和完整性的凭证

证书分为两种:

  1. 开发证书,用于日常开发 ;
  2. 公布证书,用于利用公布。

生成一个证书的步骤也很简略:

只须要在借助 keychain 在本地生成一个CSR 文件,而后通过开发者账号上传,胜利后就会存在于证书资源池中,在生效前可随时应用下载(这里咱们只须要理解生成证书的步骤,至于这个过程中都产生了什么,以及证书如何能确保利用的可靠性,咱们前面会详述)。

图 6 生成一个证书

(4)形容文件 – 一个 ID,设施,证书的汇合

你可能曾经发现了,后面的 ID,设施和证书的都是各自独立的,咱们看不到它们之间有任何的分割。

而形容文件正是把这些资源整合到一起的汇合。

一个形容文件蕴含:

  • 一个 App ID
  • 开发或公布证书
  • 一组可装置该利用的设施列表(非必有)

形容文件会被打包到利用中,形容该利用的 App ID、持有的公布证书、以及能被哪些设施装置。

形容文件与证书一样,也分 开发 公布 两大类型。其中,公布又被细分为Ad HocApp StoreEnterprise 类型。

还记得后面说的 4 种公布形式吗?它们和形容文件的类型是一一对应的。

在打包的第一步抉择了一个公布形式后,第二步就必须要抉择相应的形容文件。

生成一个形容文件的步骤,就是抉择一个类型,而后在开发者账号下的 ID、设施、证书资源池中选出资源,将它们整合到一起。

最初,咱们用更直观的图来表述形容文件与装置形式、公布形式之间的关系:

图 7 形容文件与装置形式、公布形式之间的关系

至此,咱们曾经大抵理解了开发者账号和它治理的 App ID、证书、设施和形容文件,可能实现打包的第二步了。

接下来就是第三步编译和签名,咱们重点关注签名。

签名与证书严密相干。

为了更好的理解签名的原理和作用,咱们将从证书开始讲起。

五、证书的生成

上一节讲过证书的生成步骤:

  1. 借助 keychain 在本地生成一个 CSR 文件
  2. 通过开发者账号将 CSR 上传至 Member Center
  3. 从 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 的时候产生了什么?

  1. 通过非对称加密,在本地生成了证书的公钥和私钥,保留在 Keychain 中(尽管与非对称加密的形式并不统一,但为了便于了解,咱们把私钥类比成储蓄卡明码)
  2. 将公钥和个人信息一起组合造成了 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 利用打包公布的流程,和证书体系。

在这里,我刻意的没做总结。

开篇的那些问题,大家找到答案了吗?

正文完
 0