迈入开发者门槛:可以学会 Apple Developer Program 会员的订阅方式、费用、实名制要求,以及入会可使用的各类开发资源和苹果平台禁忌红线
申请资源:可以学会上架前必备的分发证书、标识符、描述文件的申请步骤,含 CSR 文件生成、证书创建、唯一标识符申请等核心操作
新建 App:可以学会如何在 App Store Connect 创建新App、填写各类上架信息、打包上传构建版本、提交审核及已上架 App 更新的全流程操作
ICP 备案:了解App 工信部 ICP 备案的重要性,学会备案全流程、App 特征信息获取及备案号的合规使用要求
工具箱:获取上架过程中实用的工具和代码,含宣传素材制作、图片处理、开发打包、备案相关的工具 / 平台及核心处理代码
Q&A:了解上架 App Store 的各类血泪教训,涵盖账号、素材、内容、操作、审核等方面的常见问题和避坑要点
迈入开发者门槛
订阅 Apple Develop Program 会员
要想上架 App Store,需要先加入 Apple Developer Program 会员;会员计划要按年付费,每年RMB 688
首次申请需要进行实名制核验,需要绑定你的身份证等信息到你的 Apple ID账号。一个身份信息可能只能绑定一个 Apple ID 账号,尚不清楚如何更改,请谨慎操作。
推荐在 App Store 下载 Apple Developer 手机端来完成订阅操作(我用 Mac 版的 Apple Developer 在最后一步总是出现“未知错误”)。
此外,请一定了解清楚苹果公司的一些禁忌事项(如不允许代码级抄袭,比如不允许用合规应用审核、热更新不合规内容以规避审查,等等),如果你觉得可能不行,一定要确认清楚,不要想当然。一旦触发红线,不仅审核不通过,可能连账号都一起封禁;由于前文已提到一个身份信息只能绑定一个账号,如果你还想“另起炉灶”,就只能“借用”别人的身份了(这个操作事实上也是违规甚至违法的)
如果我们已经完成开发,目标直指上架 App Store,那么我们最需要关注的几个模块就是App、证书 Certificates、标识符 Identifiers 和描述文件 Profiles。

1.2.1 App
我们添加新的 App 以及上架 App Store 的入口就在这里:

1.2.2 证书 Certificates
每个提交到 App Store 的应用程序都必须使用开发者的证书进行签名。签名过程是对应用程序的内容进行加密和验证,以确保在分发和安装过程中应用程序的完整性和未被篡改。只有经过正确签名的应用程序才能被 App Store 接受并在用户的设备上安装和运行。
在我们没有订阅会员之前,也可以在 XCode 自己签名;这里使用的证书属于Development类型的证书,使用它签名后,安装在设备后只有几天的有效期;超出有效期后,App就无法打开。
目前有两个大类的证书:Software 和 Services,下文所述的证书均为 Software 类型的证书。
证书有不同的类型,在创建时你需要按需选择:
如果你不清楚应该选择哪个类型,只需要了解下面几个概念就好了:
带 Development 的证书类型: 用于开发版本的签名;使用它签名的版本,一般只作为开发者自己测试(如安装在已注册的设备中)。它不能用于内部测试,更不能用于提交到 App Store
带 Distribution 的证书类型:用于分发测试或上架 App Store 的签名。简单来说,Development 类型的证书能做的,它都能做,想要上架、就需要用这类证书来签名。
Ad Hoc distribution:是一种应用程序的分发方式,它允许开发者将应用程序分发给特定的用户群体进行测试或内部使用,而无需将应用程序提交到 App Store 进行审核和发布。
1.2.3 标识符Identifiers
标识符Identifiers是识别 App、Service、App Group 等资源的唯一识别码。例如我们所说的 Bundle ID 里的 ID 即为 Identifiers,它是每个 iOS、macOS、watchOS 或 tvOS 应用特有的唯一标识符。它用于在 Apple 系统中识别应用,并且每个应用的 Bundle ID 都是唯一的。
我们开发的每一个 App,都要占用且唯一占用一个标识符 Identifiers。在我们提交到 App Store 并成功发布后,这个标识符就不能再给其他 App 使用了。
1.2.4 描述文件 Profiles
描述文件 Profiles 是用于配置和管理 iOS、tvOS 等应用程序开发和发布过程的重要组件。这些Profiles允许开发者将应用程序安装到测试设备或发布到 App Store。
使用时要注意,如果想发布到 App Store,那么应该选择“App Store Connect”;但这个类型的 Profile 不能进行 Ad Hoc Distribute,如果要发布测试版本,需要选择“Ad Hoc”
1.2.5 用户和访问权限
你可以邀请其他用户加入自己的团队,并管理他们的角色:
如果你想添加一个用户来测试我们的 App,可以选择“营销”的角色:
1.2.6 设备 Devices
可以看到已注册的全部设备:

也可以添加设备:

在创建你的新APP之前,还需要创建分发证书、标识符和描述文件。这些资源是你上架App的前提。分发证书:Distribution Certificates
2.1.1 生成 CSR
在 Mac 电脑中,生成一个证书签名请求文件,即 Certificate Signing Request (CSR),后续步骤需要用到。
官方文档的链接为:https://developer.apple.com/help/account/create-certificates/create-a-certificate-signing-request
Cmd+空格键,搜索“钥匙串访问”。点击顶部工具栏“钥匙串访问”,选择“证书助理” -> “从证书颁发机构请求证书”。
填写基本信息,CA 电子邮件地址”栏位留空,选择“存储到磁盘”,点击“继续”:
生成的CSR文件:
2.1.2 在 App Store Connect 生成证书
地址:https://developer.apple.com/account/resources/certificates/list
选择 Certificates 后,点击加号以创建新的证书:

选择“Apple Distribution”或“iOS Distribution (App Store Connect and Ad Hoc)”:
点击选择刚刚在Mac生成的CSR文件:

创建成功后,下载到自己电脑。
下载后,双击该证书文件distribution.cer:
Mac会自动将它加入钥匙串 Keychain:
2.1.3 用于APP备案信息填写
如果你要备案这个App,则需要填写App特征信息。你只需要在钥匙串访问的证书列表中,双击使用的证书,就可以找到:

每一个app都有自己独立的识别符 Identifiers,一旦使用这个识别符并上传软件包到 App Store Connect 后,将锁定并无法用于其他 App。

当你需要创建一个新的app时,就需要去申请一个新的标识符 Identifiers。申请地址:https://developer.apple.com/account/resources/identifiers/list
创建过程相对简单,根据提示操作就好了,这里就不再赘述。
先去申请App Store 类型的描述文件 Profile。
登录后,选中 Profiles,点击创建:
选择“App Store Connect”后下一步:
选择一个 App ID(如果没有,需要先创建)后下一步:

选择用于签名的证书(如果没有,需要先创建)后下一步:

确认并输入标识名称(仅用于自己识别不同的 profile)后生成:
对App的操作基本上是在 App Store Connect 里完成。除了填写一些基本信息,还有一些容易出错的步骤一定要反复确认,以免拖累上架进度。
在 App Store Connect 创建App
在 App Store Connect 创建一个App:
填写对应的信息:
需要注意的是,如果你此前已经有“套装ID”,直接选择下拉框里的即可。如果没有,则需要先去“标识符”页面创建一个。地址为:https://developer.apple.com/account/resources/identifiers/list
需要注意的是,在创建好标识符 Identifiers 后,如果你想立即使用它来创建一个新的 APP,在套装ID的下拉列表中很可能会找不到它。根据经验,在24小时内一定可以看到;具体需要多久,暂时没有得到官方的说明。
3.2.1 预览和App截屏
为不同机型添加指定尺寸的截图或视频:
推荐一个快速生成宣传画的工具网站:https://shots.so/
特别注意❗❗
这里的每一个设备截屏都需要添加,不能缺任何一个(缺的话无法提交审核)
iPhone 或 iPad 的截屏必须放对应设备的截屏,如果在 iPad 上放了 iPhone 样式的截屏,尽管能直接提交审核,但会被审核驳回(还不如无法提交审核),严重延长整个上架的周期。如果不幸遇到周五,还会被拖到下周一才能重新进入审核队列。
3.2.2 基本信息
填写推广文本、描述、关键词等,提供技术支持和营销网址。你可以在这里修改 App 的版本号。

3.2.3 本地化信息
在“综合”->“App信息”里,可以填写不同的名称、副标题信息,方便推广到不同地区。
3.2.4 构建版本
在你使用 XCode 等工具上传构建版本之后,会在这里列出;你可以选择其中一个作为本次审核的版本。
3.2.5 内容版权
你需要声明是否有第三方内容:
3.2.6 年龄分级
你需要填写年龄分级的内容,Apple 会根据你填写的内容给出该 App 的年龄分级。
3.2.7 App 工信部备案
请先在 App Store Connect 中创建 Distribution 类型的证书,并确保此证书用于App签名,且它的证书有效期足够长,避免因为备案前后证书不一致造成不必要的麻烦。具体步骤详见下一章。
3.2.8 隐私政策
需要你声明隐私政策,并提供隐私政策网址:

小技巧:如果你不想自己部署服务器,也可以在 github、语雀、飞书等网站编写隐私政策等内容,并在此提供对应链接。
3.2.9 设置价格与销售范围
首次提交,需要你设置 App 的价格即销售范围。如果你需要 App 内购买或订阅,我会在后续文章里介绍如何填写相关内容,本文暂不介绍。
如果你的 App 免费(或采用 App 内购买或订阅模式),则设置价格为0即可。

3.3.1 使用 Profile 和分发证书签名
在 XCode 中选择“Signing&Capabilities”,在 Release 标签中的 iOS 中,选择下载 Profile:

如果正常的话,会看到刚刚创建的 Profile:

3.3.2 Archive
在 XCode 中,选择“Product” -> “Archive”:
完成后,可以在弹出框中看到:

验证 Archive:点击右侧的“Validate App”,在新的对话框中选择“Validate”后:
3.3.3 Distribute App
选中要分发的 Archive,点击右侧的“Distribute App”按钮,按提示操作。完成后回到 App Store Connect 网页,即可在“构建版本”中找到刚刚提交的版本。
请留意邮件,如果一切顺利,你应该至少能收到下面两封邮件提示:

如果没有收到邮件提示成功或收到的邮件提示你上传的构建版本有一个或多个问题,那么你要先解决后才能在 App Store Connect 网页找到。例如下面就是一个案例,在上传后提示有几个问题:

3.4.1 使用 XCode 上传构建版本成功后无法在 Apple Store Connect 找到
使用 XCode 上传构建版本后,注意如果在 Apple Store Connect 的 TestFlight 中找不到,要注意检查一下自己的 email,很有可能是因为审核不通过。此外,无论是否成功,都应该会收到一封 email。
3.4.2 非豁免类加密
此外,如果你没有在 info.plist 里声明 App 使用非豁免类加密,还需要在 TestFlight 完成设置。

3.4.3 Validate APP 不通过,提示图标资源不能是透明的,也不能包含alpha通道
详见“Q&A 血泪教训”一章
3.4.4 报签名错误
Provisioning profile “XX” doesn‘t include signing certificate “xx developer”
3.5.1 提交审核
打开 App Store Connect 网页,在“构建版本”中选择要用于审核的版本,并选择版本发布的方式:
确认无误后,点击“添加以供审核”:
如果一切顺利,你将会收到“Waiting for Review”的邮件。如果有问题,在你点击“添加以供审核”按钮后就会在网页中看到有哪些问题。例如:
3.5.2 等待审核通过
在 Apple 开始审核你的 App 时,系统会发送一封邮件,提示“In Review”。具体审核的时长不一定,但很有可能遇到一个问题(Issue)就直接打回。一旦打回后,你最好尽快更改,因为不确定是否会有第二个、第三个问题。
3.5.3 审核通过
审核通过后,你会收到一封邮件:
3.5.4 发布
如果你选择了自动发布版本,则 Apple 会自动分发到 App Store。如果你选择的是手动发布版本,则在收到审核通过的邮件后,需要你回到 App Store Connect 页面进行操作。

如果一切顺利,你应该能收到一封邮件:
3.5.5 完成上架
注意,在完成发布后,并不能立即在 App Store 看到发布的版本(如果你首次发布,就搜索不到你的 App)。需要等待一段时间,才能搜索到。
3.5.6 首次提交可能遇到的问题:被打回,并告知需要进行账户审查
详见“Q&A 血泪教训”一节
在成功发布后,你可以添加一个新的版本:

然后填写本次更新的内容后,选择新的版本号(如1.1.0)的构建版本即可。如果你希望在中国大陆长久运营下去,不要钻空子不去进行App备案。ICP备案对于你而言,并不是一件困难、无法完成的事;不要被某些中介忽悠。ICP备案事实上只是比较耗时而已(但相对软著申请动辄几个月时间已经算很快很快的了),并没有什么门槛,不必觉得麻烦就去想办法不做。
如果你已经购买了阿里云的 ECS 服务器,那么推荐使用阿里云的 ICP 备案。因为购买 ECS 服务器后,会有6个免费(具体数量可能不同)的 ICP 备案服务码,它可以用于通过阿里云备案网站或app到工信部。
备案一个 App 的时间一般需要 9~20 天,首次备案可能相对慢一些。基本流程是:
填写备案 App 信息
在阿里云 ICP 备案页面里填写要备案的 App 资料(如果是第一次备案,还需要先填写备案主体信息,可能耗时更久、步骤更多)
需要填写的信息包括:App 信息、App 特征信息
需要使用手机端阿里云录入的信息:身份证正反面拍照,互联网备案信息真实性承诺书(需要打印原件,签名按手印后拍照)
阿里云电话回访
我们把资料提交到阿里云后,一般当天会有电话回访问,完成后就会由阿里云把备案申请提交到工信部
核验短信
阿里云提交到工信部后不久,工信部就会下发一个核验短信后,务必尽快(1天内)打开短信里提供的网站输入核验码以完成核验
等待完成管局审核
这一步是耗时最长的,预计 9 天左右,最长约 20 个工作日,具体以实际审核时间为准。我实际操作下来,只需要 1 天的时间。
阿里云 ICP 备案地址:
https://beian.aliyun.com
打开苹果开发者网站的账户页面:
https://developer.apple.com/account
具体步骤可参考阿里云提供的帮助文件:
https://help.aliyun.com/zh/icp-filing/fill-in-app-feature-information#d95b4da148ruf
注意,应当填写用于正式分发的Distribution 证书信息,如果没有应当先创建一个:
在阿里云提交 App 备案申请到工信部后(快得话5分钟),会收到由工信部下发的短信:
你需要尽快打开 https://beian.miit.gov 来核验。如果你是使用手机打开,一定要注意选择“APP”(非常小的一个选项,不注意的话完全看不到)
完成短信核验后,24小时后就可以看到下面的信息了:
管局通过审核后,即可获得该 App 的备案号。
你需要在自己的 App 中放置,如“关于”页面。你可以参考一些常见 App 的备案号展示方式:
可以看出,目前对备案号的展示并没有固定的格式要求。但唯一需要注意的问题是,根据工信部要求,备案号需要可以点击,并跳转到工信部备案系统网站。
《一图读懂APP备案》:
https://wap.miit.gov.cn/zwgk/zcjd/art/2023/art_9f3a1277fdcb42d68e1eacd37787ae04.html?spm=a2c4g.11174386.n2.6.6ebe61db4RdGIE
《工业和信息化部关于开展移动互联网应用程序备案工作的通知》:
https://www.miit.gov.cn/zwgk/zcwj/wjfb/tz/art/2023/art_920db564162e4312916a01bed6540ad8.html?spm=a2c4g.11174386.n2.4.6ebe61db4RdGIE
《《工业和信息化部关于开展移动互联网应用程序备案工作的通知》解读》
https://wap.miit.gov.cn/zwgk/zcjd/art/2023/art_39b4f1acc36745b98478e0ec3e07128d.html?spm=a2c4g.11174386.n2.5.6ebe61db4RdGIE
获取苹果官方素材:App Store Badges
https://developer.apple.com/app-store/marketing/guidelines/
制作宣传海报
https://shots.so/
附:自动生成标准尺寸的 App 截屏
先安装sharp,然后需要在 package.json 中添加: "type": "module",
import fs from "fs";import sharp from "sharp";const rootpath = `<你的图片目录>`;const sourcepath = `${rootpath}sources`; // 原图文件夹名称const dir = `${rootpath}${newDate().getTime()}`;const isVertial = true; // 是否竖屏const opts = { fit: "contain", background: "#5a58e0" };// 竖屏模式的尺寸// 如果 isVertial === false,则要把宽高对调const sizeMaps = { "6.7英寸": { w: 1290, h: 2796, }, "6.5英寸": { w: 1242, h: 2688, }, "5.5英寸": { w: 1242, h: 2208, }, "6.1英寸": { w: 1179, h: 2556, }, iPad: { w: 2048, h: 2732, }, iPadPro: { w: 2048, h: 2732, }, HUAWEI: { w: 450, h: 800, },};const generate = (source, name, size) => { return new Promise((resolve) => { const fileroot = `${dir}/${name}`; if (!fs.existsSync(fileroot)) { fs.mkdirSync(fileroot); } const width = isVertial === false ? size.h : size.w; const height = isVertial === false ? size.w : size.h; sharp(`${sourcepath}/${source}`) .removeAlpha() .resize(width, height, opts) .toFile(`${fileroot}/${source}`, (err, info) => { if (err) { resolve({ errors: err }); } else { resolve({ data: info }); } }); });};(async () => { // 文件夹 if (!fs.existsSync(dir)) { fs.mkdirSync(dir); } const list = fs.readdirSync(sourcepath); for (let index = 0; index < list.length; index++) { const source = list[index]; for (const name in sizeMaps) { const size = sizeMaps[name]; const res = await generate(source, name, size); if (res.errors) { console.log(name, res.errors); } } }})();
先安装sharp,然后需要在package.json中添加: "type": "module",。核心代码是 .removeAlpha()
import fs from "fs";import sharp from "sharp";const rootpath = `./res/resize/`;const sourcepath = `${rootpath}sources`;const dir = `${rootpath}results`;const defaultSizes = { type1: { width: 216, height: 216, },};const resize = defaultSizes.type1;const opts = { fit: "fill" };const generate = (source) => { return new Promise((resolve) => { sharp(`${sourcepath}/${source}`) .resize(resize.width, resize.height, opts) .removeAlpha() .toFile(`${dir}/${source}`, (err, info) => { if (err) { resolve({ errors: err }); } else { resolve({ data: info }); } }); });};(async () => { if (!fs.existsSync(dir)) { fs.mkdirSync(dir); } const list = fs.readdirSync(sourcepath); for (let index = 0; index < list.length; index++) { const source = list[index]; const res = await generate(source); if (res.errors) { console.log(res.errors); } }})();
强烈建议你在上架前看一遍这一章内容,很可能你会比不看的人早一个月完成上架😄。
如果这是你的账户第一次提交审核,Apple会首先对你的账户进行审查:

根据Apple的建议,我们不需要做任何修改、变更,只能干等着。我第一次提交是在2月28日,直至3.22日才可以继续下面的流程。
此外,据了解,如果你的账号异常(比如买来的),很有可能会被封号;即使本次审核通过了,未来还有可能面临二审、三审。
如果你的 App 里涉及医学建议、诊断等信息,务必把这些信息的来源的链接放在用户可以点击查看的位置;否则可能被驳回。
不要以为很简单的一些信息不算,比如 BMI、高血压的判断标准,它们都属于应当提供信息源的内容。(Apple 在审核的时候还很贴心地截屏给我圈出来)
在 Validate 或 Distribute 时报错,提示图标资源不能是透明的,也不能包含 Alpha通道:
右键图标文件,打开“显示简介”,可以看到Alpha通道的状态是“是”:

使用自带图片预览打开后,另存,去掉 Alpha 通道选项即可:

或使用本文提供的工具箱操作:用 sharp 工具移除Alpha通道
这是“真·血泪教训”,为了偷懒我直接自动生成了所有设备所有尺寸的截屏,所以 iPad 用的是 iPhone 的;在提交审核之前,是不会检查是否合规的。但一旦提交审核,将会被驳回。
而我运气不好,刚好遇到周五,在整改完成重新提交后,已经赶不上本周的审核队列了、直接拖到了下周一(幸好没有其他问题,周一一大早就审核通过)。审核人员很贴心地把所有截屏都作为审核不通过的附加发给我了。
苹果开发者网站账户页面
https://developer.apple.com/account
创建证书签名请求 CSR - Apple 官方文档
https://developer.apple.com/help/account/create-certificates/create-a-certificate-signing-request
Apple 证书管理页面
https://developer.apple.com/account/resources/certificates/list
Apple 标识符管理页面
https://developer.apple.com/account/resources/identifiers/list
App Store Badges 苹果官方素材
https://developer.apple.com/app-store/marketing/guidelines/
阿里云 ICP 备案地址
https://beian.aliyun.com
阿里云 APP 特征信息填写帮助文件
https://help.aliyun.com/zh/icp-filing/fill-in-app-feature-information#d95b4da148ruf
工信部备案核验网站
https://beian.miit.gov.cn
一图读懂 APP 备案
https://wap.miit.gov.cn/zwgk/zcjd/art/2023/art_9f3a1277fdcb42d68e1eacd37787ae04.html
工业和信息化部关于开展移动互联网应用程序备案工作的通知
https://www.miit.gov.cn/zwgk/zcwj/wjfb/tz/art/2023/art_920db564162e4312916a01bed6540ad8.html
《工业和信息化部关于开展移动互联网应用程序备案工作的通知》解读
https://wap.miit.gov.cn/zwgk/zcjd/art/2023/art_39b4f1acc36745b98478e0ec3e07128d.html
软件著作权免费申请全指南(附图文教程!)
快速生成宣传画工具网站
https://shots.so/
欢迎关注公众号↓↓↓↓