IOS之App Store完整上架流程

最近在处理App Store上架的问题,和Android的打包流程比起来的确比较棘手些,因为涉及到很多的一些概念,现在也完整的梳理并记录一下。

前言

发布上架都需要一个苹果开发者账号,免费的账号是有诸多限制的。

苹果开发者帐号体系

Apple Developer:直接在Apple Developer登录,同意Apple Developer协议后的账号,免费,只可以使用Xcode进行真机调试,Xcode 7之后苹果推出的功能

Apple Developer Program:分个人和组织类型,费用都是每年 99 美元,可以使用Xcode进行真机调试,打包Ad-Hoc测试,在App Store发布App

Apple Developer Enterprise Program:企业账号,费用是每年 299 美元,可以使用Xcode进行真机调试,打包Ad-Hoc测试,打包In-House App,但不能在App Store发布App

不同安装方式对应的证书类型

  • 非App Store
    • Development(真机调试):iOS App Development
    • Ad Hoc:iOS Distribution (App Store and Ad Hoc)
    • Enterprise:iOS Distribution (In-House and Ad Hoc)
  • App Store:iOS Distribution (App Store and Ad Hoc)

在iOS的项目中,只要不是运行在模拟器上,都会涉及到开发者帐号、证书、Provisioning Profile这些概念。

免费账号的限制:

  • 创建的Provisioning Profile有效期只有7天
  • 在7天内最多注册10个Bundle Id
  • 只能同时注册3台iOS设备
  • 在同一台iOS设备上,只能同时安装3个使用免费账号签名的App。当该设备上已经存在3个App,则无法安装任何免费账号签名的任何App,就算是那3个App其中一个也不行,只能先把其中一个删除

以下介绍是以我的Apple Developer Program个人账号来进行演示

概念

证书、加密等原理这里不作介绍,主要讲解一些IOS所必要的概念。

.certSigningRequest

Mac中的钥匙串访问里的 证书助理 -> 从证书颁发机构请求证书

最后会创建出一个.certSigningRequest文件,其实这个过程就是创建了一对公私钥

  • 其中.certSigningRequest文件保存着
    • 申请者信息申请者的公钥
    • 摘要算法
    • 公钥加密算法
  • 私钥保存在 keychain

AppleWWDRCA证书

iOS以及 mac OS(在安装 Xcode 时)将自动安装 AppleWWDRCA.cer这个中间证书(Intermediate Certificates),它实际上就是 iOS(开发)证书的证书,即根证书(Apple Root Certificate)。

iOS App Development证书

iOS的开发证书,在开发阶段进行真机测试时需要用到的证书。可以在苹果开发网站上手动创建,需要上传.certSigningRequest文件;或者使用Xcode自动创建。

iOS Distribution证书

iOS的发布证书,可以用于进行 Ad Hoc 测试、打包上传到 App Store 或者打包成 Enterprisee(In-House) 类型供企业内部使用。可以在苹果开发网站上手动创建,需要上传.certSigningRequest文件;或者使用Xcode自动创建。

.p12

Mac钥匙串访问里选择一张证书,右击该证书,选择导出"xxxxx",然后设置密码,可以导出该证书对应的.p12文件。.p12文件包含个人信息、公钥和私钥,也就是证书 + 私钥。iOS类型的每种证书同时存在数量有限制,而证书是依靠mac OS上的.certSigningRequest文件创建的,所以正常情况下,每种类型的证书只能在有限的Mac电脑上使用,如果需要在更多不同的Mac电脑上进行App开发、测试、签名,可以导出对应.p12文件代替证书来使用。

Provisioning Profile

Provisioning Profile的文件格式为.mobileprovision,里面包含着

  • 可以使用的证书
  • App ID,由 TeamID 和 BundleID 组合而成,类似于 A1B2C3D4.com.domain.appName形式
  • 可安装该App的设备列表的UDID
  • Entitlements,授权文件,列出了App可以进行哪些行为
  • 以上信息的签名

在苹果开发网站上手动创建,或者使用Xcode自动创建。

.ipa

.ipa文件是iOS上的App安装文件,其实它只是一个压缩包,等同于.zip格式,用mac OS自带的归档实用工具可以直接对它解压,可以看到里面的内容

.app

右击.app文件,选择显示包内容,可以看到里面的内容

.app文件主要包含三部分:

  • Mach-O格式的二进制可执行文件,这个是一个App最重要的文件,我们编写的Objective-CSwift代码都被编译在里面
  • 资源文件,包括:.bundle文件,.framework文件,.dylib文件,.nib文件,图片文件,音视频文件,字体文件等所有项目用到的文件
  • CodeResources,签名信息
  • embedded.mobileprovision文件,或者entitlements文件
    • 对于没有上传App Store的.app文件,里面会包含embedded.mobileprovision文件,没有entitlements文件
    • App Store下载的.app文件,里面会包含.entitlements文件,没有embedded.mobileprovision文件

Automatic signing

在Xcode 7之前,只有加入到Apple Developer Program(即付费)才能进行真机调试,Xcode 7之后苹果推出了Automatic signing功能,只要在Xcode上登陆Apple ID,就会自动管理证书和Provisioning Profile,同时没有加入Apple Developer Program的账号也能进行真机调试。

勾选Xcode中的AutoMatically manager signing,选择对应的Team后,无论是加入Apple Developer Program的账号(即付费账号)还是Apple Developer的账号(即免费账号):

  • 如果Xcode没有帮该账号自动生成过iOS App Development类型的证书, 无论在苹果后台是否已经存在其他iOS App Development类型的证书,都会生成一张新的iOS App Development类型证书,证书名称的格式是:开发者账号名称(当前Mac电脑名称), 如:Brian Hui (Daniels的MacBook Pro),同时会保存在当前Mac电脑的keychain
  • 免费账号无法进入苹果的管理证书后台,但可以猜测出在苹果后台也会存在该证书
  • 如果Xcode没有帮该App的Bundle ID自动生成过对应的Provisioning Profile,就会使用上面那张证书生成一个Provisioning Profile,保存在~/Library/MobileDevice/Provisioning Profiles,但在苹果后台则不会存在这个Provisioning Profile
  • 如果在钥匙串访问中删除了那张证书,Xcode会提示你的账号有iOS App Development类型的证书,但这台电脑没有安装,需要先把那张证书RevokeRevoke后会再次重复前面的步骤,生成新的证书和Provisioning Profile
  • 如果在~/Library/MobileDevice/Provisioning Profiles里面,删除了该Provisioning Profile文件,Xcode会马上重新生成Provisioning Profile

在使用Xcode的Automatic signing功能的前提下,进行Archive,然后Distribute App的时候,选择非Development的选项,再选择AutoMatically manager signing

  • 如果本地存在iOS Distribution类型的证书,则会直接进行重签名
  • 如果没有存在iOS Distribution类型的证书,而苹果的后台有,则会告诉你,该账号存在iOS Distribution类型的证书,但这台电脑没有安装,请联系创建人拿到备份(.p12文件)进行安装,当你安装了该证书(或者.p12文件),则会直接进行重签名
  • 如果没有存在iOS Distribution类型的证书,而苹果的后台也没有,则Xcode会询问你是否需要生成iOS Distribution类型的证书,如果选择需要,则会自动生成iOS Distribution类型的证书,并且建议你保存在本地,证书名称的格式是:Team Name, 如:Hutchison Telephone (Macau) Company Limited,同时使用这张证书生成一个Provisioning Profile,保存在~/Library/MobileDevice/Provisioning Profiles,但在苹果后台则不会存在这个`Provisioning Profile。

Xcode对Provisioning Profile的验证

Xcode怎么把App和证书、Provisioning Profile绑定在一起呢?什么时候需要一张新的证书,什么时候需要一个新的Provisioning Profile

Bundle ID是App的唯一标识,App和证书、Provisioning Profile绑定在一起,其实就是Bundle ID和证书、Provisioning Profile绑定在一起,两种情况:

Automatic signing

Bundle ID与开发者账号绑定。使用Automatic signing时,选择开发者账号(Team)后,Xcode会根据开发者账号去本地检索是否存在该账号对应的Provisioning Profile,再验证是否存在与该Bundle ID匹配的Provisioning Profile,再根据Provisioning Profile去本地检索是否存在对应的证书,都验证通过,则会设置成功。如果不存在Provisioning Profile,则会判断该Bundle ID是否已经被其他账号注册,如果已经被其他账号注册,则整个流程失败,需要选择对应的账号。如果该Bundle ID没有被其他账号注册或者账号已经对应上,则按照文章前面所说的步骤,最后生成Provisioning Profile

没有使用Automatic signing

需要手动选择Provisioning Profile,当选择了其中一个Provisioning Profile时,则会分别验证Bundle ID是否对应、Provisioning Profile是否过期、是否存在对应的证书、App的权限是否对应、证书的类型和Code Signing Identity设置是否对应,如果都通过验证,则会设置成功。

App Store上架打包流程

xcode构建好一个bundle id为cn.sweetlover.uploadstore的项目,假设已为一个正常的项目APP。

空demo的APP是无法构建成功的。

准备好一个开发者账号,并登陆苹果开发者官网,选择Certificates, IDs & Profiles

创建APP ID

选择Identifiers,创建一个APP ID:

这里创建一个BundleID为cn.sweetlover.uploadstore,BundleID格式这里不细讲了。

下面的选择是想要让你APP所接入的能力,例如常用的推送功能

选择继续,并注册后,会看到Identifiers会出现你刚刚创建的APP ID:

注册测试设备

选择Devices,添加

填写设备名称和UDID即可,UDID可以使用ITunes查看。

创建CSR

打开Mac->钥匙串访问->证书助理->从证书颁发机构请求证书..,填写,并选择存储到磁盘

创建证书

选择Certificates,添加

创建开发证书

选择IOS App Development,并继续

上传CSR文件,即选择我们刚刚创建好的CSR文件。并继续

创建好后,选择下载证书,双击安装:

打开钥匙串访问即可看到我们刚刚安装好的证书

发布证书就创建完毕了。

创建发布证书

重复上述创建开发证书的步骤,只不过选项发生变化:

最后下载安装,看到钥匙串访问出现证书即可

创建Profiles

选择Profiles

创建开发Provisioning Profile

选择IOS App Development,并继续

选择好我们之前创建的APP ID,如cn.sweetlover.uploadstore,并继续

选择开发证书,并继续

选择测试设备,并继续

填写Provisioning Profile Name,并选择生成

下载并双击安装:

xcode签名方式选择手动以便查看:

创建发布Provisioning Profile

重复上述创建开发证书的步骤,只不过选项发生变化:

xcode:

注意事项

如果不安装证书,选择profile,xcode会报错缺少证书文件:

App Store Connect发布

APP创建

点击Account登陆后点击App Store Connect,选择我的App

新建APP,填写好资料,并创建,创建后进入APP,编辑APP应用信息和定价情况

版本提交

首次提交会出现以下界面,填写好里面所需要的资料,里面都可按照提示进行编写。

如果已经发布了,需要继续发版本,则点击

由于首次提交还未上架过,所以按钮是置灰的状态,无法点击。

Xcode Archive构建版本

进入Xcode选择Product->Archive,注意不要选中到模拟器,要选中Generic IOS Device。因为上架的包不是针对某种设备来进行Archive的。

出现以下界面,选择Distrubite App,如果Archive过多次版本也会出现以往的版本。

选择IOS App Store

这里直接选择上传,也可以选择导出成IPA,使用Application Loader进行发布。

next~

选择好发布的证书和profile文件

选择上传即可。

经过一段漫长的时间等待后,回到App Store Connect的页面中,可能需要一段时间等到,建置版本后出现按钮即可选择构建好的版本。

填写好所需要的资料就可以提交审核了。

关于Application Loader

打开Xcode -> Open Developer Tool -> Application Loader,登陆你的APP ID。

密码登陆非APPLE ID的密码,需要登录appleid.apple.com上,输入AppleID密码后会产生一个密码,去Application Loader中输入产生的密码即可。

关于TestFlight

等上传构建版本处理完成后,一般会显示缺少出口合规证明。点击黄色提示那,在弹出的页面选择否,点击开始内部测试。

选择App Store connect用户选项,点击测试员旁边+号,选择测试的苹果账号!

然后手机端下载TestFlight后,兑换邀请码即可。

App审核指南

App Store Review Guidelines:https://developer.apple.com/app-store/review/guidelines/

坚持技术分享,您的支持将鼓励我继续创作!