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.

ProduitiOS (SPM)Android (Maven)React NativeFlutter
Coreproduit AppwinCoreio.appwin:appwin-core@appwin/react-nativeappwin_core
Supportproduit AppwinSupportio.appwin:appwin-supportidemappwin_support
Communityproduit AppwinCommunityio.appwin:appwin-communityidemappwin_community
Notificationsproduit AppwinNotificationsio.appwin:appwin-notificationsidemvia 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
iOS16.0, Xcode 16 (les paquets sont en Swift 6)
Android7.0 (API 24), JDK 17
React Native0.73
Flutter3.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.

Texte brut
https://github.com/appwin-dev/appwin-ios

Ou en déclaratif, dans ton Package.swift :

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 :

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

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

swift
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

swift
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ômeCause probable
Erreur « pas configuré » au premier appelconfigure pas appelé, ou appelé après l'usage d'un produit
401 intermittents au démarrageDeux configure avec des App ID différents dans la même app
403 sur tous les appelsProduit 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 identifyBootstrap pas rejoué : utilise le login du produit
Compilation iOS échoueCible de déploiement sous iOS 16, ou Xcode antérieur à 16
Compilation Android échoueminSdk sous 24, ou JDK antérieur à 17
Module natif introuvable en React NativeBuild 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