Files

244 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# iOS 配置指南
本文档覆盖 iOS 端从 CocoaPods 安装到 Archive 发布所需的全部配置步骤。
> **平台要求**macOS 系统 + Xcode 16+。Windows / Linux 无法进行 iOS 开发。
---
## 前提
- macOS 14 (Sonoma) 或更高版本
- Xcode 16.0(从 App Store 安装,包含 iOS 18 SDK
- CocoaPods 1.15+`sudo gem install cocoapods`
- Apple Developer 账户(真机运行需 Free 账户,发布需 Paid 账户 $99/年)
- 已完成 [setup-project.md](setup-project.md) 的 Step 14
---
## 1. 安装 CocoaPods 依赖
```bash
cd ios
pod install
cd ..
```
首次执行会拉取依赖,耗时 5–15 分钟(取决于网络)。成功后生成:
- `ios/Pods/` 目录(gitignore,不提交)
- `ios/Podfile.lock`(版本锁定,**应提交**
> 如果 `pod install` 卡住,检查 CocoaPods 源:
> ```bash
> pod repo update
> ```
---
## 2. 验证基础构建
```bash
# 无签名编译验证(不需要 Apple 账户)
flutter build ios --no-codesign --flavor dev \
--dart-define-from-file=dart-defines/dev.json
# 预期输出:
# ✓ Built build/ios/iphoneos/Runner.app
```
---
## 3. 配置 Bundle Identifier
打开 Xcode**必须通过 .xcworkspace 打开**):
```bash
open ios/Runner.xcworkspace
```
在 Xcode 中:
1. 左侧导航选择 **Runner** 项目
2. 选择 **Runner** Target → **General** 选项卡
3. **Bundle Identifier** 改为业务项目实际 ID
| Build Configuration | Bundle ID |
|---------------------|-----------|
| Debugdev 开发调试)| `com.your_company.your_app.dev` |
| Debug-staging | `com.your_company.your_app.staging` |
| Releaseprod 发布)| `com.your_company.your_app` |
> 脚手架默认使用单个 Bundle IDFlavor 区分由 xcconfig 控制。若需要三个独立 Bundle ID,在 `ios/Flutter/flavors/` 的 xcconfig 文件中添加 `PRODUCT_BUNDLE_IDENTIFIER` 覆盖。
---
## 4. 配置 Xcode Build Configuration 和 Scheme
脚手架已在 `ios/Flutter/flavors/` 中提供三套 xcconfig
| 文件 | 对应 Flavor |
|------|-----------|
| `dev.xcconfig` | 开发包(Debug-dev|
| `staging.xcconfig` | 测试包(Debug-staging / Release-staging|
| `prod.xcconfig` | 正式包(Release|
### 关联 xcconfig 到 Build Configuration
1. Xcode → **Runner** 项目 → **Info** 选项卡 → **Configurations**
2. 展开每个 Configuration,点击 Runner 旁的下拉:
| Configuration 名称 | 关联 xcconfig |
|--------------------|---------------|
| Debug | `Flutter/flavors/dev.xcconfig` |
| Release | `Flutter/flavors/prod.xcconfig` |
| Profile | `Flutter/flavors/prod.xcconfig` |
> 若需要 staging 独立 Configuration,在此添加 `Debug-staging` / `Release-staging`。
### 添加 dev / staging Scheme(推荐)
1. Xcode → **Product****Scheme****Manage Schemes**
2. 复制 `Runner` Scheme,重命名为 `dev`
3. 编辑 `dev` Scheme
- **Build Configuration**Run)→ `Debug`
-**Arguments** 中确认无硬编码的 dart-definesFlutter 通过 `--dart-define-from-file` 注入)
---
## 5. 配置代码签名
### 5.1 自动签名(开发调试,推荐)
1. Xcode → **Runner** Target → **Signing & Capabilities**
2. 勾选 **Automatically manage signing**
3. **Team** 选择你的 Apple Developer 账户
4. Xcode 会自动创建 Provisioning Profile 和 Signing Certificate
### 5.2 手动签名(CI/CD 或发布版)
1. 在 [Apple Developer Portal](https://developer.apple.com/account) 创建:
- Distribution Certificate(可签发 App Store / Ad Hoc 包)
- App ID(对应 Bundle Identifier
- Provisioning ProfileDistribution 类型)
2. 下载 `.mobileprovision` 文件,双击安装到 Xcode
3. 取消勾选 **Automatically manage signing**
4. 选择对应的 **Signing Certificate****Provisioning Profile**
---
## 6. 真机运行
```bash
# 确认设备已连接
flutter devices
# 运行到真机(dev 包)
flutter run --flavor dev \
--dart-define-from-file=dart-defines/dev.json \
-d <device-id>
# 或通过 Xcode 直接运行(选择 dev Scheme + 目标设备)
```
首次在设备上运行需要:
- 设备 → **设置 → 通用 → VPN 与设备管理** → 信任开发者证书
---
## 7. 构建 TestFlight / App Store Archive
```bash
# 1. 确保 prod.json 已配置正确
cat dart-defines/prod.json
# 2. 构建 iOS Release
flutter build ios --flavor prod --release \
--dart-define-from-file=dart-defines/prod.json
# 3. 在 Xcode 中 Archive(需要 Distribution Certificate
# Product → Archive → Distribute App → App Store Connect
```
### CI/CD ArchiveFastlane 示例)
```ruby
# Fastfile
lane :beta do
build_app(
workspace: "ios/Runner.xcworkspace",
scheme: "Runner", # 或 prod scheme
configuration: "Release",
export_method: "app-store",
export_options: {
provisioningProfiles: {
"com.your_company.your_app" => "Your App Store Profile"
}
}
)
upload_to_testflight
end
```
---
## 8. 常用 xcconfig 字段说明
`ios/Flutter/flavors/dev.xcconfig`
```xcconfig
// 覆盖 Display Name(桌面图标显示的应用名)
DISPLAY_NAME=YourApp Dev
// 覆盖 Bundle ID(若三包使用不同 ID
// PRODUCT_BUNDLE_IDENTIFIER=com.your_company.your_app.dev
// 覆盖 App Icon(若三包使用不同图标)
// ASSETCATALOG_COMPILER_APPICON_NAME=AppIconDev
```
---
## 9. 最低 iOS 版本
`Podfile` 已锁定 iOS 15.0
```ruby
platform :ios, '15.0'
```
若业务需要支持更低版本,修改此行并运行 `pod install`。同时在 Xcode → Target → **Deployment Info****iOS Deployment Target** 同步修改。
---
## 常见问题
### `pod install` 报 `CocoaPods could not find compatible versions`
```bash
pod repo update # 更新本地 CocoaPods 源
pod install --repo-update
```
### Xcode 打开 `.xcodeproj` 而非 `.xcworkspace`
必须打开 `.xcworkspace`,否则 CocoaPods 的依赖不会加载:
```bash
open ios/Runner.xcworkspace # ✓ 正确
# 不要 open ios/Runner.xcodeproj ✗
```
### 真机运行报 `Untrusted Developer`
设备 → 设置 → 通用 → VPN 与设备管理 → 找到 Developer App → 信任。
### Archive 失败,报 `Provisioning profile doesn't include the entitlement`
在 Apple Developer Portal 重新生成 Provisioning Profile(选中全部所需 Entitlements),重新下载安装。
### Flutter build 报 `The iOS deployment target is set to xxx, but the range of supported deployment targets is`
更新 `Podfile` 中的 `platform :ios` 版本,运行 `pod install`,并在 Xcode Target → Deployment Info 同步修改。
### 模拟器运行正常,真机崩溃(SecureStorage 相关)
iOS 模拟器的 Keychain 行为与真机不同。确认 Xcode → Target → **Signing & Capabilities** → 已添加 **Keychain Sharing** Capability(脚手架默认不需要,但某些系统版本可能要求)。