모바일 개요
데스크톱 앱과 동일한 Go 코드베이스로 iOS 및 Android 앱 빌드
Wails v3는 데스크톱용으로 이미 작성한 것과 동일한 main.go 및 프런트엔드를 사용하여 iOS와 Android에서 실행됩니다. 별도의 모바일 프로젝트도, 코드 공유 브리지도, 재작성도 필요하지 않습니다. Go 바이너리가 모바일 대상으로 컴파일되고 네이티브 WebView가 기존 프런트엔드를 렌더링합니다.
WKWebView + UIKit 호스트. 사용자 지정 wails:// 스킴을 통해 애셋을 제공하므로 열린 포트가 없습니다. 전체 Xcode가 설치된 macOS가 필요합니다.
Android WebView + WebViewAssetLoader. Go는 NDK를 통해 libwails.so(으)로 컴파일됩니다. macOS, Linux 및 Windows에서 작동합니다.
실행 모습 살펴보기: Kitchen Sink 예제
무엇이 가능한지 이해하는 가장 좋은 방법은 하나의 코드베이스로 iOS, Android 및 데스크톱에서 동일하게 실행되는 단일 Wails 앱인 Kitchen Sink를 살펴보는 것입니다.
| 탭 | 플랫폼 | 표시하는 기능 |
|---|---|---|
| 바인딩 | 전체 | 값, 구조체 및 오류를 반환하는 JS → Go 서비스 호출 |
| 이벤트 | 전체 | Go → JS 시계, JS → Go → JS 핑퐁, OS 시스템 이벤트(배터리, 네트워크, 테마) |
| 대화 상자 | 전체 | 각 플랫폼의 네이티브 메시지 대화 상자 |
| 시스템 | 전체 | 클립보드, 화면 메트릭, 기기 정보 |
| 모바일 | iOS + Android | 공유 시트, 절전 방지, 손전등, 밝기, 생체 인증, 로컬 알림, 보안 저장소 |
| 하드웨어 | iOS + Android | 햅틱, 위치 정보, 가속도계, 근접 센서, 텍스트 음성 변환 |
| 네이티브 | iOS + Android | iOS: 햅틱 + WKWebView 토글 · Android: 진동 + 토스트 |
직접 실행하려면 다음과 같이 하세요.
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가 메시지 브리지를 자동으로 연결합니다. - 프로세스 내 애셋 제공 — 애셋은 localhost 서버가 아니라 Go 메모리에서 직접 제공됩니다. 열린 포트도, 루프백도, 추가 지연 시간도 없습니다.
플랫폼별 동작은 //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 | — |
| 토스트 메시지(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 레퍼런스입니다.