iOS 发布流程

这篇博客将会以一个完整的过程来实现一个iOS App提交审核的过程。在这个过程中,我们会涉及到证书、代码签名、授权文件、真机调试、开发者账号等一些概念,我也会有所解释。推荐大家先去看《iOS应用分发与内测(一)》《iOS应用分发与内测(二)》《iOS开发Provionsioning Profile解析》这几篇博客,看完以后会对发布App的流程非常熟悉。
我先对一些概念做一个讲解:
【证书 Certification】
证书是对电脑开发资格的认证,每个开发者账号有一套。一个证书里面包含私钥和公钥。私钥是保存在你的电脑上的,别人无法得到。公钥是可以从苹果开发者网站下载后得到的。一个证书只有公钥和私钥配对成功后,才能认证身份。比如说,你想要让你的某个朋友的电脑也能使用你的证书真机调试或者发布应用,于是你从你的开发者网站上面下载了证书,让你的朋友在他的电脑上安装,这还不够,因为此时他还只有公钥,你需要从你的电脑上的“钥匙串访问”中导出p12文件(保存了你的私钥),让你的朋友电脑安装,这样他的电脑才有“资格”真机调试。
当然,证书也分为开发证书(Developer Certification)和发布证书(Distribution Certification)。开发证书可以用来真机测试。发布证书可以制作测试版和发布版的程序。

【代码签名 Code Signing】
可能大家学iOS刚开始想要去真机调试的时候,都会去Build Setting里面配置Code Signing这个东西。但是其实我们不知道这个是什么东西。只要在提到上面的证书的时候,才能说得清代码签名。当我们真机调试的时候,程序会进行打包,然后通过Xcode安装到我们的手机上。 也只有在电脑安装了证书之后,Build Setting里面的Code Signing才可以选择,而选择项恰恰就是你安装的证书,是哪些证书呢?你可以去钥匙串访问中看到,两者是一一对应的。用简单粗暴的话说就是:用这个证书来签名你的应用,以验证你这个应用到底有什么权限(真机调试呢还是发布呢),确保了应用的安全性和合法性。而目前为止,苹果提供了三种签名方式
(1)Ad-hoc:可以进行真机调试和内测,只要你知道了那些设备的UDID(设备唯一标识符)即可。
(2)In-house:企业账号专用。
(3)App-Store:发布到App Store。

【授权文件 Provisioning Profile】
有时候也称为配置文件。授权文件是对iOS设备的授权,文件内主要记录了三样东西:App ID(Bundle Identifier)、设备的唯一标识符(UDID)、和证书。用一句话说就是:使被授权的设备可以安装或调试 授权文件中记录的App ID对应的程序。在开发者网站上创建授权文件的时候会选择App ID,UDID。同样对于两种证书,也有两种配置文件:开发授权文件(Developer Provisioning Profile)和发布授权文件(Distribution Provisioning Profile)。
在真机调试或者发布的时候,也需要在Build Setting-->Code Signing-->Provisioning Profile选中对应的授权文件。真机调试的过程其实就是一个检查匹配的过程:检查当前App的Bundle Identifier和授权文件中的App ID是否匹配;检查程序的代码签名和授权文件中包括的证书是否匹配;检查当前运行设备的UDID和授权文件中写入的Device ID是否一致;只有成功完成匹配后,才能成功的运行。详细说明请参考《iOS开发Provionsioning Profile解析》。

【设备唯一标识符 UDID 】
使用该标识符可以区分每一台唯一的iOS设备。可通过Xcode-->Window-->Device来获取。

【开发者账号】
作为一个普通的开发者,还是建议去买一个开发者账号,99美元也不算太贵。在Xcode7之后其实不需要开发者账号就可以免证书调试了。但是发布应用到App Store就必须要账号了。可能我们在公司工作,会有公司的证书,但是我们自己私下开发,就必须要使用自己的账号了。况且要用一些高级的功能,比如推送、应用内购买j就必须要账号了。

我下面开始来讲解整个发布流程:
(1)打开钥匙串访问-->证书助理-->从证书颁发机构请求证书,如下图所示:
![](http://upload-images.jianshu.io/upload_images/1663804-671857850ca680e3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
在用户电子邮件地址中写入你想要收到的邮件地址,我一般写Apple ID的邮箱,下面的常用名称随意即可,你也可以写入你的名字,最好是英文。下面的CA电子邮件地址默认“必需”不用管。最后选择"存储到磁盘"即可。
保存到电脑上以后,是如下的一个文件:
![](http://upload-images.jianshu.io/upload_images/1663804-a0896e58dac80e74.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
可以看到这是一个CSR文件,也就是证书请求(签名)文件,我们可以这个文件去苹果的开发者网站上请求一个证书。

(2)进入苹果开发者网站: https://developer.apple.com/ 。然后选择Account进入,需要你输入你的Apple ID和密码进入。最近我发现这个页面又发生了改版。进入后如图所示:
![](http://upload-images.jianshu.io/upload_images/1663804-09cf9198aadfd706.png)。
配置证书、授权文件选择左边那个Certificates,Identifier &Profiles .等到可以发布的时候选择右边的iTunes Connect. 现在我们选择左边的Certificates进入:
![](http://upload-images.jianshu.io/upload_images/1663804-ba1d8892231d40ad.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
左边导航栏列出了我们要配置的所有东西。Certificates就是证书,Idetifiers就是配置我们的App ID,Devices就是添加我们的真机调试设备,最后的Provisioning Profile就是配置授权文件。

(3)首先配置证书:
可以看到需要我们上传Certificate Signing Request文件,就是我们刚刚从钥匙串访问中导出的CSR文件,
![](http://upload-images.jianshu.io/upload_images/1663804-15e04569a5d20f00.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
如果是要开发证书,就选择Development-->iOS App Development. 如果是要发布证书,选择下面的Pruduct-->App Store and Ad Hoc. 两者的操作其实是一样的,我这里以配置开发证书为例。点击Continue下一步,
![](http://upload-images.jianshu.io/upload_images/1663804-9f05393cdc2e7d14.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
需要我们创建CSR文件,苹果也给出了如何创建CSR文件的步骤,应该和我讲的是一样的,因为我们已经创建好了,所以直接Continue下一步:
![](http://upload-images.jianshu.io/upload_images/1663804-33f45c3bdccfdd46.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
直接选择我们的CSR文件进去即可。Continue下一步即可,
![](http://upload-images.jianshu.io/upload_images/1663804-66baeea3f01ec7f3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
此时表示证书已经创建完成了,点击Download下载到电脑上。此时的这个开发证书就可以让我们进行真机调试了。我们再进行同样的步骤,在上面选择一个发布证书,创建完成后下载到本地。
![](http://upload-images.jianshu.io/upload_images/1663804-5ceb1890ec5b5522.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
如图,后缀是.cer表示是一个证书,很明显,左边的是开发证书,右边的是发布证书。我们分别双击进行安装。安装完成后,我们可以进入钥匙串访问查看,
![](http://upload-images.jianshu.io/upload_images/1663804-ee35fed7cafa2368.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
可以看到我们的两个证书都已经成功安装了。

(4)我们创建一个新项目,作为我们调试和发布的项目,名称为MyFirstApp. 当然,现在这个是个空项目,就算提交审核了也是不会发布的。在这只是做一个演示。一个App发布的最低的要求就是要有icon图标,否则打包是会失败的。所以我需要导入图标。在等下提交审核的时候还需要App在各个屏幕下的截图。对于这两者的资源,都要提前准备好。仅仅作为一个测试,我把这个资源已经准备好了,https://github.com/chenyufeng1991/iOS-ScreenshotsAndIcon- 。对于想快速测试这个流程,又不想麻烦的去生成图标截图的,可以先暂时使用这里面的资源。

(5)应用开发完成后,我们继续去开发者网站上面配置App ID,选择左侧导航栏-->Identifier-->App IDs,这里可以看到我们创建的所有的应用的ID . 此时我们新建一个:
![](http://upload-images.jianshu.io/upload_images/1663804-a5dac5aecc5dbe2b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240).
这里主要要填入两个地方,在 App ID Description中填入这个app的简单描述,只要不输入@,&等这些非法字符即可。在下面的Budle ID 中填入你应用的Bundle Identifier,比如我这里的Bundle ID就是:com.chenyufengweb.MyFirstApp.
最下面你还可以选择需要哪些应用服务,比如推送,Apple Pay,iCloud等服务,如果你的应用使用到,都需要勾选上。点击Continue下一步,
![](http://upload-images.jianshu.io/upload_images/1663804-285ec4ffeb388c77.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
这一步是让你确认App中包含的信息,确定无误的话点击Register注册这个app。完成后,就可以在列表中看到我们注册完成的应用了,
![](http://upload-images.jianshu.io/upload_images/1663804-f4975b1aa8ae1cf1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。

(6)现在需要来注册我们需要真机调试的设备了。可以看到这里可以注册的设备有Apple TV,Apple Watch,iPad,iPhone,iPod这几种,表示你的应用可以在这些设备上真机调试。
![](http://upload-images.jianshu.io/upload_images/1663804-36850a427884f4a5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240).

Name可以输入这台设备的名称,可以任意取。UDID输入唯一标识符,可以用上面提到的方式去获取。
![](http://upload-images.jianshu.io/upload_images/1663804-2d34f254c8c22d16.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
可以看到我们注册的开发者账号可以添加各个类型的设备各100台。对于个人开发者来说已经足够了。上面的信息确认无误后,点击Register注册即可。注册完成后,列表中就会显示出该账号下的所有设备:
![](http://upload-images.jianshu.io/upload_images/1663804-775e43c01e01e4da.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。

(7)最后我们来配置授权文件,点击manually generate profiles手动创建一个授权文件,
![](http://upload-images.jianshu.io/upload_images/1663804-550de9687a78fd7e.png)。

![](http://upload-images.jianshu.io/upload_images/1663804-06d471fab6fbdb02.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
在这里,我们可以看到,授权文件和证书一样,也是分为开发的和发布的。如我上面所说,授权文件会把App ID、设备UDID、证书都打包进来。我这里以开发的为例进行创建。选择iOS App Development,点击Contunue下一步:
![](http://upload-images.jianshu.io/upload_images/1663804-a267a00b1d9d827f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
在这一步选择我上面创建的App ID。点击Continue下一步:
![](http://upload-images.jianshu.io/upload_images/1663804-f267d18b81da8857.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
这一步是选择证书,因为是一一对应的,所在在这里只能选择开发证书,而不能选择发布证书,点击Continue下一步,
![](http://upload-images.jianshu.io/upload_images/1663804-cbcd38d5cd75d24e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
这里是要选择真机调试的设备,只有选中的设备才能调试该应用。
![](http://upload-images.jianshu.io/upload_images/1663804-851ebcebc0cff319.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
在这一步是为这个授权文件取一个名字,最好在名字里面说明这是开发的还是发布的,便于以后区分。点击Continue下一步。
![](http://upload-images.jianshu.io/upload_images/1663804-e3bddf9ef2f12bab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
创建完成后,点击Download[下载](http://m.2cto.com/soft)。对于发布授权证书,也按同样的方式进行创建。两个文件下载完成后,如下所示:
![](http://upload-images.jianshu.io/upload_images/1663804-0294c4bf29604e4d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
直接双击这两个文件,授权文件就会自动安装到Xcode中去。

(8)来到我们Xcode的项目中,来配置证书和授权文件。
进入Build Setting-->Code Signing-->Code Signing Identity,在Debug中选择开发证书,在Release中选择发布证书。(想要看电脑上安装了哪些证书,可以去钥匙串访问哦)。
在下面的Provisioning Profile中选择授权文件,Debug处选择开发授权文件,Release处选择发布授权文件。配置完后如下所示:
![](http://upload-images.jianshu.io/upload_images/1663804-76a681a3b8ac96d3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
经过以上步骤,我们就可以在指定设备上运行该应用了。

(9)我们的应用已经开发完毕,现在要提交到App Store了。要用到的工具就是iTunes Connect. 再次进入苹果开发者网站,点击iTunes Connect.进入:
![](http://upload-images.jianshu.io/upload_images/1663804-d34f21fe71d5b98d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
进入后的主页面如下,
![](http://upload-images.jianshu.io/upload_images/1663804-4a4e816e47d8f76f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
可以看到在iTunes Connect.中可以管理我们已经上线或者即将上线的应用。点击进入“我的App”. 然后点击左上角的“+”号创建一个新应用,
![](http://upload-images.jianshu.io/upload_images/1663804-4e99b46de1c05224.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
可能你的Name已经被占用了,那就换一个。点击Create创建。
选择左上角的App Information,这里可以简单配置App的信息,比如右侧的Category,表示你App的分类,比如音乐、购物等等,一级分类是必须选择的。点击右上角Save保存。
左侧第二个Pricing and Availiablity是一些价格和购买信息,我这里选择免费。点击右上角Save保存。
第三个1.0 Prepare for Submission则是一些发布的详细信息,首先要有不同屏幕上的五张截屏,如果你的应用不适配到iPad上,那么可以不上传iPad的截图。
![](http://upload-images.jianshu.io/upload_images/1663804-9cdae7685a00d7bb.png)。

![](http://upload-images.jianshu.io/upload_images/1663804-3c635a1ecfb20683.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
同时可以添加这个应用的描述,关键字,以及支持的网站。下面的Build构建先不用,等下我们会使用Xcode上传的。

![](http://upload-images.jianshu.io/upload_images/1663804-a9f740336ba16377.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
同时还要上传Icon,这里的Icon必须钥匙1024*1024的,以及你应用的分级、和你的地址、联系方法等信息。可以按你的实际情况填写即可。

![](http://upload-images.jianshu.io/upload_images/1663804-52be446d3daa2528.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
最下面的位置需要你提供一个测试账号,也就是使用该账号可以登录你的App,并使用所有的功能,方便为苹果审核。Version Release则是说你想要在审核通过后直接发布还是手动设置时间发布。按你的实际需求设置。然后点击右上角的Save保存。

(10)在iTunes Connect.上面的设置基本结束了。我们再次回到Xcode中,来打包我们的程序。
此时需要把你的手机连上Xcode或者在调试设备中选择Generic iOS Device,然后选择Product-->Archive(如果调试设备选择了模拟器,则Archive不可点击)。就会出现如下界面:
![](http://upload-images.jianshu.io/upload_images/1663804-8d1c31aff20b926e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
这里就是对你的应用程序进行打包。如果我们仅仅只是想要导出.ipa文件,可以直接选择右侧的Export,然后你可以把这个ipa文件放到其他的内测平台上去分发。由于我们就是直接想发布到App Store上面,并且已经在iTunes Connect.上面做好了设置,所以我们直接点击“Upload to App Store”即可。
![](http://upload-images.jianshu.io/upload_images/1663804-a66016fef7347419.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240).
在这过程中,可能会等的比较久。时候还会提交失败,因为可能是你程序中的某些问题,或者提交了同一个版本,如下是因为我重复提交了1.0版本,然后报错了。
![](http://upload-images.jianshu.io/upload_images/1663804-1da643439db2c065.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
在成功修复后,就可以再次upload了。成功以后出现如图界面:
![](http://upload-images.jianshu.io/upload_images/1663804-10914a9e7f70904d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
此时,我们就把应用成功提交到iTunes Connect.上面了。

(12)再次来到iTunes Connect.中,找到Build的地方,发现已经跟刚才不一样了。出现了"Select a build before you submit your app",也就是让我们选择一个版本提交。点击后出现如下界面:
![](http://upload-images.jianshu.io/upload_images/1663804-1ddfbde6a59e71a5.png).
可以看到我们刚刚upload了两个版本。比如我选择2.0(2)进行提交。此时的Build如下:
![](http://upload-images.jianshu.io/upload_images/1663804-1b636a48defa3c43.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240).
然后点击Save保存。最后点击旁边的“Submit for Review”,也就是提交审核。最后还是会出现一个页面让你确认一些信息:
![](http://upload-images.jianshu.io/upload_images/1663804-e195fa8fe7497d67.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)。
其中包括加密确认、显示第三方内容、和广告问题。根据实际情况选择提交。提交成功后,上面就出现了Waiting For Review 等待审核的字样:
![](http://upload-images.jianshu.io/upload_images/1663804-86472e4487958e45.png)。
等过几天苹果审核通过后,你就能发布这款App了。

看一百遍不如去做一次。流程看起来复杂,但是只要去做一次,就会发现其实还是很有逻辑的。希望大家能发布越来越好玩的App。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容