Panduan iOS
Referensi lengkap: opsi konfigurasi, tab native, toggle WKWebView, build perangkat, signing.
Panduan ini mengambil aplikasi Wails desktop standar dan menjalankannya di iOS Simulator atau Android Emulator. Anda tidak perlu mengubah kode Go. main.go yang sama di-build untuk semua target.
Waktu penyelesaian: 15–30 menit (sebagian besar adalah instalasi toolchain pada run pertama)
Jika belum punya, buat proyek baru:
wails3 init -n mymobileappcd mymobileappKonfirmasi aplikasi desktop bekerja terlebih dahulu:
wails3 devSetelah terbuka, tutup dan lanjutkan. Semua yang berjalan di desktop juga berjalan di mobile — Anda tidak perlu menyentuh main.go atau kode Go apa pun untuk panduan ini.
macOS (build iOS hanya di macOS)
Xcode lengkap — bukan hanya command-line tools. Instal dari App Store, lalu:
sudo xcode-select -s /Applications/Xcode.app/Contents/Developersudo xcodebuild -license acceptGo 1.25+ dan npm (sudah terinstal jika Anda menjalankan wails3 init)
Jalankan wails3 doctor untuk verifikasi — menampilkan SDK iOS yang ditemukan.
Luncurkan aplikasi
wails3 task ios:runItu saja — perintah ini build aplikasi, boot simulator jika belum berjalan, dan meluncurkannya.
Saat diluncurkan, aplikasi desktop Anda yang tidak dimodifikasi berjalan di iOS Simulator — main.go yang sama, frontend yang sama:

Stream log
Di terminal terpisah:
wails3 task ios:logs:devPerintah ini tail log simulator, difilter ke aplikasi Anda. Output fmt.Println dan log.Println muncul di sini.
Inspeksi WebView
Di Safari: Develop → Simulator → aplikasi Anda. Web Inspector lengkap bekerja — console, debugger, panel network, semuanya.
Buat perubahan
Edit file frontend apa pun (frontend/src/main.js, index.html, dll.) dan jalankan ulang wails3 task ios:run. Wails rebuild frontend dan relaunch aplikasi.
Untuk perubahan Go: juga jalankan ulang wails3 task ios:run. Rekompilasi Go bersifat incremental, jadi hanya paket yang berubah yang di-rebuild.
wails3 task ios:xcodePerintah ini membuka build/ios/ di Xcode. Anda dapat menggunakan Xcode untuk deployment perangkat, profiling lanjutan, atau mengelola provisioning profile. Wails meregenerasi proyek Xcode pada setiap build, jadi jangan modifikasi file yang di-generate secara langsung.
Anda membutuhkan Android SDK, NDK, dan JDK. Cara termudah adalah Android Studio, atau command-line tools:
Instal Android command-line tools
Unduh dari developer.android.com/studio#command-line-tools-only, unzip ke ~/android-sdk/cmdline-tools/latest/.
Instal komponen SDK
sdkmanager "platform-tools" \ "platforms;android-34" \ "build-tools;34.0.0" \ "ndk;26.3.11579264" \ "emulator" \ "system-images;android-34;google_apis;arm64-v8a"Buat emulator
avdmanager create avd \ --name wails \ --package "system-images;android-34;google_apis;arm64-v8a" \ --device pixel_7Atur variabel lingkungan
Tambahkan ke ~/.zshrc atau ~/.bashrc:
export ANDROID_HOME=~/android-sdkexport ANDROID_SDK_ROOT=~/android-sdkexport PATH=$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/cmdline-tools/latest/binReload: source ~/.zshrc
Instal JDK
# macOSbrew install openjdk@21export JAVA_HOME=$(brew --prefix openjdk@21)
# Ubuntu/Debiansudo apt install openjdk-21-jdkexport JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
# Windows (scoop)scoop install openjdk21Jalankan wails3 doctor untuk konfirmasi semuanya ditemukan.
Luncurkan aplikasi
wails3 task android:runPada run pertama ini:
libwails.so via cross-compiler NDKStream log
Di terminal terpisah:
wails3 task android:logsPerintah ini menjalankan adb logcat difilter ke aplikasi Anda. Output fmt.Println muncul di sini.
Inspeksi WebView
Buka Chrome dan navigasi ke chrome://inspect. WebView aplikasi Anda muncul di bawah Remote Target — klik inspect untuk membuka DevTools.
Buat perubahan
Edit file apa pun dan jalankan ulang wails3 task android:run. Build incremental Gradle berarti hanya kode yang berubah yang dikompilasi ulang.
main.go Anda tidak berubah sama sekali. Wails menangani semuanya:
Taskfile.yml di proyek Anda berisi task ios:* dan android:* yang menggerakkan toolchain spesifik platform.GOOS=ios atau GOOS=android dengan GOARCH dan sysroot yang sesuai.frontend/dist/ disematkan ke binary Go dan disajikan in-process. Tidak perlu server localhost.Aplikasi Anda sudah bekerja, tetapi terlihat seperti aplikasi desktop di layar ponsel. Beberapa perubahan kecil membuat perbedaan besar.
Layar mobile lebih sempit dan menggunakan pola input berbeda. Di frontend/public/style.css (atau setara):
/* Prevent horizontal scrolling */body { overflow-x: hidden;}
/* Touch-friendly tap targets */button { min-height: 44px; min-width: 44px;}
/* Respect the iOS safe area (notch, home indicator) */body { padding-top: env(safe-area-inset-top); padding-bottom: env(safe-area-inset-bottom); padding-left: env(safe-area-inset-left); padding-right: env(safe-area-inset-right);}Gunakan build tag untuk menambahkan perilaku spesifik platform tanpa mengacaukan kode bersama.
Buat mobile_ios.go untuk kode khusus iOS:
//go:build ios
package main
import "github.com/wailsapp/wails/v3/pkg/application"
func platformOptions() application.IOSOptions { return application.IOSOptions{ DisableBounce: true, }}Buat mobile_android.go untuk kode khusus Android:
//go:build android
package main
import "github.com/wailsapp/wails/v3/pkg/application"
func platformOptions() application.AndroidOptions { return application.AndroidOptions{}}Buat mobile_desktop.go sebagai stub agar kode bersama dikompilasi di desktop juga:
//go:build !ios && !android
package main
type mobileOptions struct{}
func platformOptions() mobileOptions { return mobileOptions{} }Objek runtime IOS.* dan Android.* hanya ada di platform masing-masing. Memanggilnya di desktop akan throw. Pola yang benar — digunakan oleh Kitchen Sink — adalah mendeteksi platform sekali dan menyembunyikan kontrol khusus mobile sepenuhnya:
// Detect platform from the bridge the host injects into the WebViewconst platform = (() => { if (typeof window.wails?.platform === 'function') return window.wails.platform(); // Android if (window.webkit?.messageHandlers?.external) return 'ios'; return 'desktop';})();
const isIOS = platform === 'ios';const isAndroid = platform === 'android';const isMobile = isIOS || isAndroid;
// Hide any element marked as mobile-onlydocument.querySelectorAll('.mobile-only').forEach(el => { el.style.display = isMobile ? '' : 'none';});Kemudian di HTML Anda:
<section class="mobile-only"> <button id="btnHaptic">Haptic feedback</button></section>Dengan cara ini tombol khusus mobile tidak pernah dirender di desktop, dan Anda tidak perlu guard setiap panggilan individual dengan pengecekan if (isMobile).
Di sisi Go, pasangkan ini dengan stub build-tag agar event handler hanya didaftarkan di platform yang membutuhkannya:
//go:build !ios && !android
package main
import "github.com/wailsapp/wails/v3/pkg/application"
// No-op on desktop — mobile tabs are hidden in the frontend so these// events are never emitted.func registerNativeFeatures(app *application.App) {}//go:build ios
package main
import "github.com/wailsapp/wails/v3/pkg/application"
func registerNativeFeatures(app *application.App) { app.Event.On("common:haptic", func(e *application.CustomEvent) { // only compiled and called on iOS application.IOS.Haptic("medium") }) // ... other handlers}Ini adalah pola persis yang digunakan Kitchen Sink — lihat native_features_stub.go, native_features_ios.go, dan native_features_android.go.
import { IOS } from '@wailsio/runtime';
async function onButtonTap() { if (isIOS) { await IOS.Haptics.Impact({ style: 'medium' }); } // ... rest of your handler}import { Android } from '@wailsio/runtime';
async function onButtonTap() { if (isAndroid) { await Android.Haptics.Vibrate(50); // 50ms }}Build simulator (untuk testing di simulator, tidak perlu signing):
wails3 task ios:packagewails3 task ios:deploy-simulatorBuild perangkat (membutuhkan signing identity dan provisioning profile):
wails3 task ios:package \ IOS_PLATFORM=device \ CODESIGN_IDENTITY="Apple Development: You (TEAMID)" \ PROVISIONING_PROFILE=path/to/profile.mobileprovision
wails3 task ios:deploy-device # installs via xcrun devicectlIPA distribusi (untuk App Store atau TestFlight):
wails3 task ios:package:ipa IOS_PLATFORM=device \ CODESIGN_IDENTITY="..." \ PROVISIONING_PROFILE=path/to/distribution.mobileprovisionDebug APK (ditandatangani dengan keystore debug Android, instal langsung):
wails3 task android:packagewails3 task android:deploy-emulatorRelease APK (ditandatangani dengan keystore sendiri):
ANDROID_KEYSTORE_FILE=/path/to/release.jks \ANDROID_KEYSTORE_PASSWORD=yourpassword \ANDROID_KEY_ALIAS=youralias \ANDROID_KEY_PASSWORD=yourkeypassword \ wails3 task android:packageUniversal APK (arm64 + x86_64 dalam satu file):
wails3 task android:package:fatwails3 task ios:run gagal dengan “no iOS SDKs found”Xcode lengkap harus terinstal dan dipilih:
sudo xcode-select -s /Applications/Xcode.app/Contents/Developerxcode-select -p # should print the Xcode pathwails3 task android:run gagal dengan “SDK not found”Pastikan ANDROID_HOME diatur dan diekspor. Verifikasi dengan:
echo $ANDROID_HOMEls $ANDROID_HOME/platform-tools/adbDaftar simulator yang tersedia dan boot satu secara manual:
xcrun simctl list devices availablexcrun simctl boot "iPhone 16"chrome://inspect tidak menampilkan targetWebView harus dalam mode debug (default untuk android:run). Pastikan Anda menjalankan debug build, bukan production. Juga konfirmasi adb devices menampilkan emulator terhubung.
Pastikan HTML Anda menyertakan meta tag viewport:
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">Setelah aplikasi pertama berjalan, contoh Kitchen Sink adalah cara tercepat mempelajari apa lagi yang mungkin. Ini adalah aplikasi Wails lengkap yang berjalan di iOS, Android, dan desktop dari satu codebase, mencakup haptics, geolocation, biometrics, notifikasi lokal, secure storage, dan lainnya:
git clone https://github.com/wailsapp/wails.gitcd wails/v3/examples/mobile
wails3 task ios:run # iOS Simulatorwails3 task android:run # Android Emulatorwails3 task run # DesktopJelajahi source di v3/examples/mobile — file native_features_ios.go dan native_features_android.go sangat berguna sebagai starting point copy-paste untuk fitur spesifik platform.
Panduan iOS
Referensi lengkap: opsi konfigurasi, tab native, toggle WKWebView, build perangkat, signing.
Panduan Android
Referensi lengkap: konfigurasi, toast, packaging Play Store, detail NDK.
Source Kitchen Sink
Haptics, geolocation, biometrics, notifications, secure storage — semua dalam satu aplikasi yang dapat dijalankan.