📱

RustとTauri 2.0 をさわってみた Part.2 ~Android/iOSでサンプルアプリを起動する~

2024/12/15に公開
2

RustとTauriに触ってみる記事のPart2です。
前回の記事ではRustとTauriの環境構築を実施し、初期プロジェクトを開発サーバーで起動するところまで確認しました。今回はモバイルアプリとしてAndroid/iOSそれぞれでTauriを起動してみます。

サンプルアプリをAndroid/iOSで起動する

前提

Android/iOSそれぞれで事前準備が必要です。下記のページを参考に、足りていないものはインストールして用意しましょう。
Tauri 2.0 | Configure for Mobile Targets

Android編

実行環境さえ揃っていれば2つのコマンドでアプリが起動できそうです。

cargo tauri android init
cargo tauri android dev

しかし筆者はここでかなり躓きました…
序盤はJavaのバージョンなど前提条件でうまく動かないエラーが発生していました(この辺りはエラーログで丁寧に教えてくれます)が、それらを解決しても、
アプリ起動直後に大量のエラーログ発生→すぐにアプリが落ちる
という事象が発生してしまいました。

実際のエラーログ(一部)

--------- beginning of crash
12-15 19:37:35.217 12372 12431 F libc    : Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 12431 (ample.sampleapp), pid 12372 (ample.sampleapp)
12-15 19:37:35.218 12372 12430 I RustStdoutStderr: thread '<unnamed>' panicked at src/lib.rs:13:10:
12-15 19:37:35.218 12372 12430 I RustStdoutStderr: error while running tauri application: PluginInitialization("opener", "jni error: Java exception was thrown")
12-15 19:37:35.218 12372 12430 I RustStdoutStderr: note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
12-15 19:37:35.218 12372 12430 I RustStdoutStderr: attempt to unwind out of `rust` with err: Any { .. }
12-15 19:37:35.223 12372 12372 E AndroidRuntime: FATAL EXCEPTION: main
12-15 19:37:35.223 12372 12372 E AndroidRuntime: Process: com.example.sampleapp, PID: 12372
12-15 19:37:35.223 12372 12372 E AndroidRuntime: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
12-15 19:37:35.223 12372 12372 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:590)
12-15 19:37:35.223 12372 12372 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886)
12-15 19:37:35.223 12372 12372 E AndroidRuntime: Caused by: java.lang.reflect.InvocationTargetException
12-15 19:37:35.223 12372 12372 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
12-15 19:37:35.223 12372 12372 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
12-15 19:37:35.223 12372 12372 E AndroidRuntime:        ... 1 more
...

エラーログを確認のうえ、悪さをしているプラグイン(tauri_plugin_opener)を./src-tauri/src/lib.rsからコメントアウトすることでアプリが起動できることを確認しました。
※Tauri/Androidを理解できていない&今後の開発で困りそうな気もしていますが、だいぶ苦戦&疲弊したので今回はライトな暫定対応として記録しておきます。

./src-tauri/src/lib.rs

// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello, {}! You've been greeted from Rust!", name)
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        // .plugin(tauri_plugin_opener::init()) //この行をコメントアウト
        .invoke_handler(tauri::generate_handler![greet])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

ちなみに対象のプラグインページでもiOS/Androidのサポートが?になっていました。この辺りは時間が解決するかもしれませんが、どのみちまだまだ知識不足なので、そのうち適切な解決策を検討します。
※iOSはこのプラグインありでも起動しました。

iOS編

Androidと同じく実行環境が揃っていれば2つのコマンドでアプリが起動できそうです。

cargo tauri ios init
cargo tauri ios dev

こちらも私は一度躓きましたが、cargo tauri ios initで生成される./src-tauri/gen/apple/[アプリ名].xcodeprojをXcodeで開くことでXcodeからシミュレータをインストールし、アプリが起動できました。

まとめ

今回はサンプルアプリをiOS/Androidそれぞれのモバイルアプリとして起動するところまで進めました。
本当はサクッとモバイルアプリを動かして、中身のコードを触ってTauriとRustと仲良くなる予定でしたが、モバイルアプリを動かす部分で思ったより苦戦してしまいました。
次は中身のコードを見ながら色々試してみたいと思います。

参考

公式ドキュメントをはじめ、詰まったところで参考にしました。感謝します。

Accenture Japan (有志)

Discussion

kanaruskanarus

typo

エラーログを確認のうえ、悪さをしているプラグイン(auri_plugin_opener)を

tauri_plugin_opener