Skip to content

01 - iOS 发布与部署全栈

目录

  1. 发布流程概览
  2. 签名与证书
  3. 描述文件 (Provisioning Profile)
  4. 构建配置
  5. App Store 发布
  6. TestFlight 分发
  7. 企业内部分发
  8. 发布流程对比
  9. Fastlane 自动化
  10. 发布检查清单
  11. 面试考点汇总

1. 发布流程概览

1.1 iOS 分发方式对比

分发方式适用场景审核证书类型安装方式
App Store公开应用✅ 需要App StoreApp Store 下载
TestFlight内部/外部测试✅ 需要Ad Hoc/DistributionTestFlight App
Ad Hoc小范围测试❌ 不需要Ad Hoc描述文件安装
Enterprise企业内部❌ 不需要Enterprise企业签名
App Link直接安装❌ 不需要DeveloperHTTPS + manifest

1.2 发布流程

iOS 发布流程:

┌─────────┐    ┌────────┐    ┌────────┐    ┌────────┐    ┌────────────┐
│ 代码完成 │───→│ 签名   │───→│ 构建   │───→│ 提交   │───→│ 分发/上架  │
│          │    │ 证书   │    │ Archive│    │ App Store│    │ TestFlight │
└─────────┘    └───────┘    └───────┘    └───────┘    └───────────┘

关键步骤:
1. 确保证书和描述文件有效
2. 配置正确的 Build Configuration (Release)
3. 设置正确的 Bundle Version 和 Build Number
4. 创建 Archive
5. 验证和提交

2. 签名与证书

2.1 证书类型

iOS 证书体系:

┌──────────────────────────────────────────────────────┐
│                 Apple 证书类型                          │
├────────────────────┼────────────────────┬─────────────┤
│  证书类型          │  用途               │  有效期     │
├────────────────────┼────────────────┬──┼──────────────┤
│  Apple Development │ 开发调试        │  1年      │
│  Apple Distribution│ App Store 发布  │  1年      │
│  Ad Hoc Distribution│ 内部测试(最多100台)| 1年      │
│  In-House (Enterprise)│ 企业内部分发  │  3年      │
│  Developer ID       │ Mac App Store   │  1年      │
│  Web Distribution   │ Web 推送证书    │  1年      │
└───────────────────┴───────────────┴──┴─────────────┘

2.2 证书管理

证书管理方式:

┌──────────────┬────────────────────┬──────────────────────┐
│ 管理方式      │  优势               │  劣势                 │
├──────────────┼────────────────┬──┼─────────────────────┤
│ 手动管理      │ 简单直接         │ 容易过期、难同步      │
│ Xcode Autom. │ 自动化           │ 配置复杂              │
│ Fastlane+m.  │ 全自动化         │ 需学习成本            │
│ Xcode Cloud  │ Apple 原生       │ 平台锁定              │
│ Cert + sigh  │ Fastlane 工具链  │ 独立工具              │
└──────────────┴────────────────────┴──┴─────────────────────┘

3. 描述文件 (Provisioning Profile)

3.1 描述文件组成

Provisioning Profile 结构:

┌──────────────────────────────────────────┐
│          Provisioning Profile             │
├───────────────────┬──────────────────┬──┤
│  Team ID          │  App ID          │  │
│  Certificate IDs  │  Device IDs      │  │
│  Entitlements     │  Expiration Date │  │
│  Profile UUID     │  Name            │  │
└───────────────────┴─────────────────┴──┘

Profile 类型:
• Development Profile: 开发调试,绑定开发证书 + 设备
• Distribution Profile: App Store 发布,绑定分发证书
• Ad Hoc Profile: 内部测试,最多 100 台设备
• In-House Profile: 企业分发,绑定企业证书

3.2 App ID 与 Entitlements

App ID 配置:
├── Bundle ID (反向域名格式)
├── Capabilities:
│   ├── App Groups
│   ├── Associated Domains
│   ├── Game Center
│   ├── Hotspot Helper
│   ├── Identity Service
│   ├── In-App Purchase
│   ├── MapKit
│   ├── Push Notifications
│   ├── Safari SSO
│   └── Wireless Accessory Configuration
└── Entitlements (权限声明)

4. 构建配置

4.1 Xcode Build Configuration

Xcode 构建配置:

┌───────────┬───────────────┬───────────────────┐
│ 配置项     │  Debug        │  Release          │
├───────────┼───────────────┼───────────────────┤
│ 优化级别   │ No Optimization│ Optimize Size    │
│ DEBUG      │ YES           │ NO                │
│ NSAssert   │ Enabled       │ Disabled          │
│ 符号表     │ 完整          │ 剥离              │
│ 死代码剥离  │ 否           │ 是 (Dead Code Stripping) │
│ 归档文件   │ .dSYM 生成    │ .dSYM 生成       │
│ IPD        │ 禁用          │ 启用 (Instrumentation Profiling) │
└───────────┴───────────────┴───────────────────┘

4.2 Archive 流程

Archive 创建流程:

Product → Archive → Distribute App

分发选项:
├── App Store Connect (上传到 App Store)
├── App Store Distribution (提交到 App Store)
├── Ad Hoc (导出 .ipa + 描述文件)
├── Enterprise (企业签名分发)
├── Development (开发调试)
└── Custom (自定义签名配置)

5. App Store 发布

5.1 App Store Connect 流程

App Store Connect 流程:

┌─────────────┐    ┌──────────────┐    ┌──────────────┐
│ 创建 App     │───→│ 填写元数据    │───→│ 上传构建版本  │
│ (App Store)  │    │ (名称/描述等) │    │ (Xcode/Fastlane) │
└─────────────┘    └─────────────┘    └────────┬────┘

┌─────────────┐    ┌──────────────┐    ┌────────┐
│ 管理版本     │←───│ 审核结果     │←───│ Apple审核│
│ (发布/下架)  │    │ (通过/拒绝)  │    │ (1-14天) │
└─────────────┘    └─────────────┘    └─────────┘

5.2 提交元数据

字段说明要求
App 名称最多 30 字符唯一性
副标题最多 30 字符可选
描述应用描述至少 75 字符
关键词搜索关键词最多 100 字符
分类主要/次要分类必须
年龄分级内容分级必须
定价免费版/付费必须
版权© 年份+公司可选
支持 URL技术支持页面必须
营销 URL营销落地页可选

5.3 App Review 指南要点

类别常见拒绝原因
GC_1.1功能不完整/崩溃
GC_2.1元数据不准确
GC_5.1.1内购类型错误
GC_5.2.1链接到外部付款
GC_5.3.1缺失隐私政策
GC_5.4.1广告 SDK 违规
GC_7.1.1未提供测试账号

6. TestFlight 分发

6.1 TestFlight 类型

类型人数限制审核适用场景
内部测试最多 100 人团队成员
外部测试最多 10,000 人外部用户

6.2 TestFlight 流程

TestFlight 分发流程:

Developer Portal → 创建测试组

Xcode → 上传构建版本

App Store Connect → 选择构建版本 → 提交审核

审核通过 → 邀请测试者

测试者安装 TestFlight App → 测试应用

收集反馈 → 修复问题 → 重新构建 → 重复

7. 企业内部分发

7.1 企业签名流程

企业签名发布流程:

┌─────────────┐    ┌────────┐    ┌────────┐
│ 企业证书     │───→│ 构建 .ipa│───→│ 上传到  │
│ (In-House)  │    │  Archive│    │ HTTPS  │
└─────────────┘    └───┬───┘    └────┬───┘
                       │              │
              ┌────────┴───┐    ┌──────┴──────┐
              │ manifest.plist │  │ 用户点击链接  │
              │ (安装配置)   │    │ 安装到设备   │
              └─────────────┘    └─────────────┘

manifest.plist 格式:
{
    "items": [{
        "assets": [{
            "kind": "software-package",
            "url": "https://example.com/app.ipa"
        }],
        "metadata": {
            "bundle-identifier": "com.example.app",
            "version": "1.0",
            "title": "My Enterprise App"
        }
    }]
}

用户安装链接:
<a href="itms-services://?action=download-manifest&url=https://example.com/manifest.plist">
    安装应用
</a>

8. 发布流程对比

维度App StoreTestFlightAd HocEnterprise
审核时间1-14 天1-14 天即时即时
设备限制10,000 人100 台无限制
成本免费(开发者 $99/年)免费免费$299/年
更新频率每 7 天 1 次构建每 7 天 1 次每 7 天 1 次每 7 天 1 次
安装方式App StoreTestFlight App描述文件manifest 链接
自动更新
适用阶段正式发布UAT/测试内部测试企业部署

9. Fastlane 自动化

9.1 Fastlane 发布脚本

ruby
# Fastfile - 发布流程自动化

platform :ios do
  desc "Deploy a new version to the App Store"
  lane :release do
    # 1. 证书管理
    match(type: "app_store", readonly: false)
    
    # 2. 构建
    gym(
      scheme: "MyApp",
      export_method: "app-store",
      export_options: {
        provisioningProfiles: {
          "com.example.app" => "MyApp App Store"
        }
      }
    )
    
    # 3. 提交到 App Store
    deliver(
      force: true,
      skip_screenshots: false,
      skip_metadata: false,
      submit_for_review: true
    )
  end
  
  desc "Submit to TestFlight"
  lane :beta do
    match(type: "adhoc")
    gym(scheme: "MyApp", export_method: "adhoc")
    pilot(
      distribution: "internal",
      beta_app_description: "Beta build for testing"
    )
  end
  
  desc "Enterprise deployment"
  lane :enterprise do
    match(type: "in_house")
    gym(scheme: "MyApp", export_method: "enterprise")
    
    # 生成 manifest.plist
    sigh(
      app_identifier: "com.example.app",
      provisioning_name: "MyApp Enterprise"
    )
  end
end

10. 发布检查清单

10.1 发布前检查

发布前检查清单:

□ 版本号更新 (CFBundleShortVersionString)
□ 构建号递增 (CFBundleVersion)
□ Bundle ID 正确
□ 签名配置正确 (Certificate + Provisioning Profile)
□ 图标和启动图更新
□ 隐私政策 URL 设置
□ App Icon 所有尺寸
□ 截图更新 (所有设备尺寸)
□ 内购项目创建并审核通过
□ App Store 元数据填写
□ 测试账号准备 (如需要)
□ 构建配置为 Release
□ 死代码剥离开启
□ 符号表 .dSYM 保留
□ CI/CD Pipeline 通过
□ Beta 测试无严重 Bug
□ 证书/Profile 未过期
□ 目标设备兼容测试通过

11. 面试考点汇总

高频面试题

  1. iOS 应用的签名流程是什么?

    • 开发者签名 → 打包签名 → 验证签名
    • 证书 + 描述文件 + App ID 三者匹配
    • 签名确保代码完整性
  2. App Store 审核被拒怎么办?

    • 分析拒绝原因,对照 App Review Guidelines
    • 修复问题后重新提交,附注说明
    • 常见原因:功能不完整、元数据错误、内购违规
  3. TestFlight 和 Ad Hoc 的区别?

    • TestFlight:最多 10,000 人,需要审核,通过 App 安装
    • Ad Hoc:最多 100 台设备,不需要审核,通过描述文件安装
  4. 企业签名的风险?

    • 证书可能被 Apple 撤销
    • 应用被分发到非目标用户
    • 安全风险:代码可被反编译和篡改
  5. Bundle ID 和 Bundle Version 的作用?

    • Bundle ID:应用唯一标识,与 App ID 匹配
    • Bundle Version:内部版本号,每次构建必须递增
    • CFBundleShortVersionString:对外版本号

面试回答模板

"iOS 发布我使用 Fastlane 自动化。证书管理用 match,构建用 gym,提交到 App Store 用 deliver。TestFlight 用 pilot 分发。每次发布前检查清单确保版本号、签名、配置正确。审核被拒时对照 Guidelines 逐条修复。"


本文档对标 Android 16_Release_Deploy/ 的深度