Tauri从创建到发布到商店指南

2025/04/29

Tauri 2.0 支持了移动端开发, 这几天在准备工作交接的工作, 顺便在这里记录下Tauri 2.0从创建到发布到商店的过程.

环境依赖安装

详细文档你可以参考 https://tauri.app/start/prerequisites/ , 对于 Mac 你可以参考以下命令

安装 Rust

curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

安装 Node.js

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

安卓开发

Android SDK Platform
Android SDK Platform-Tools
NDK (Side by side)
Android SDK Build-Tools
Android SDK Command-line Tools
export ANDROID_HOME="$HOME/Library/Android/sdk"
export NDK_HOME="$ANDROID_HOME/ndk/$(ls -1 $ANDROID_HOME/ndk)"
rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android
brew install openjdk@21
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"

iOS 开发

rustup target add aarch64-apple-ios x86_64-apple-ios aarch64-apple-ios-sim

创建项目

命令行参考文档 https://tauri.app/zh-cn/reference/cli/#android

详细文档你可以参考 https://tauri.app/start/create-project/, 以下以 pnpm 为例

corepack enable
pnpm create tauri-app
# 根据提示输入参数

你可以根据需要修改以下配置, 具体属性可以参考 https://schema.tauri.app/config/2

添加 android

pnpm tauri android init

添加 ios

pnpm tauri ios init

更新图标

代码签名

安卓

详情参考 https://tauri.app/distribute/sign/android/

password=<password defined when keytool was executed>
keyAlias=upload
storeFile=<location of the key store file, such as /Users/<user name>/upload-keystore.jks or C:\\Users\\<user name>\\upload-keystore.jks>
import java.io.FileInputStream
import java.util.Properties

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("rust")
}

val tauriProperties = Properties().apply {
    val propFile = file("tauri.properties")
    if (propFile.exists()) {
        propFile.inputStream().use { load(it) }
    }
}

android {
    compileSdk = 34
    namespace = "com.tauri_app.app"
    defaultConfig {
        manifestPlaceholders["usesCleartextTraffic"] = "false"
        applicationId = "com.tauri_app.app"
        minSdk = 24
        targetSdk = 34
        versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt()
        versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0")
    }
    signingConfigs {
        create("release") {
            val keystorePropertiesFile = rootProject.file("keystore.properties")
            val keystoreProperties = Properties()
            if (keystorePropertiesFile.exists()) {
                keystoreProperties.load(FileInputStream(keystorePropertiesFile))
            }

            keyAlias = keystoreProperties["keyAlias"] as String
            keyPassword = keystoreProperties["password"] as String
            storeFile = file(keystoreProperties["storeFile"] as String)
            storePassword = keystoreProperties["password"] as String
        }
    }
    buildTypes {
        getByName("debug") {
            manifestPlaceholders["usesCleartextTraffic"] = "true"
            isDebuggable = true
            isJniDebuggable = true
            isMinifyEnabled = false
            packaging {                jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so")
                jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so")
                jniLibs.keepDebugSymbols.add("*/x86/*.so")
                jniLibs.keepDebugSymbols.add("*/x86_64/*.so")
            }
        }
        getByName("release") {
            signingConfig = signingConfigs.getByName("release")
        }
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    buildFeatures {
        buildConfig = true
    }
}

rust {
    rootDirRel = "../../../"
}

dependencies {
    implementation("androidx.webkit:webkit:1.6.1")
    implementation("androidx.appcompat:appcompat:1.6.1")
    implementation("com.google.android.material:material:1.8.0")
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.4")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0")
}

apply(from = "tauri.build.gradle.kts")

ios

详情 参考 https://tauri.app/distribute/sign/ios/

{
  "ios": {
    "minimumSystemVersion": "ios version",
    "developmentTeam": "your team id",
  }
} 

安装到本地开发手机

打包发布到商店

整体开发体验

使用 Tauri 2.0 开发的应用, 如果是原生功能相关较少,大部分基于 Web 开发 整体体验还行, 如果涉及到原生功能, 则需要使用 Tauri 提供的插件 https://tauri.app/zh-cn/plugin/ , 对于插件不提供的功能还是需要通过安卓 或者 ios 来进行原生功能的开发. 这对于客户端不熟悉的开发者来说是比较困难, 由于 Tauri 2.0 刚推出不久, 相关文档也不是很详细, 相关解决方案也比较少, 需要自己去探索的内容较多

参考文档

Edit this page on GitHub