先日、「Vue.js と Tauri で家計簿アプリ:一応できた」、とゴキゲンだったわけですが、まだ落とし穴が待っていました。うちでは古い macOS 10.14 が現役なのですが、こちらで動かないのです。Dock で一瞬アイコンがバウンドするんだけど、すぐに消えてしまう。コンソールを見ると、こんなエラーメッセージが出ていました。
Symbol not found: _NSHTTPCookieSameSiteLax
Referenced from: /Users/USER/Desktop/tauri-app.app/Contents/MacOS/tauri-app
Expected in: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
in /Users/USER/Desktop/tauri-app.app/Contents/MacOS/tauri-app
Foundation framework のドキュメントによると、NSHTTPCookieSameSiteLax は macOS 10.15 を要するそうです。あかんやん。

でも、Tauri アプリって 10.13 以上で動くって言ってなかったっけ??

Tauri v2 ドキュメントより引用
tauri.conf.json に minimumSystemVersion: 10.13 を指定してもだめ。実は wry パッケージのバグであるようです。
GitHub
[bug] macOS 10.13 compatibility dyld: Symbol not found: _NSHTTPCookieSameSiteLax · Issue #14201 · tauri-apps/tauri
Describe the bug Using macOS "minimumSystemVersion": "10.13" in tauri.conf.json. App works ok on macOS 10.15+, but on macOS 10.13 got error: dyld: Symbol not found: _NSHTTPCookieSameSiteLax Referen...
上記 Issue のツリーの中に解決策がありました。以下の記述を Cargo.toml に追加すればいいそうです。
[patch.crates-io]
wry = { git = "https://github.com/tauri-apps/wry", branch = "fix/macos/symbol-not-found-1013" }
一応立ち上がります。けど、画面が真っ白なまま、先に進めない。だめじゃん。

もっと大きな問題がありました。そもそも macOS 10.13-10.15 では、window.print が実装されていないそうです。印刷ができない、ということです。これじゃ使えないな。

The Tauri Documentation WIP より引用
対策をいろいろ考えました。そんなに複雑なアプリではないので、全部 wxWidgets で書き直すかな……とも思ったのですが、GUI を全部コーディングし直すのはかなり大変です。Vue.js で書いたフロントエンドを生かして、バックエンドだけ書けばいいんじゃないか。要は、HTTP サーバを実装して、何らかのメッセージ機構で Tauri の機能を置き換えればいけそうです。使っている Tauri の機能はファイルシステム関連だけなので、実装自体は難しくないでしょう。
アイデアは下の通りです。
- 空いているポートを使って HTTP サーバを立ち上げる。
- 同じポートを使ってブラウザで localhost にアクセスする。
- ファイルシステムへのアクセスが必要になったら、
http://127.0.0.1:ポート番号/@vueRunner/ という URL に POST リクエストを送り、コマンド名と引数を JSON 文字列で渡す。
- HTTP サーバ側で、受け取った POST リクエストの中身を JSON として読み出し、必要な処理を行って、結果を文字列で返す。
正月休みに頑張って実装しました。HTTP サーバとして、"cpp-httplib" を使います。
GitHub
GitHub - yhirose/cpp-httplib: A C++ header-only HTTP/HTTPS server and client library
A C++ header-only HTTP/HTTPS server and client library - yhirose/cpp-httplib
データの受け渡しに JSON を使うため、JSON ライブラリが必要です。"nlohmann JSON library for C++" を使います。
GitHub
GitHub - nlohmann/json: JSON for Modern C++
JSON for Modern C++. Contribute to nlohmann/json development by creating an account on GitHub.
サーバプロセス側はファイルシステムへのアクセス権を持っているので、本来はセキュリティを厳しく制御する必要があります。私はまだ勉強不足で、うまい対策を見つけられていません。今回の実装では、HTTP サーバとブラウザのそれぞれに同一のランダム文字列を渡しておき、POST リクエストの中にその文字列を含ませて、サーバプロセスとブラウザプロセスを1対1で対応づけています。とりあえず家の中で使うだけなので、これでいいとは思いますが、このまま世に出すのは危険かもしれません。
相当の紆余曲折の末、なんとか動くものができました。

Tauri はとても魅力的なフレームワークですが、まだ本格導入には時期尚早かなあ、と感じました。もちろん、10.14 なんて古い OS を使っているのが悪いのですが、ローカルで古い OS を使っているケースは、現実世界ではそう珍しいものではありません(このあたり、最先端のソフトウェアエンジニアとは感覚が乖離しているかもしれない)。また、Rust コンパイラがビルド時に大量のディスクを消費するのも気になります(このプロジェクトで 3.5 GB 消費します)。しばらくは封印かな、と思っています。