iOS 程序从开发完到上 AppStore 那点事儿

一、账号体系

想要进行iOS开发,除了必备一台装有Mac OS X/Xcode的Mac开发机(iMac or MacBook)之外,还必须要有苹果开发者账号,只有拥有开发者账号,才能申请开发/发布证书及相应配置文件,项目才可以发布到App Store上。

开发者账号分为两种类型:

  • Individual(个人或公司开发者账号$99):能够在指定的设备上进行真机调试,可以在AppStore发布项目。

个人账号和公司账号的区别:个人账号注册流程快,没有团队角色管理。只能一个用户登录操作;公司账号需要注册邓白氏码,企业营业执照,流程复杂,流程耗时长。有角色管理功能,能邀请多个appleid分不同角色管理。

  • Company/Organization(企业开发者账号$299):企业账号还不同于公司账号,企业账号能够进行Debug,Inhouse(企业内部发布,鹅厂的RDM)发布应用,不能发布AppStore,更像是企业内测账号。

注意:第一类中的公司账号和第二类中的企业账号不是一码事,虽然听上去公司和企业是有些相似的概念。

如果我只是想本地开发练手,并不想发布到App Store上,也是可以不必花钱就能进行真机调试的。Xcode7以后,苹果放宽了开发者的范围,只要一个真实的苹果账号(在App Store里下载应用的或者用于iTunes的账号)即可。详情请见http://www.jianshu.com/p/351be39f959e

二、打包

一个App能在自己的手机上运行,和能放到App Store里被所有人下载还是不一样的。当我们开发完APP,肯定想要发布到App Store供人下载,这个过程中,我们不是直接把写好的代码发给苹果公司就完事了,而是要把自己的代码像发快递一样打个包装,发给苹果公司,由它审核通过,允许发布到App Store才能上线。嗯,就是说我们是淘宝卖家,苹果公司是我们的收件人,它收到货后确认收货我们才能拿到钱。

但是在这个过程中会有一个问题,如果别人冒充我的名义发给苹果公司一份恶意代码包怎么办?苹果公司岂不是要给我差评?我岂不是很冤?为了避免这样的问题,在苹果App Store中上线的应用都需要通过一套数字证书签名机制来确保项目代码的来源是可信任的,代码是完整的,未经他人修改的。这套机制基于非对称性加密(也称为公钥加密)算法,开发者用私钥对代码进行签名加密,苹果公司用包含公钥的证书进行验证。

不同的开发者账号可以打的包也不同,大体可以分为debug版还是release版,具体打包分类如下:

个人/公司开发者

  • development:本地调试使用
  • distribution
  • Ad Hoc:可供有限个登记到开发者中心-->设备中的设备安装使用
  • App Store:发布到App Store版本

企业开发者

  • development:本地调试使用
  • distribution
  • Ad Hoc:可供有限个登记到开发者中心-->设备中的设备安装使用
  • in house:企业内部使用,没有测试机的数量限制,我们大鹅厂的RDM就属于in house类型。用企业证书打包应用的最大好处是:应用可以安装到非越狱的设备上运行,这样很方便进行较大规模的测试、或公司范围发起内部体验,企业证书打包的应用禁止外发。

这里详细说一下Ad Hoc模式,Ad Hoc这种方式主要是为了给测试人员或者内部体验人员安装我们的程序以供测试使用的,对于大公司来说,让他们每个人都拿着手机连到开发机进行安装显然是不现实,我们需要打包(Archive)我们的程序。

Ad Hoc方式就是在上架前最大程度的呈现出上架后的状态,它与上架到AppStore的包唯一的区别在于Ad Hoc的包可以在指定机器上安装,而上AppStore的包需要苹果重签名才能安装到iOS设备上。也就是说,Ad Hoc模式需要用distribution证书并以release方式打包,但是它可以指定设备(DeviceId)。

打包的过程需要申请发布证书、配置文件等,每种打包模式必须对应各自的证书和配置文件,下面就详细介绍一下这个过程以及其中涉及到的一些文件的主要功能。

2.1 Bundle ID

Bundle ID (Bundle Identifier)是一款iOS应用的唯一标识,应用与Bundle ID之间是唯一对应关系。应用新建成功后,Bundle ID将不可修改,如必须修改只能创建一个新的应用。

2.2 APP ID

开发者需要在开发者中心下图的页面点击加号来注册自己的APP,通过App ID用于标识一个或者一组App, App ID应该是和Xcode中项目的Bundle ID是一致的或者匹配的。开发者可以在下面的位置点击加号创建App ID。

每创建一个App ID,我们都可以设置该App ID所使用的APP Services,也就是其所使用的额外服务。

下面是目前所有可选的服务和相应的配置要求。按照这个要求去配置你的App以获得相应的服务。

App ID主要有以下两种:

  • Explicit App ID:唯一的App ID,这种App ID用于唯一标识一个应用程序,例如com.tencent.portfolio,标识Bundle ID为com.tencent.portfolio的程序。Explicit App ID要与App ID一致。
  • Wildcard App ID:通配符App ID,用于标识一组应用程序。例如可以表示所有应用程序,而com.tencent.可以表示以com.tencent开头的所有应用程序。对于Wildcard App ID,只要bundle identifier包含其作为Prefix/Seed即可。

在某些时候我们可以使用通配符,但是通配符无法完成推送功能。也就是说,如果要使用Apple Push Notification Services,则必须是一个explicit App ID,以便能唯一标识一个应用程序。

需要着重说明一下,AppID是一款应用程序在苹果全平台的唯一标识。正好前两天同事们讨论一个问题: 一个bundleID的程序能不能既作调试使用又能发到AppStore?答案是可以的,在开发者中心配置的设备可供调试使用。

更进一步,debug、inhouse和发布到App Store的项目能不能是同一个bundleID?答案是否定的。因为企业账号可以发inhouse版本的项目,却不能发App Store,而AppId是全球唯一的,一个账号创建了,其他账号无法再创建。所以一般公司如果想发inhouse版本的企业内测包,通常是有两个账号,公司账号用来调试和发布,企业账号用来发布inhouse版,也就是说,inhouse和 AppStore、debug的bundleID肯定是不一样的,至少有两个bundleID。像大鹅厂这样的大公司,由于调试/发布的账号由专人统一管理,不能给到各个产品,所以我们必须自己购买一个专门用来调试的账号,这也就导致了我们的项目有个三个bundleID。

2.3 证书

首先来说证书,顾名思义,证书就是为了证明某些信息真实性的凭证。不过可能不同人或者机构对真假的判断都不一样,A说是真的,B说是假的,证书也不过是证明签发证书的机构的态度而已,真真假假这么哲学的问题我们就不讨论了,毕竟要到苹果公司的App Store上线程序,苹果爸爸的态度决定一切。也就是说,我们的信任起点就是苹果公司,所以首先我们需要一个根证书(Apple Root Certificate),根证书是一切证书的合法性的来源,其含义就是“我们认苹果爸爸说的一切”。根证书一般不需要自己去申请,iOS以及Mac OS X系统在安装Xcode时将自动安装。但是根证书需要及时更新,如果过期了,其他所有证书都会失效,会报Missing iOS Distribution signing identity for XXXXXX错误。再次提醒,一切苹果公司的证书都依赖于根证书,根证书是其他所有证书的基础。

除了必须的根证书以外,我们开发、调试项目还需要Development证书,发布项目还需要Production证书。结合前文说到的账户体系和各自可以打的包,个人/公司开发者和企业开发者都有开发和真机调试程序的功能,都可以申请各自的Development证书。在发布项目方面,个人/公司开发者和企业开发者权限不同,Production证书也不同。个人/公司开发者可以给制定设备安装release版本的包、可以向App Store发送人人都可以下载安装的包;而企业开发者账号不能在App Store上线程序,只能发在企业内部体验使用的包,比如咱们大鹅厂的RDM包。

Push Development 证书就是用来调试Apple Push Notification的证书,需要特别注意推送证书的对应关系。推送证书也分为两类:开发环境和生产环境的。App的development证书对应推送的开发环境证书,inHouse AdHoc Distribution的证书对应推送的生产环境证书。此外,推送的开发环境和生产环境的对应的推送环境是不一样的,需要对应苹果后台测试推送的地址环境和生产推送的地址环境 ,如果对应关系搞错都会收不到推送。

具体来说,证书就是.cer文件,包含开发者信息和公钥信息,用于验证代码是否由该开发者的合法私钥签名过。开发者使用开发账号登陆苹果开发者网站即可申请(后文有申请过程),当开发者下载并双击打开证书文件后,证书会出现在钥匙串里。它与本地钥匙串里的私钥匹配之后,开发者就可以使用它了。

2.4 p12文件

一个开发者账号可以申请的证书数目有限,当我们需要多人合作开发的时候,不能每台机器都去申请证书,这种情况下正确的做法是,一台机器去申请钥匙串和证书,然后生成出p12文件,分发给其他开发机安装,使得其他开发机也“拥有”了证书。p12文件就是证书安装到本地后,与本机私钥match后生成的备份文件,其中包括证书和私钥的信息,也可以称为“备份证书”,跟身份证复印件差不多。

2.5 Provisioning Profile文件

Provisioning Profile文件就是一份配置信息文件,后缀为.mobileprovision。打包或者在真机上运行一个APP,一般要验证以下几个信息:

  1. 首先,需要证书对应的私钥来进行签名,用于标识这个APP是合法、安全、完整的;
  2. 其次,需要指明它的App ID,并且验证Bundle ID是否与其一致;
  3. 然后,如果是真机调试,需要确认这台设备是否授权运行该APP。

Provisioning Profile把这些需要验证的信息全部打包在一起,方便我们在调试和发布程序打包时使用。Provisioning Profile也分为Development和Distribution两类,有效期同Certificate一样。如下图在Xcode中配置好AppStore,Debug,RDM各自所需的ProvisioningProfile文件,Xcode就会根据需要打出不同的包。

Provisioning Profile作为打包必备的一份文件,其中包含以下信息:

  1. AppID:一个Provisioning Profile对应一个Explicit App ID或Wildcard App ID
  2. 使用了哪些证书:Provisioning Profile决定了Xcode用哪个证书(公钥)/私钥组合(Key Pair/Signing Identity)来签名应用程序
  3. 功能授权列表
  4. 可安装的设备列表: Provisioning Profile文件会在应用程序打包时嵌入到.ipa包里,进而安装到iOS设备上,是设备的信任凭证,证明其中包含的设备(iPhone,ipad)是个合法的测试设备。Distribution版本的ProvisioningProfile主要用于提交App Store审核,其中不指定开发测试的Devices。App Store审核通过上架后,允许所有iOS设备上安装运行该App。
  5. 苹果的签名:由于Provisioning Profile文件是苹果签名的,我们必须从开发者中心申请,申请后也不能再随意篡改(比如添加别的设备)。

三、申请流程

对基础的东西有一个了解之后,我们来过一遍申请的流程。

3.1申请钥匙串文件

我们申请一个证书Certificate之前,需要先申请一个Certificate Signing Request (CSR) 文件,而这个过程中实际上是生成了一对公钥和私钥,保存在你Mac的钥匙串Keychain中。

进入(Launchpad)

找到

选择左上角的钥匙串访问-->证书助理-->从证书颁发机构请求证书,输入自己的邮箱,选择存储到磁盘,继续。

设置好存放钥匙串的位置,存储。

申请下来到钥匙串会出现在系统【钥匙串访问】中

3.2申请证书

使用开发者账号登录苹果开发者中心(https://developer.apple.com)

这样就下载到了我们需要到证书文件。

3.3配置设备信息

在开发者账户中配置Devices的地方点击右上角“+”可以增加某个Identifier的设备,注册后的该设备可供调试使用。

在Devices里可以查看注册过的所有可用于开发和测试的设备,普通个人开发账号每年累计最多只能注册100个设备。用户可在网站上启用/禁用已注册的Device。但是Disable 一台设备也不会增加名额,只能在membership year 开始的时候才能通过删除设备来增加名额。

3.4申请Provisioning Profile文件

在开发者账户中“Provisioning Profiles”->“All”,点击右上角“+”

选择开发或发布证书配置文件,这里以开发为例,点击iOS App Development,继续

选择对应的App ID,继续

选择要关联的证书,可多选,继续

选择之前注册过的,用于调试安装的设备(最多100台设备),如果是生产证书配置文件,则不会出现该页面(生产证书用于发布,不能进行开发调试),继续看到以下界面

输入文件名后,点击“Generate”,配置文件创建成功。

3.5设置Xcode Code Sign Identifer

选择合适的Provisioning Profile和证书对代码进行签名,Product-->Archive打包。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

邱禄瑜的专栏

1 篇文章1 人订阅

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

Java案例-音乐盒/MP3播放器

Java开发音乐盒 系统说明: java夸平台播放器,在线播放,显示歌词,搜索歌曲,下载歌曲等;其中Baiting_Src目录为源码。 安装方法: 1、下载解压...

3574
来自专栏张善友的专栏

微软学Android Market推出 Web Windows Phone Marketplace

Google在去年推出Android Market web版后,用户对这一特性很赞。用户只需要再web上选择想要的软件,一按INSTALL按钮后手机便会自动安装...

1758
来自专栏小鸟矿池

KKOS刻录指南

KKOS是一个基于Linux系统的挖矿深度定制系统。由于系统相对于windows来说,体积非常的小巧,因此可以直接刻录于U盘,省下了一块硬盘的钱。并且系统占用资...

960
来自专栏FreeBuf

当心,安卓远控(spynote)升级了……

最近在某国外论坛上流出一款安卓远控spynote3.2版本,以前freebuf上有人发过spynots2.4版的,不过现在已经升级了,功能变得更加强大,危害更严...

2818
来自专栏前端开发

不限容量的网盘---可作为电脑磁盘

5346
来自专栏啸天"s blog

支付宝全能内购(不断完善更新中)支持一键破解

mini patcher ,图标极像幸运内购,哈哈哈!!!!! 废话不多说,开始正题. 该软件是xposed模块,用于hook各类支持支付宝支付的软件. 不...

1642
来自专栏Java社区

1000套精品海报模板(超10G)

1054
来自专栏张伟博客

教你屏蔽小米电视的开关机广告

1897
来自专栏蔡鹏的专栏

【腾讯云的1001种玩法】安卓加固在腾讯云上的使用(附反编译结果)

移动安全不容小觑,加一层防护多一份保障,腾讯云上有一个叫乐固的服务,支持反破解,反调试,反窃取,防篡改,防二次打包, 兼容2.x至 7.x 任何安卓系统,,兼容...

1.6K0
来自专栏沈唁志

PhpStorm编辑器主题修改自定义Sublime配色

2563

扫码关注云+社区