SDK iOS

Swift, utilisable depuis Objective-C. Aucune dépendance. Inclut un manifeste de confidentialité. Forfait Pro et plus.

Prérequis

  • iOS 13+.
  • Swift ou Objective-C.
  • Une clé SDK : dans le tableau de bord, ouvrez votre app → Paramètres → Clés SDK → Nouvelle clé. Elle n’est affichée qu’une fois, copiez-la à ce moment-là.

Installation

Dans Xcode, choisissez File → Add Package Dependencies…, collez l’adresse du dépôt, choisissez Up to Next Major Version à partir de 0.3.3, et ajoutez la bibliothèque Unolink à la cible de votre app.

https://github.com/unolink-dev/unolink-sdk

Unolink s’installe avec Swift Package Manager, pas avec CocoaPods. Si votre projet utilise aussi CocoaPods pour d’autres bibliothèques et que pod install échoue sur une erreur d’encodage (Ruby 4, ou une locale qui n’est pas en UTF-8), lancez-le en UTF-8 :

LANG=en_US.UTF-8 pod install

Configuration

Appelez configure une seule fois, le plus tôt possible : dans l’init() de votre App @main, ou dans application(_:didFinishLaunchingWithOptions:).

import Unolink

@main
struct MyApp: App {
    init() {
        #if DEBUG
        Unolink.configure(apiKey: "ulk_…", options: UnolinkOptions(debug: true))
        #else
        Unolink.configure(apiKey: "ulk_…")
        #endif
    }
    var body: some Scene { WindowGroup { ContentView() } }
}

Une bibliothèque compilée ne voit pas vos réglages de build, passez donc vous-même debug: true depuis les builds de debug, comme ci-dessus. Cela marque l’installation comme appareil de test.

Objective-C :

@import Unolink;

[Unolink configureWithApiKey:@"ulk_…" options:[UNLOptions new]];

Options

OptionPar défautCe qu’elle fait
debugfalseMarque cette installation comme appareil de test. Les tableaux de bord masquent les appareils de test sauf si Inclure les appareils de test est activé.
logLevel.warnLa quantité de logs envoyée vers la console Xcode, préfixe [Unolink] : .none, .error, .warn, .info, .debug.
baseURLhttps://api.unolink.devL’API du SDK. Laissez-la telle quelle.
Unolink.configure(apiKey: "ulk_…", options: UnolinkOptions(logLevel: .debug, debug: true))

La clé est publique : elle est livrée dans votre app et ne peut envoyer des données que pour cette app. Voir Clés SDK.

Événements d’entonnoir

Ajoutez une ligne à chaque moment qui compte. Elles deviennent les étapes de Entonnoir et Parcours.

Unolink.onboardingCompleted()                       // the last onboarding screen is done
Unolink.paywallViewed(placement: "onboarding")      // a paywall appeared; placement says which one
Unolink.paywallSkipped(placement: "onboarding")     // closed without buying
Unolink.signUp(method: "apple")                     // an account was created
Unolink.signUpSkipped()                             // went on as a guest (0.3.2+)

Sans RevenueCat, remontez vous-même les essais et les achats. Le montant est un Decimal, les prix ne sont donc jamais arrondis :

Unolink.trialStarted(productId: "pro_yearly")
Unolink.purchase(amount: product.price, currency: "USD", productId: product.id)
Unolink.purchaseCancelled(productId: product.id)    // closed the purchase sheet
Unolink.purchaseFailed(productId: product.id, reason: "payment_failed")

Vos propres événements prennent un nom et jusqu’à 20 propriétés :

Unolink.track("level_up", properties: ["level": 3])

Objective-C :

[Unolink paywallViewedWithPlacement:@"onboarding" properties:nil];
[Unolink purchaseWithAmount:[NSDecimalNumber decimalNumberWithString:@"49.99"] currency:@"USD" productId:nil properties:nil];

La liste complète, avec les noms qui arrivent dans le tableau de bord, se trouve dans Événements.

Identifiant utilisateur et RevenueCat

Si vous utilisez RevenueCat, connectez-le dans votre app → Paramètres → RevenueCat. N’appelez alors pas purchase ni trialStarted : RevenueCat envoie lui-même les essais, achats, renouvellements, annulations et remboursements, et Unolink ignore les appels d’achat de l’app pour que rien ne compte deux fois.

Pour relier ces achats à l’installation, signalez le propre identifiant utilisateur d’app de RevenueCat. Avec le SDK 0.3.2 ou plus récent, une seule ligne le tient à jour. Appelez-la une fois au lancement, avant ou après configure :

Unolink.connectRevenueCat { Purchases.isConfigured ? Purchases.shared.appUserID : nil }

Unolink lit l’identifiant au lancement, chaque fois que l’app devient active et avant chaque événement, et ne l’envoie que s’il a changé. Après Purchases.logIn et Purchases.logOut, appelez Unolink.revenueCatUserChanged() pour envoyer le nouvel identifiant tout de suite. Renvoyez nil tant que RevenueCat n’est pas configuré : lire Purchases.shared avant cela arrête l’app.

Sans elle (ou avant la 0.3.2), appelez setUserId avec l’identifiant de RevenueCat après Purchases.configure, après chaque Purchases.logIn et Purchases.logOut, et à chaque lancement. Utilisez l’un ou l’autre, pas les deux :

// after Purchases.configure, logIn and logOut, and on every launch
Unolink.setUserId(Purchases.shared.appUserID)

Pour un invité, c’est l’identifiant anonyme de RevenueCat, donc un achat fait avant l’inscription est relié à l’installation tout de suite. Après logIn, c’est l’identifiant du compte. Chaque identifiant signalé par une installation compte, donc l’achat de l’invité reste relié. Voir Invités et comptes.

Unolink ne stocke jamais l’identifiant lui-même, seulement un hachage à sens unique, différent pour chacune de vos apps.

Les liens profonds différés sont réservés à Android. Apple ne donne aux apps aucun referrer d’installation, donc votre app ne peut pas savoir sur quel lien on a appuyé, et Unolink ne fait jamais de fingerprinting des appareils pour deviner. Unolink.onDeferredDeepLink(_:) existe pour que le code puisse être partagé entre plateformes, mais sur iPhone il n’est pas appelé aujourd’hui.

Dans le tableau de bord, les installations iPhone sont associées au clic sur le lien dont elles proviennent, sans fingerprinting. L’association n’est pas envoyée à l’app. Désactivez-la pour chaque app dans ses Paramètres.

Vos liens envoient quand même les visiteurs iPhone directement vers l’App Store et comptent leurs clics, et le SDK compte toujours chaque installation et chaque événement.

Autres appels

AppelCe qu’il fait
Unolink.installIdL’identifiant d’installation aléatoire, ou nil avant configure. Il n’identifie aucune personne ni aucun appareil.
Unolink.flush()Envoie tout de suite les événements en file d’attente. Normalement inutile.
Unolink.setEnabled(false)Désactive le suivi et supprime les événements en file d’attente, pour votre réglage de désinscription. true le réactive.

Fonctionnement

  • Premier lancement : crée un identifiant d’installation aléatoire dans Application Support (exclu de la sauvegarde iCloud, jamais dans le trousseau), donc une réinstallation ou un nouveau téléphone est une nouvelle installation.
  • Événements automatiques : first_open, session_start (au lancement, ou après 30 minutes en arrière-plan) et app_background. Ils sont gratuits.
  • Les événements sont stockés sur l’appareil (jusqu’à 1 000) et envoyés par lots toutes les 15 secondes tant que l’app est active, ainsi que lorsqu’elle passe en arrière-plan. Hors ligne, ils attendent et réessaient.
  • Il ne bloque jamais le thread principal et ne lève jamais d’exception.

Appareils de test

Configurez avec debug: true dans les builds de debug, comme ci-dessus. Leurs données sont réelles mais masquées tant que vous n’activez pas Inclure les appareils de test dans Entonnoir et Parcours. Plus d’informations dans Tests.

Confidentialité

  • Pas d’IDFA, pas de demande App Tracking Transparency, pas de fingerprinting.
  • Le manifeste de confidentialité inclus déclare interactions avec le produit (vos événements) et historique d’achats (les achats que vous remontez), utilisés pour l’analyse, non liés à l’identité, et aucun suivi. Utilisez les mêmes réponses pour l’étiquette de confidentialité de votre App Store.
  • Un identifiant d’installation aléatoire, la version de l’app, la version de l’OS, la version du SDK, téléphone ou tablette, la langue. Le pays vient de la périphérie du réseau. Les adresses IP ne sont jamais stockées.
  • Ne mettez jamais de noms, d’e-mails ou d’autres données personnelles dans les propriétés des événements.

Dépannage

  • Rien dans le tableau de bord ? Activez Inclure les appareils de test : les builds de debug avec debug: true sont masqués par défaut.
  • Toujours rien ? Configurez avec UnolinkOptions(logLevel: .debug, debug: true) et cherchez [Unolink] dans la console Xcode. Une clé erronée ou révoquée est consignée comme erreur.
  • Certaines installations iPhone n’affichent aucun lien ? C’est normal : toutes les installations iPhone ne peuvent pas être associées à un clic, et celles-ci sont affichées sur leur propre ligne. Voir Deep links sur iPhone.

Plus d’informations dans Dépannage.