5.5 iOS 工程目录与构建

原文链接: App Store 与 Prerequisites

5.5 iOS 工程目录与构建

iOS 与 Android 思路一致:Tauri 生成一个 Xcode 工程,Rust 代码编译成静态库,由原生入口加载。区别是 iOS 只能在 macOS 上开发,并且用 Xcode/CocoaPods 管理。

初始化与开发

先确认已经安装完整 Xcode,并完成 2.2 移动端环境配置 中的 iOS 目标与 CocoaPods。

1
npm run tauri ios init

指定模拟器开发:

1
npm run tauri ios dev

也可直接传入模拟器名称,例如:

1
npm run tauri ios dev 'iPhone 15'

想用 Xcode 图形界面调试:

1
npm run tauri ios dev --open

注意:使用 Xcode/Android Studio 时,启动它们的 Tauri CLI 进程必须保持运行,不能中途关掉。

真机调试的额外一步

真机通过局域网访问开发服务器时,需要让前端 dev server 监听 Tauri CLI 给出的地址:

1
npm run tauri ios dev -- --host

如果网络环境要求使用 iOS 设备的 TUN 地址,可先打开 Xcode 并连接设备,再执行:

1
npm run tauri ios dev -- --force-ip-prompt

前端(例如 Vite)需要根据 TAURI_DEV_HOST 环境变量决定监听主机,create-tauri-app 生成的模板通常已包含这段逻辑。

iOS 工程目录

tauri ios init 会在 src-tauri/gen/apple/ 生成:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
src-tauri/gen/apple/
├── Podfile                          # CocoaPods 依赖清单
├── project.yml                      # XcodeGen 工程描述
├── ExportOptions.plist              # 导出 IPA 配置
├── LaunchScreen.storyboard          # 启动屏
├── Assets.xcassets/                 # 图标等资源
│   ├── AppIcon.appiconset/
│   └── Contents.json
├── Sources/
│   └── <应用名>/
│       ├── main.mm                  # iOS 原生入口
│       └── bindings/
│           └── bindings.h           # Rust 与 Objective-C++ 的桥接头
└── <应用名>.xcodeproj/               # 可直接用 Xcode 打开

project.yml 是工程描述文件,Tauri 用 XcodeGen 维护 .xcodeproj,所以不要手动在 Xcode 中大规模改动工程结构。

原生入口 main.mm

Sources/<应用名>/main.mm 内容极简:

1
2
3
4
5
6
7
#include "bindings/bindings.h"

int main(int argc, char * argv[]) {
    // 启动 Rust 侧的 Tauri 应用
    ffi::start_app();
    return 0;
}

它通过 bindings.h 调用 Rust 导出的 ffi::start_app()。日常 Rust 代码仍写在 src-tauri/src/lib.rs。

构建与产物

构建 .app:

1
npm run tauri ios build

若要导出 App Store 用 IPA:

1
npm run tauri ios build -- --export-method app-store-connect

官方文档给出的 IPA 输出路径:

1
src-tauri/gen/apple/build/arm64/<应用名>.ipa

模拟器调试产物通常也能在 gen/apple/build/ 下找到。

常见 iOS 专属设置

1. 最低系统版本

Tauri 默认把 iOS 的最低部署版本设为 15.0,可在 tauri.conf.json 中调整:

1
2
3
4
5
6
7
{
  "bundle": {
    "iOS": {
      "minimumSystemVersion": "15.0"
    }
  }
}

注意:部分 iOS 平台配置在修改后不会自动写进 .xcodeproj,如果 Xcode 中没有生效,可删除后重新执行 tauri ios init,再打开工程确认。

2. 网络权限

真机首次运行 tauri ios dev,系统会提示“允许 App 查找并连接本地网络设备”。这是为了访问 Mac 上的开发服务器,必须点“允许”。

3. 隐私描述

需要摄像头、位置等权限时,在 Xcode 的 Info 或 Tauri 自动查找的 Info.plist 中加描述,例如:

1
2
3
<!-- 把下面的键值对加入 Info.plist 的 <dict> 中 -->
<key>NSCameraUsageDescription</key>
<string>需要使用摄像头扫描二维码</string>

4. 签名

真机运行与上架都需要 Apple Developer 账号和签名。Xcode 的 Signing & Capabilities 中配置 Team 即可,上架还需在 Apple Developer 生成证书与描述文件。

5. Web Inspector

iOS 的网页调试不叫 DevTools,而是:

  1. Mac 上打开 Safari → 设置 → 高级 → 勾选“显示网页开发功能”;
  2. 真机开启 Safari 的 Web Inspector;
  3. Safari 的“开发”菜单里选择设备与页面。

iOS 与 Android 的目录对照

概念AndroidiOS
原生壳工程gen/android/ Gradlegen/apple/ Xcode
原生语言Kotlin/JavaObjective-C++(插件可含 Swift)
依赖工具GradleCocoaPods
加载 Rust 的方式动态 .so静态库链接
入口代码MainActivity.ktmain.mm
商店产物AABIPA

下一步

到这里,你已经能从总体上把握五个平台的工程布局。接下来看如何“加功能”和“发出去”: 第 6 章。