行動平台概覽
使用與桌面應用程式相同的 Go 程式碼庫建置 iOS 和 Android 應用程式
Wails v3 可在iOS 和 Android上執行,並使用您已為桌面平台編寫的相同main.go和前端。不需要獨立的行動版專案、程式碼共享橋接器,也不必重寫:Go 二進位檔會針對行動平台目標進行編譯,並由原生 WebView 呈現現有前端。
WKWebView + UIKit 主機。資源透過自訂wails://網址協定提供,無須開放連接埠。 需要具備完整 Xcode 的macOS。
Android WebView + WebViewAssetLoader。Go 透過 NDK 編譯為libwails.so。 可在 macOS、Linux 和 Windows 上運作。
實際執行:Kitchen Sink 範例
若要了解可實現哪些功能,最佳方式是查看Kitchen Sink。這是單一 Wails 應用程式,只使用一套程式碼庫,就能在 iOS、Android 和桌面平台上以相同方式執行:
| 分頁 | 平台 | 展示內容 |
|---|---|---|
| 繫結 | 全部 | JS → Go 服務呼叫,並傳回值、結構和錯誤 |
| 事件 | 全部 | Go → JS 時鐘、JS → Go → JS ping/pong、作業系統事件(電池、網路、佈景主題) |
| 對話方塊 | 全部 | 各平台的原生訊息對話方塊 |
| 系統 | 全部 | 剪貼簿、螢幕度量資訊、裝置資訊 |
| 行動裝置 | iOS + Android | 分享面板、防止休眠、手電筒、亮度、生物辨識、本機通知、安全儲存空間 |
| 硬體 | iOS + Android | 觸覺回饋、地理位置、加速度計、接近感測、文字轉語音 |
| 原生功能 | iOS + Android | iOS:觸覺回饋 + WKWebView 切換功能 · Android:震動 + Toast 訊息 |
若要自行執行:
git clone https://github.com/wailsapp/wails.git
cd wails/v3/examples/mobile
wails3 task ios:run # iOS Simulator (macOS + Xcode required)
wails3 task android:run # Android Emulator
wails3 task run # Desktop
運作方式
每個平台都採用相同的應用程式模型:
- Go 後端:您的服務、事件處理常式和應用程式邏輯不需變更,即可針對
GOOS=ios和GOOS=android進行編譯。 - 前端:使用完全相同的 HTML/JS/CSS。
@wailsio/runtime套件的運作方式完全相同;服務繫結、事件、對話方塊和剪貼簿都透過相同的程序內傳輸進行路由。 - WebView 主機:在 iOS 上,是位於
UIViewController內的WKWebView;在 Android 上,則是位於Activity內的WebView。Wails 會自動設定訊息橋接器。 - 程序內資源提供:資源直接從 Go 記憶體提供,而非透過 localhost 伺服器。不開放連接埠、不使用迴送,也不會增加額外延遲。
平台特定行為位於受//go:build ios或//go:build android保護的檔案中,讓共用程式碼保持整潔。
必要條件一覽
| 需求 | iOS | Android |
|---|---|---|
| 作業系統 | 僅限 macOS | macOS、Linux、Windows |
| 工具鏈 | 完整的 Xcode(不能只有 CLI 工具) | Android SDK + NDK 26.3.x + JDK |
| Go | 1.25+ | 1.25+ |
| npm | ✅ | ✅ |
| 驗證方式 | wails3 doctor |
wails3 doctor |
支援的功能
兩個平台具備相同的核心功能集:
| 功能 | iOS | Android |
|---|---|---|
| 服務繫結(JS → Go) | ✅ | ✅ |
| 事件(雙向) | ✅ | ✅ |
| 訊息對話方塊 | ✅ UIAlertController | ✅ AlertDialog |
| 開啟檔案對話方塊 | ✅ UIDocumentPicker | ✅ Storage Access Framework |
| 儲存檔案對話方塊 | ❌ 改為寫入沙箱 | ❌ 改為寫入沙箱 |
| 剪貼簿 | ✅ UIPasteboard | ✅ ClipboardManager |
| 螢幕/安全區域度量 | ✅ | ✅ |
| 生命週期事件 | ✅ events.IOS.* |
✅ events.Android.* |
| 觸覺回饋 | ✅ IOS.Haptics.* |
✅ Android.Haptics.Vibrate |
| 裝置資訊 | ✅ IOS.Device.Info() |
✅ Android.Device.Info() |
| 原生分頁(iOS) | ✅ UITabBar | — |
| Toast 訊息(Android) | — | ✅ Android.Toast.Show |
| 多個視窗 | ❌ 僅限第一個視窗 | ❌ 僅限第一個視窗 |
| 視窗幾何資訊/選單/系統匣 | 刻意不執行任何操作 | 刻意不執行任何操作 |
建置標籤規則
撰寫依平台條件執行的程式碼時,請注意兩項重要規則:
ios隱含darwin——標記為//go:build darwin的檔案也會針對 iOS 編譯。若要僅以 macOS 為目標,請使用//go:build darwin && !ios。android隱含linux——標記為//go:build linux的檔案也會針對 Android 編譯。若要僅以桌面版 Linux 為目標,請使用//go:build linux && !android。
在執行階段,runtime.GOOS會分別傳回"ios"和"android"。
執行階段平台偵測
建置標籤適用於只能在特定平台上編譯的程式碼。若要在共用程式碼中進行一般的 條件分支,請使用application.System——每種建置都可使用它 (不需要建置標籤),因此同一個檔案可在所有平台上運作:
import "github.com/wailsapp/wails/v3/pkg/application"
if application.System.IsMobile() {
// iOS or Android
} else if application.System.IsDesktop() {
// macOS, Windows or Linux
}
// Or test a single target directly:
if application.System.IsPlatform(application.PlatformIOS) {
// iOS only
}可用項目:IsMobile()、IsDesktop()、IsServer()(server建置標籤),以及 IsPlatform(application.PlatformMacOS | PlatformWindows | PlatformLinux | PlatformIOS | PlatformAndroid | PlatformServer)。
前端在@wailsio/runtime中提供了相對應的輔助函式:
import { System } from "@wailsio/runtime";
if (System.IsMobile()) { /* iOS or Android */ }
if (System.IsIOS()) { /* … */ } // also IsAndroid, IsMac, IsWindows, IsLinux, IsDesktop後續步驟
只需幾分鐘,即可將桌面版 Wails 應用程式移至 iOS Simulator 或 Android Emulator 上執行。
完整說明 iOS 工具鏈設定、模擬器、裝置建置、簽署、組態與 API 參考資料。
完整說明 Android SDK/NDK 設定、模擬器、APK 簽署、Play Store 封裝與 API 參考資料。