Lewati ke konten

Aplikasi Mobile Pertama Anda

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:

Terminal window
wails3 init -n mymobileapp
cd mymobileapp

Konfirmasi aplikasi desktop bekerja terlebih dahulu:

Terminal window
wails3 dev

Setelah 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:

    Terminal window
    sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
    sudo xcodebuild -license accept
  • Go 1.25+ dan npm (sudah terinstal jika Anda menjalankan wails3 init)

Jalankan wails3 doctor untuk verifikasi — menampilkan SDK iOS yang ditemukan.

  1. Luncurkan aplikasi

    Terminal window
    wails3 task ios:run

    Itu 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:

    Aplikasi Wails default berjalan di iOS Simulator
  2. Stream log

    Di terminal terpisah:

    Terminal window
    wails3 task ios:logs:dev

    Perintah ini tail log simulator, difilter ke aplikasi Anda. Output fmt.Println dan log.Println muncul di sini.

  3. Inspeksi WebView

    Di Safari: Develop → Simulator → aplikasi Anda. Web Inspector lengkap bekerja — console, debugger, panel network, semuanya.

  4. 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.

Terminal window
wails3 task ios:xcode

Perintah 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.


main.go Anda tidak berubah sama sekali. Wails menangani semuanya:

  • Build systemTaskfile.yml di proyek Anda berisi task ios:* dan android:* yang menggerakkan toolchain spesifik platform.
  • Cross-compilation GoGOOS=ios atau GOOS=android dengan GOARCH dan sysroot yang sesuai.
  • Host native — proyek Xcode (iOS) atau Gradle (Android) yang di-generate yang menyematkan kode Go terkompilasi dan menghost WebView.
  • Penyajian asetfrontend/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:

mobile_ios.go
//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:

mobile_android.go
//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:

mobile_desktop.go
//go:build !ios && !android
package main
type mobileOptions struct{}
func platformOptions() mobileOptions { return mobileOptions{} }

Deteksi platform di JavaScript dan gate UI khusus mobile

Section titled “Deteksi platform di JavaScript dan gate UI khusus mobile”

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 WebView
const 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-only
document.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:

native_desktop.go
//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) {}
native_ios.go
//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):

Terminal window
wails3 task ios:package
wails3 task ios:deploy-simulator

Build perangkat (membutuhkan signing identity dan provisioning profile):

Terminal window
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 devicectl

IPA distribusi (untuk App Store atau TestFlight):

Terminal window
wails3 task ios:package:ipa IOS_PLATFORM=device \
CODESIGN_IDENTITY="..." \
PROVISIONING_PROFILE=path/to/distribution.mobileprovision

wails3 task ios:run gagal dengan “no iOS SDKs found”

Section titled “wails3 task ios:run gagal dengan “no iOS SDKs found””

Xcode lengkap harus terinstal dan dipilih:

Terminal window
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
xcode-select -p # should print the Xcode path

wails3 task android:run gagal dengan “SDK not found”

Section titled “wails3 task android:run gagal dengan “SDK not found””

Pastikan ANDROID_HOME diatur dan diekspor. Verifikasi dengan:

Terminal window
echo $ANDROID_HOME
ls $ANDROID_HOME/platform-tools/adb

Daftar simulator yang tersedia dan boot satu secara manual:

Terminal window
xcrun simctl list devices available
xcrun simctl boot "iPhone 16"

WebView 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:

Terminal window
git clone https://github.com/wailsapp/wails.git
cd wails/v3/examples/mobile
wails3 task ios:run # iOS Simulator
wails3 task android:run # Android Emulator
wails3 task run # Desktop

Jelajahi 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 iOS →

Panduan Android

Referensi lengkap: konfigurasi, toast, packaging Play Store, detail NDK.

Panduan Android →

Source Kitchen Sink

Haptics, geolocation, biometrics, notifications, secure storage — semua dalam satu aplikasi yang dapat dijalankan.

Lihat di GitHub →