iOS : ajouter Appwin à ton app

Comment ajouter Appwin à ton app iOS avec le paquet Swift.

Avant de commencer

Pas de commande d'installation sur iOS : dans Xcode, File → Add Package Dependencies, colle https://github.com/appwin-dev/appwin-ios, puis choisis Up to Next Major Version. Le paquet n'a aucune dépendance externe.

Compose ton intégration

Choisis les produits que tu veux. La liste de dépendances et le code d'initialisation suivent ton choix.

Compose ton intégration

AppwinCore est toujours là - il porte l'identité, la session et le client réseau. Choisis ce que tu ajoutes par-dessus.

AppwinCore

Utilise un prompt

Dépendances

swift
.package(url: "https://github.com/appwin-dev/appwin-ios", from: "0.4.0")

.target(name: "MyApp", dependencies: [
    .product(name: "AppwinCore", package: "Appwin"),
    .product(name: "AppwinCommunity", package: "Appwin"),
])

Initialisation

swift
import AppwinCore
import AppwinCommunity
import SwiftUI

@main
struct MyApp: App {
    init() {
        let appId = Bundle.main.object(forInfoDictionaryKey: "APPWIN_APP_ID") as? String
        AppwinCore.configure(projectAppId: appId ?? "")
    }

    var body: some Scene {
        WindowGroup { RootView() }
    }
}

struct RootView: View {
    var body: some View {
        MyTabs()
            .task {
                try? await AppwinCore.bootstrapSession()
                let community = await AppwinCommunity.initialize()
            }
    }
}
  • Chaque initialize() répond au lieu de lever une erreur. Conditionne ton propre point d'entrée à ce résultat : le SDK ne possède pas ta navigation, il ne peut pas cacher ton onglet à ta place.

Mets l'App ID dans Info.plist sous APPWIN_APP_ID, alimenté par un réglage de build, plutôt que de le coller dans tes sources : la valeur diffère entre ton projet de debug et celui que tu publies, et un littéral dans init est typiquement ce qui part sur l'App Store en pointant vers la mauvaise app.

xml
<key>APPWIN_APP_ID</key>
<string>$(APPWIN_APP_ID)</string>

Affiche-le à l'écran

initialize() dit si un produit a le droit de s'ouvrir. Où le poser, c'est à toi : le SDK ne possède pas ta navigation.

ProduitCe que tu poses
AppwinCommunityAppwinCommunity.communityView(), une vue à embarquer
AppwinSupportAppwinSupport.presentMessenger(), ou sa MessengerView
AppwinNotificationsPas d'UI - registerPushToken(...) au lancement
AppwinAnalyticsPas d'UI - trackEvent(...)
swift
if community == .ready {
    AppwinCommunity.communityView()
        .tabItem { Label("Communauté", systemImage: "bubble.left.and.bubble.right") }
}

Un produit refusé se plaint bruyamment en debug, discrètement en release, et retombe sur une vue neutre si tu le présentes quand même. Il ne plante jamais, et ne reste jamais silencieusement sans rien faire.

Rattache ton utilisateur

Facultatif, et c'est ce qui fait qu'une personne est la même dans Community et dans Support, et d'un appareil à l'autre. L'externalId est le tien - celui de ta base.

swift
AppwinCore.identify(externalId: user.id)
try await AppwinCore.bootstrapSession(externalId: user.id)

await AppwinCore.signOut()   // à la déconnexion

identify seul ne suffit pas : c'est le rejeu du bootstrap qui émet un token portant la nouvelle identité. Sans lui, les appels suivants restent sur la session anonyme jusqu'au prochain lancement.

Pour aller plus loin