Contribuer

Modifier cette documentation

Traduisez la documentation ou ouvrez le projet complet sur votre ordinateur.

Rien n’est publié tant que vous ne choisissez pas de soumettre votre travail.

Votre première application mobile

Exécutez votre application Wails dans le simulateur iOS ou l’émulateur Android en quelques minutes

Ce guide vous explique comment exécuter une application de bureau Wails standard dans le simulateur iOS ou l’émulateur Android. Vous n’avez pas besoin de modifier votre code Go. Le même main.go permet de créer l’application pour toutes les cibles.

Temps nécessaire : 15–30 minutes (principalement pour l’installation de la chaîne d’outils lors de la première exécution)

Partir d’un projet de bureau

Si vous n’en avez pas encore, créez un nouveau projet :

bash
wails3 init -n mymobileapp
cd mymobileapp

Vérifiez d’abord que l’application de bureau fonctionne :

bash
wails3 dev

Une fois qu’elle est ouverte, quittez-la et poursuivez. Tout ce qui fonctionne sur ordinateur fonctionne également sur mobile : pour suivre ce guide, vous n’aurez à modifier ni main.go ni aucun code Go.


Choisir votre plateforme

Prérequis

  • macOS (les builds iOS ne sont possibles que sous macOS)

  • La version complète de Xcode, et pas seulement les outils en ligne de commande. Installez-la depuis l’App Store, puis exécutez :

    bash
    sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
    sudo xcodebuild -license accept
    
  • Go 1.25+ et npm (déjà installés si vous avez exécuté wails3 init)

Exécutez wails3 doctor pour effectuer la vérification : cette commande répertorie les SDK iOS qu’elle trouve.

Exécuter dans le simulateur

1

Lancer l’application

bash
wails3 task ios:run

C’est tout : cette commande compile votre application, démarre un simulateur si aucun ne s’exécute déjà, puis lance l’application.

Après son lancement, votre application de bureau non modifiée s’exécute dans le simulateur iOS, avec le même main.go et le même frontend :

Une application Wails par défaut s’exécutant dans le simulateur iOS

2

Afficher les journaux en continu

Dans un autre terminal :

bash
wails3 task ios:logs:dev

Cette commande affiche en continu le journal du simulateur, filtré pour votre application. La sortie de fmt.Println et de log.Println apparaît ici.

3

Inspecter la WebView

Dans Safari, choisissez Développement → Simulateur → votre application. L’inspecteur web complet est disponible : console, débogueur, panneau Réseau, etc.

4

Apporter une modification

Modifiez n’importe quel fichier du frontend (frontend/src/main.js, index.html, etc.), puis réexécutez wails3 task ios:run. Wails recompile le frontend et relance l’application.

Après avoir modifié du code Go, réexécutez également wails3 task ios:run. La recompilation Go étant incrémentale, seuls les packages modifiés sont recompilés.

Ouvrir dans Xcode (facultatif)

bash
wails3 task ios:xcode

Cette commande ouvre build/ios/ dans Xcode. Vous pouvez utiliser Xcode pour déployer l’application sur un appareil, réaliser un profilage avancé ou gérer les profils d’approvisionnement. Wails régénère le projet Xcode à chaque build ; ne modifiez donc pas directement les fichiers générés.


Comprendre ce qui s’est passé

Votre main.go n’a absolument pas changé. Wails s’est chargé de tout :

  • Système de build — le fichier Taskfile.yml de votre projet contient les tâches ios:* et android:* qui pilotent la chaîne d’outils propre à chaque plateforme.
  • Compilation croisée de Go — GOOS=ios ou GOOS=android avec la valeur GOARCH et le sysroot appropriés.
  • Hôte natif — un projet Xcode généré (iOS) ou un projet Gradle (Android) qui intègre votre code Go compilé et héberge la WebView.
  • Mise à disposition des ressources — votre frontend/dist/ est intégré au binaire Go et servi dans le processus. Aucun serveur localhost n’est nécessaire.

Adaptez votre application aux appareils mobiles

Votre application fonctionne déjà, mais elle ressemble à une application de bureau sur l’écran d’un téléphone. Quelques petits changements feront toute la différence.

CSS adaptatif

Les écrans mobiles sont plus étroits et utilisent des modes de saisie différents. Dans frontend/public/style.css (ou son équivalent) :

css
/* 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);
}

Détecter la plateforme en Go

Utilisez des balises de build pour ajouter un comportement propre à chaque plateforme sans encombrer le code partagé.

Créez mobile_ios.go pour le code réservé à iOS :

mobile_ios.go
go
//go:build ios

package main

import "github.com/wailsapp/wails/v3/pkg/application"

func platformOptions() application.IOSOptions {
    return application.IOSOptions{
        DisableBounce: true,
    }
}

Créez mobile_android.go pour le code réservé à Android :

mobile_android.go
go
//go:build android

package main

import "github.com/wailsapp/wails/v3/pkg/application"

func platformOptions() application.AndroidOptions {
    return application.AndroidOptions{}
}

Créez mobile_desktop.go comme implémentation factice afin que le code partagé soit également compilé pour les plateformes de bureau :

mobile_desktop.go
go
//go:build !ios && !android

package main

type mobileOptions struct{}

func platformOptions() mobileOptions { return mobileOptions{} }

Détecter la plateforme en JavaScript et réserver l’interface mobile aux appareils mobiles

Les objets d’exécution IOS.* et Android.* n’existent que sur leur plateforme respective. Leur appel sur une plateforme de bureau déclenche une exception. La bonne approche, utilisée par Kitchen Sink, consiste à détecter la plateforme une seule fois et à masquer entièrement les contrôles réservés aux appareils mobiles :

javascript
// 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';
});

Puis, dans votre HTML :

html
<section class="mobile-only">
  <button id="btnHaptic">Haptic feedback</button>
</section>

Ainsi, les boutons réservés aux appareils mobiles ne sont jamais affichés sur les plateformes de bureau et vous n’avez pas besoin de protéger chaque appel par une vérification if (isMobile).

Côté Go, associez cette approche à une implémentation factice utilisant une balise de build, afin que les gestionnaires d’événements ne soient enregistrés que sur les plateformes qui en ont besoin :

native_desktop.go
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
//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
}

C’est exactement l’approche utilisée par Kitchen Sink : consultez native_features_stub.go, native_features_ios.go et native_features_android.go.

Ajouter un retour haptique (iOS)

javascript
import { IOS } from '@wailsio/runtime';

async function onButtonTap() {
  if (isIOS) {
    await IOS.Haptics.Impact({ style: 'medium' });
  }
  // ... rest of your handler
}

Ajouter des vibrations (Android)

javascript
import { Android } from '@wailsio/runtime';

async function onButtonTap() {
  if (isAndroid) {
    await Android.Haptics.Vibrate(50); // 50ms
  }
}

Compiler pour la production

Build pour simulateur (pour les tests sur simulateur, aucune signature nécessaire) :

bash
wails3 task ios:package
wails3 task ios:deploy-simulator

Build pour appareil (nécessite une identité de signature et un profil d’approvisionnement) :

bash
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 de distribution (pour l’App Store ou TestFlight) :

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

Résolution des problèmes

Échec de wails3 task ios:run avec « no iOS SDKs found »

La version complète de Xcode doit être installée et sélectionnée :

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

Échec de wails3 task android:run avec « SDK not found »

Vérifiez que ANDROID_HOME est défini et exporté. Effectuez la vérification avec :

bash
echo $ANDROID_HOME
ls $ANDROID_HOME/platform-tools/adb

Le simulateur ne démarre pas

Répertoriez les simulateurs disponibles et démarrez-en un manuellement :

bash
xcrun simctl list devices available
xcrun simctl boot "iPhone 16"

chrome://inspect n’affiche aucune cible

La WebView doit être en mode débogage (le mode par défaut pour android:run). Vérifiez que vous exécutez un build de débogage et non un build de production. Vérifiez également que adb devices indique que l’émulateur est connecté.

Les marges de la zone sûre ne sont pas appliquées

Vérifiez que votre HTML inclut la balise meta viewport :

html
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">

Explorer le Kitchen Sink

Une fois votre première application en cours d’exécution, l’exemple Kitchen Sink constitue le moyen le plus rapide de découvrir les autres possibilités. Il s’agit d’une application Wails complète qui s’exécute sur iOS, Android et les systèmes de bureau à partir d’une base de code unique. Elle couvre le retour haptique, la géolocalisation, la biométrie, les notifications locales, le stockage sécurisé et bien plus encore :

bash
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

Parcourez le code source à l’adresse v3/examples/mobile. Les fichiers native_features_ios.go et native_features_android.go sont particulièrement utiles comme points de départ à copier-coller pour les fonctionnalités propres à chaque plateforme.

Et ensuite ?

Guide iOS

Référence complète : options de configuration, onglets natifs, options de WKWebView, builds pour appareils et signature.

Guide iOS →

Guide Android

Référence complète : configuration, messages toast, création de paquets pour le Play Store et détails sur le NDK.

Guide Android →

Code source du Kitchen Sink

Retour haptique, géolocalisation, biométrie, notifications et stockage sécurisé — le tout dans une seule application exécutable.

Voir sur GitHub →

Modifier la page

Dernière mise à jour :