移动端支持概览
本教程共 48 篇 · 第 47 篇 · 更新于 2026-08-09 · 约 12 分钟阅读
本节目标:读完你能理解 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。
TipNDK 版本建议用 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 的硬性限制。你需要:
- Xcode:从 Mac App Store 安装,免费
- Apple Developer 账号:注册 developer.apple.com,年费 $99(用于发布到 App Store;仅本地调试可以免费账号)
- CocoaPods:iOS 依赖管理工具,
sudo gem install cocoapods安装
安装好 Xcode 后,打开一次让它完成额外组件安装。然后在 Settings → Accounts 里登录你的 Apple ID。
NoteTauri 的 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
TipAndroid 模拟器在 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.json 的 version 字段推导 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 编码
NoteiOS 签名是整个移动端流程中最容易踩坑的环节。如果只做本地调试,用免费 Apple ID 配合 Xcode 自动签名就够了。发布到 App Store 才需要付费开发者账号和正式的 Distribution 证书。
移动端插件开发
桌面端插件只需要 Rust + JavaScript 两端。移动端插件多了一层:Rust ↔ 原生代码(Kotlin/Swift)。
Tauri 的插件模板把实现拆成 desktop.rs 和 mobile.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"])
}
}
NoteAndroid 的
@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 会自动生成 checkPermissions 和 requestPermissions 两个命令,前端可以直接调用:
// 检查权限状态
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 限制、部分桌面插件在移动端不可用、以及移动端没有多窗口等差异。