首页 / Tauri 2 入门教程 / 移动端支持概览

Tauri 2 入门教程

移动端支持概览

本教程共 48 篇 · 第 47 篇 · 更新于 2026-08-09 · 约 12 分钟阅读

TauriTauri 2 入门教程移动端AndroidiOSNDKXcode移动开发

本节目标:读完你能理解 Tauri 2 移动端的基本架构、搭建好 Android/iOS 开发环境、跑通构建流程,并知道移动端有哪些限制需要注意。

Tauri 1.x 只能做桌面应用(Windows、macOS、Linux)。到了 Tauri 2,移动端成了一等公民(first-class citizen)——同一套 Rust + Web 前端代码,既能打包桌面应用,也能跑在 Android 和 iOS 上。这是 Tauri 2 最重要的新特性之一。

打个比方:Tauri 1 像一家只做堂食的餐厅,桌面平台是唯一的出口;Tauri 2 则同时开了外卖窗口,Android 和 iOS 都能下单,厨房(你的 Rust 代码)还是同一个。

移动端架构思路

Tauri 的移动端方案不等于”把网页套个壳”。它的思路是:前端用 WebView 渲染,后端用 Rust 编译为原生库,通过 Tauri 的 IPC 通道通信。和桌面端的架构一致,区别只在于 WebView 的实现和 Rust 的编译目标。

  • Android:前端跑在 Android System WebView 里,Rust 编译为动态库(.so),通过 JNI 桥接 Kotlin/Java 层
  • iOS:前端跑在 WKWebView 里,Rust 编译为静态库,通过 C FFI 桥接 Swift 层

这意味着你在桌面端写的 Tauri 命令、事件系统、状态管理,大部分可以直接在移动端复用。需要平台特定功能时(比如调摄像头、传感器),再写原生插件。

前置要求:Android 开发环境

Android 开发需要安装 JDK、Android Studio 和 NDK(Native Development Kit)。三者缺一不可。

安装 JDK 17:

# macOS(用 Homebrew)
brew install openjdk@17

# 安装后配置环境变量(写入 ~/.zshrc 或 ~/.bashrc)
export PATH="$PATH:/opt/homebrew/opt/openjdk@17/bin"
export JAVA_HOME="/opt/homebrew/opt/openjdk@17"

Windows 用户可以从 Adoptium 下载 JDK 17 安装包,安装时勾选”设置环境变量”即可。

安装 Android Studio:

developer.android.com 下载安装 Android Studio。打开后,它会引导你安装 Android SDK。

安装 NDK:

打开 Android Studio → Settings → Languages & Frameworks → Android SDK → SDK Tools 选项卡 → 勾选 “NDK (Side by side)” → Apply。安装完成后,记下版本号(如 28.0.12433566),后面要用。

然后配置环境变量:

export ANDROID_HOME="$HOME/Library/Android/sdk"
export NDK_HOME="$HOME/Library/Android/sdk/ndk/28.0.12433566"
Warning

NDK_HOME 的路径必须精确到版本号子目录。可以 ls ~/Library/Android/sdk/ndk 查看实际安装了哪个版本,再把完整路径填进去。路径写错,Tauri 的 android init 会报找不到 NDK。

Tip

NDK 版本建议用 28 或更高。Google 正在推进 16KB 内存页(16KB memory pages)要求,NDK 28+ 自动生成符合要求的包。如果你被迫用旧版 NDK,可以在 .cargo/config.toml 里手动加链接参数:

[target.aarch64-linux-android]
rustflags = ["-C", "link-arg=-Wl,-z,max-page-size=16384"]

前置要求:iOS 开发环境

iOS 开发只能在 macOS 上进行,这是 Apple 的硬性限制。你需要:

  1. Xcode:从 Mac App Store 安装,免费
  2. Apple Developer 账号:注册 developer.apple.com,年费 $99(用于发布到 App Store;仅本地调试可以免费账号)
  3. CocoaPods:iOS 依赖管理工具,sudo gem install cocoapods 安装

安装好 Xcode 后,打开一次让它完成额外组件安装。然后在 Settings → Accounts 里登录你的 Apple ID。

Note

Tauri 的 iOS 构建底层依赖 Xcode 项目。Apple 的签名(code signing)和描述文件(provisioning profile)机制同样适用于 Tauri 应用。如果你之前没接触过 iOS 开发,这一步的学习曲线是最陡的。

初始化移动端项目

环境就绪后,在现有 Tauri 项目里初始化移动端支持:

# 初始化 Android 项目
npx tauri android init

# 初始化 iOS 项目
npx tauri ios init

这两个命令会在 src-tauri/gen/ 下分别生成 android/apple/ 目录,里面是标准的 Android Studio 项目和 Xcode 项目。

运行移动端开发服务器:

# Android(需要先启动模拟器或连接真机)
npx tauri android dev

# iOS(需要先启动模拟器或连接真机)
npx tauri ios dev
Tip

Android 模拟器在 Android Studio 的 Device Manager 里创建。iOS 模拟器在 Xcode 的 Window → Devices and Simulators 里管理。tauri android dev / tauri ios dev 会自动检测已启动的模拟器并安装运行。

构建发布包

开发调试用 dev,构建发布包用 build

# 构建 Android App Bundle(.aab,用于上传 Google Play)
npx tauri android build

# 构建 APK(用于测试或非商店分发)
npx tauri android build --apk

# 构建 iOS 应用(.ipa)
npx tauri ios build

Android 默认构建所有支持的 CPU 架构(aarch64、armv7、i686、x86_64)。想只编译特定架构,用 --target

npx tauri android build --target aarch64

版本号方面,Tauri 从 tauri.conf.jsonversion 字段推导 versionCode(major*1000000 + minor*1000 + patch)。如果需要自定义,可以在配置里单独设:

{
  "bundle": {
    "android": {
      "versionCode": 100
    }
  }
}

最低 Android 版本默认是 Android 7.0(SDK 24)。需要提高最低版本,同样在配置里改:

{
  "bundle": {
    "android": {
      "minSdkVersion": 28
    }
  }
}

代码签名

发布应用必须签名,Android 和 iOS 各有一套流程。

Android 签名:keytool 生成一个 Java Keystore 文件:

keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload

然后在 src-tauri/gen/android/ 下创建 keystore.properties 文件:

password=你设置的密码
keyAlias=upload
storeFile=/Users/你的用户名/upload-keystore.jks

再编辑 src-tauri/gen/android/app/build.gradle.kts,添加签名配置,让 release 构建自动使用这个 keystore。

Warning

keystore 文件和 keystore.properties 都包含敏感信息,绝对不要提交到公开的 Git 仓库。在 .gitignore 里排除它们。

iOS 签名: 推荐用 Xcode 的自动签名(Automatic Signing)。打开 src-tauri/gen/apple/ 下的 Xcode 项目,在 Signing & Capabilities 选项卡里选择你的 Development Team,Xcode 会自动处理证书和描述文件。

如果需要在 CI/CD 环境签名,可以通过环境变量配置:

  • IOS_CERTIFICATE:证书的 base64 编码
  • IOS_CERTIFICATE_PASSWORD:证书密码
  • IOS_MOBILE_PROVISION:描述文件的 base64 编码
Note

iOS 签名是整个移动端流程中最容易踩坑的环节。如果只做本地调试,用免费 Apple ID 配合 Xcode 自动签名就够了。发布到 App Store 才需要付费开发者账号和正式的 Distribution 证书。

移动端插件开发

桌面端插件只需要 Rust + JavaScript 两端。移动端插件多了一层:Rust ↔ 原生代码(Kotlin/Swift)

Tauri 的插件模板把实现拆成 desktop.rsmobile.rs。桌面端用 Rust 直接实现,移动端则通过 run_mobile_plugin 把请求转发给原生代码:

// mobile.rs
impl Example<R> {
    pub fn open_camera(&self, payload: CameraRequest) -> crate::Result<Photo> {
        self.0
            .run_mobile_plugin("openCamera", payload)
            .map_err(Into::into)
    }
}

Android 端用 Kotlin 写一个继承 Plugin 的类,用 @Command 注解标记可调用的方法:

@TauriPlugin
class ExamplePlugin(private val activity: Activity): Plugin(activity) {
    @Command
    fun openCamera(invoke: Invoke) {
        val ret = JSObject()
        ret.put("path", "/path/to/photo.jpg")
        invoke.resolve(ret)
    }
}

iOS 端用 Swift 写一个继承 Plugin 的类,用 @objc 标记方法:

class ExamplePlugin: Plugin {
    @objc public func openCamera(_ invoke: Invoke) throws {
        invoke.resolve(["path": "/path/to/photo.jpg"])
    }
}
Note

Android 的 @Command 方法默认在主线程执行。如果要做耗时操作(网络请求、文件读写),必须启动协程切到 IO 线程,否则会触发 ANR(Application Not Responding)错误:

CoroutineScope(Dispatchers.IO).launch {
    val result = myLongRunningOperation()
    invoke.resolve(result)
}

移动端权限管理

移动端有些功能需要用户授权,比如通知、摄像头、位置等。Tauri 简化了权限的检查和请求流程。

在 Android 的 @TauriPlugin 注解里声明需要的权限:

@TauriPlugin(
    permissions = [
        Permission(strings = [Manifest.permission.POST_NOTIFICATIONS], alias = "postNotification")
    ]
)
class ExamplePlugin(private val activity: Activity): Plugin(activity) { }

Tauri 会自动生成 checkPermissionsrequestPermissions 两个命令,前端可以直接调用:

// 检查权限状态
const permission = await invoke('plugin:example|checkPermissions');

// 请求权限
if (permission.postNotification.startsWith('prompt')) {
    const state = await invoke('plugin:example|requestPermissions', {
        permissions: ['postNotification']
    });
}

限制与注意事项

移动端毕竟不是桌面,有一些固有限制需要了解:

平台限制:

  • iOS 开发只能在 macOS 上进行,Windows/Linux 无法构建 iOS 应用
  • Android 构建可以在任何平台上进行,但需要安装 NDK
  • 模拟器性能不如真机,复杂动画和大量计算建议真机测试

功能差异:

  • 部分桌面端插件不支持移动端(如 tauri-plugin-shell,因为移动端没有传统意义上的 shell)
  • 文件系统路径规则不同:Android 用 /data/data/<包名>/files,iOS 用 App Sandbox 目录
  • 窗口管理 API 在移动端不可用——手机只有一个全屏窗口,没有多窗口概念

构建与发布:

  • Google Play 要求 AAB 格式,首次上传必须在网页端手动完成
  • App Store 要求通过 Xcode 或 xcodebuild 上传,签名流程复杂
  • 移动端包体积通常比桌面端小,因为 WebView 是系统自带的,不需要打包
Tip

如果你的应用同时要跑桌面和移动端,可以在 Rust 代码里用 #[cfg(mobile)]#[cfg(desktop)] 条件编译,为不同平台提供不同实现。前端 JS 也可以通过 @tauri-apps/api 提供的平台检测函数判断当前运行环境。

小结

Tauri 2 把移动端提升为一等公民,一套代码同时覆盖桌面和 Android/iOS。Android 需要 JDK + Android Studio + NDK,iOS 需要 macOS + Xcode + Apple Developer 账号。用 tauri android init / tauri ios init 初始化项目,tauri android dev / tauri ios dev 调试,tauri android build / tauri ios build 构建发布包。移动端插件比桌面端多一层原生代码(Kotlin/Swift),通过 run_mobile_plugin 桥接。需要注意 iOS 开发的 macOS 限制、部分桌面插件在移动端不可用、以及移动端没有多窗口等差异。