Installer le SDK
Quatre chemins selon ta stack. Dans tous les cas, tu installes AppwinCore plus le ou les modules produit voulus : Core porte l'identité d'appareil, la session et le client réseau, les produits n'en sont que des consommateurs.
| Produit | iOS (SPM) | Android (Maven) | React Native | Flutter |
|---|---|---|---|---|
| Core | produit AppwinCore | io.appwin:appwin-core | @appwin/react-native | appwin_core |
| Support | produit AppwinSupport | io.appwin:appwin-support | idem | appwin_support |
| Community | produit AppwinCommunity | io.appwin:appwin-community | idem | appwin_community |
| Notifications | produit AppwinNotifications | io.appwin:appwin-notifications | idem | via appwin_support |
Core s'installe partout sauf en React Native, où le paquet unique expose déjà les quatre produits et où il n'y a rien à ajouter.
Côté iOS, les quatre sont des produits d'un seul paquet : tu ajoutes une
URL, puis tu coches ce que tu importes. C'est le fonctionnement de
firebase-ios-sdk.
Les modules d'une même plateforme sont livrés ensemble et partagent une version : ne les désaligne pas, les combinaisons croisées ne sont pas testées.
| Version minimale | |
|---|---|
| iOS | 16.0, Xcode 16 (les paquets sont en Swift 6) |
| Android | 7.0 (API 24), JDK 17 |
| React Native | 0.73 |
| Flutter | 3.3, Dart 3.9.2 |
Ajouter les dépendances
Installe AppwinCore, puis le ou les modules produit voulus. Même règle en
Swift, en Kotlin et en Dart. React Native est la seule exception : un paquet
unique y expose les quatre produits, il n'y a rien à décomposer.
Techniquement, chaque module produit déclare déjà Core et te le rend
accessible : tu pourrais l'omettre. Déclare-le quand même. Tu appelles
AppwinCore.configure dans ton propre code, donc c'est une dépendance directe
de ton app, pas un détail d'implémentation d'un produit. Tu vois sa version dans
ton build, et rien ne casse le jour où un produit change sa façon de l'exposer.
C'est le modèle Firebase : firebase_core s'installe explicitement à côté de
firebase_auth, pour la même raison.
Swift Package Manager
Depuis Xcode : File → Add Package Dependencies, colle l'URL ci-dessous, puis coche les produits voulus dans la liste qu'il affiche.
https://github.com/appwin-dev/appwin-ios
Ou en déclaratif, dans ton Package.swift :
dependencies: [
.package(url: "https://github.com/appwin-dev/appwin-ios.git", from: "0.1.0"),
],
targets: [
.target(name: "MonApp", dependencies: [
.product(name: "AppwinCore", package: "appwin-ios"),
// + le produit voulu : AppwinSupport, AppwinCommunity, AppwinNotifications
.product(name: "AppwinSupport", package: "appwin-ios"),
]),
]
Une seule URL pour les quatre produits : tu n'as ni quatre dépendances à ajouter, ni quatre versions à garder alignées.
Le produit lie déjà AppwinCore, donc import AppwinCore compilerait sans la
première ligne. Elle est là parce que tu appelles configure : un import
transitif casserait si un produit cessait un jour de dépendre de Core.
SPM uniquement : c'est le gestionnaire de dépendances d'Apple, intégré à
Xcode, et il ne demande ni fichier de configuration à part ni étape
d'installation manuelle. Aucun Podfile à toucher.
iOS 16 minimum, et Xcode 16 : les paquets sont déclarés en Swift 6. Le SDK est bâti sur SwiftUI et async/await, une cible plus basse ne compile pas.
Initialiser
Un seul appel, au démarrage, avant tout usage d'un produit. Il est idempotent : le rappeler ne casse rien, mais ne sert à rien non plus.
Dans ton AppDelegate ou au démarrage de la scène :
import AppwinCore
AppwinCore.configure(projectAppId: "ton-app-id")
configure est synchrone : il prépare l'identité d'appareil et le client
réseau immédiatement, puis ouvre la session en tâche de fond. Ton app continue
de démarrer pendant ce temps.
Si un appel doit impérativement disposer d'une session ouverte :
try await AppwinCore.bootstrapSession()
4. Initialiser chaque produit
configure prépare la fondation et ne vérifie rien. Chaque produit a ensuite
son initialize(), qui demande au serveur s'il a le droit de s'ouvrir.
Appelle-le avant d'afficher le point d'entrée de ce produit, et conditionne ton
interface sur la réponse : le SDK ne peut pas masquer ton onglet ni ton bouton,
il ne possède pas ta navigation.
let support = await AppwinSupport.initialize()
print("Appwin Support: \(support)")
Il répond au lieu de lever une erreur, parce qu'« pas d'accès » est une issue normale d'un lancement normal. Les trois produits partagent un aller-retour et le verdict est mis en cache sur disque : hors ligne, on retombe sur la dernière réponse connue plutôt que de fermer un produit que tu paies.
Le tableau complet des résultats est dans le quickstart. :::
L'environnement visé
Par défaut le SDK parle à https://api.appwin.io. Tu n'as rien à configurer :
ton App ID suffit à router les requêtes vers ton projet.
Le paramètre baseUrl de configure existe pour les cas où nous te donnons un
autre point d'entrée, un environnement de recette par exemple. En dehors de ça,
laisse-le vide.
Vérifier que ça marche
try await AppwinCore.bootstrapSession()
print(AppwinCore.deviceId ?? "configure pas appelé")
Un identifiant d'appareil non nul et un bootstrap qui ne lève pas : le socle est en place, tu peux brancher un produit.
Ça ne marche pas
| Symptôme | Cause probable |
|---|---|
| Erreur « pas configuré » au premier appel | configure pas appelé, ou appelé après l'usage d'un produit |
| 401 intermittents au démarrage | Deux configure avec des App ID différents dans la même app |
| 403 sur tous les appels | Produit pas activé sur l'App ID - active-le depuis le dashboard |
| Écran « bientôt disponible » | Le produit est éteint côté studio |
L'utilisateur reste anonyme après identify | Bootstrap pas rejoué : utilise le login du produit |
| Compilation iOS échoue | Cible de déploiement sous iOS 16, ou Xcode antérieur à 16 |
| Compilation Android échoue | minSdk sous 24, ou JDK antérieur à 17 |
| Module natif introuvable en React Native | Build pas relancé après l'installation, ou app lancée dans Expo Go |
Suite
- Quickstart - l'enchaînement complet, jusqu'à un écran affiché
- Identité - anonyme, connecté, partagé entre produits
- Community - afficher le fil