iOS-SDK

Swift, aan te roepen vanuit Objective-C. Geen afhankelijkheden. Met privacymanifest. Pro-abonnement en hoger.

Vereisten

  • iOS 13+.
  • Swift of Objective-C.
  • Een SDK-sleutel: open in het dashboard je app → Instellingen → SDK-sleutels → Nieuwe sleutel. Hij wordt maar één keer getoond, dus kopieer hem meteen.

Installeren

Kies in Xcode File → Add Package Dependencies…, plak het adres van de repository, kies Up to Next Major Version vanaf 0.3.3 en voeg de bibliotheek Unolink toe aan het target van je app.

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

Unolink installeer je met Swift Package Manager, niet met CocoaPods. Gebruikt je project CocoaPods voor andere bibliotheken en faalt pod install met een coderingsfout (Ruby 4, of een locale die niet UTF-8 is), voer het dan uit in UTF-8:

LANG=en_US.UTF-8 pod install

Configureren

Roep configure één keer aan, zo vroeg mogelijk: in de init() van je @main App, of in 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() } }
}

Een gecompileerde bibliotheek kan je buildinstellingen niet zien, dus geef debug: true zelf mee vanuit debugbuilds, zoals hierboven. Daarmee wordt de installatie als testapparaat gemarkeerd.

Objective-C:

@import Unolink;

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

Opties

OptieStandaardWat het doet
debugfalseMarkeert deze installatie als testapparaat. Dashboards verbergen testapparaten, tenzij Testapparaten meetellen aan staat.
logLevel.warnHoeveel er naar de Xcode-console gaat, met prefix [Unolink]: .none, .error, .warn, .info, .debug.
baseURLhttps://api.unolink.devDe SDK-API. Laat hem zoals hij is.
Unolink.configure(apiKey: "ulk_…", options: UnolinkOptions(logLevel: .debug, debug: true))

De sleutel is openbaar: hij zit in je app en kan alleen gegevens voor die ene app melden. Zie SDK-sleutels.

Funnelevents

Voeg één regel toe op elk moment dat ertoe doet. Dit worden de stappen in Funnel en Trajecten.

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+)

Zonder RevenueCat meld je proefperiodes en aankopen zelf. Het bedrag is een Decimal, dus prijzen worden nooit afgerond:

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")

Je eigen events krijgen een naam en tot 20 eigenschappen:

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];

De volledige lijst, met de namen die in het dashboard aankomen, staat in Events.

Gebruikers-ID en RevenueCat

Gebruik je RevenueCat, verbind het dan onder je app → Instellingen → RevenueCat. Roep daarna geen purchase of trialStarted aan: RevenueCat verstuurt zelf proefperiodes, aankopen, verlengingen, opzeggingen en terugbetalingen, en Unolink negeert aankoopaanroepen vanuit de app, zodat niets dubbel telt.

Om die aankopen aan de installatie te koppelen, meld je de eigen app-gebruikers-ID van RevenueCat. Met SDK 0.3.2 of nieuwer houdt één regel die actueel. Roep hem één keer aan bij de start, vóór of na configure:

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

Unolink leest de ID bij de start, telkens wanneer de app actief wordt en vóór elk event, en verstuurt hem alleen als hij is veranderd. Roep na Purchases.logIn en Purchases.logOut Unolink.revenueCatUserChanged() aan om de nieuwe ID meteen te versturen. Geef nil terug zolang RevenueCat niet is geconfigureerd: Purchases.shared daarvoor lezen laat de app stoppen.

Zonder dit (of vóór 0.3.2) roep je setUserId aan met de ID van RevenueCat na Purchases.configure, na elke Purchases.logIn en Purchases.logOut, en bij elke start. Gebruik het een of het ander, niet allebei:

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

Voor een gast is dat het anonieme ID van RevenueCat, dus een aankoop die vóór de aanmelding wordt gedaan, wordt meteen aan de installatie gekoppeld. Na logIn is het de ID van het account. Elke ID die een installatie heeft gemeld telt mee, dus de aankoop van de gast blijft gekoppeld. Zie Gasten en accounts.

Unolink slaat de ID zelf nooit op, alleen een eenrichtingshash die voor elk van je apps anders is.

Uitgestelde deep links zijn alleen voor Android. Apple geeft apps geen install referrer, dus je app kan niet te horen krijgen op welke link is getikt, en Unolink gebruikt nooit fingerprinting van apparaten om te gokken. Unolink.onDeferredDeepLink(_:) bestaat zodat code tussen platforms gedeeld kan worden, maar op iPhone wordt hij op dit moment niet aangeroepen.

In het dashboard worden iPhone-installaties gekoppeld aan de klik op de link waar ze vandaan kwamen, zonder fingerprinting. De koppeling wordt niet naar de app gestuurd. Zet het per app uit in de Instellingen van die app.

Je links sturen iPhone-bezoekers nog steeds direct naar de App Store en tellen hun klikken, en de SDK telt nog steeds elke installatie en elk event.

Andere aanroepen

AanroepWat het doet
Unolink.installIdDe willekeurige ID van deze installatie, of nil vóór configure. Hij identificeert geen persoon of apparaat.
Unolink.flush()Verstuurt events uit de wachtrij meteen. Normaal niet nodig.
Unolink.setEnabled(false)Zet tracking uit en verwijdert events uit de wachtrij, voor je opt-outinstelling. true zet het weer aan.

Hoe de SDK werkt

  • Eerste start: maakt een willekeurige installatie-ID aan in Application Support (uitgesloten van iCloud-back-ups, nooit de Keychain), dus een herinstallatie of een nieuwe telefoon is een nieuwe installatie.
  • Automatische events: first_open, session_start (bij het starten, of na 30 minuten op de achtergrond) en app_background. Ze zijn gratis.
  • Events worden op het apparaat bewaard (tot 1.000) en elke 15 seconden in batches verstuurd zolang de app actief is, en als hij naar de achtergrond gaat. Offline wachten ze en probeert de SDK het opnieuw.
  • Hij blokkeert nooit de main thread en gooit nooit een fout.

Testapparaten

Configureer met debug: true in debugbuilds, zoals hierboven. Hun gegevens zijn echt, maar verborgen tot je Testapparaten meetellen aanzet in Funnel en Trajecten. Meer in Testen.

Privacy

  • Geen IDFA, geen App Tracking Transparency-melding, geen fingerprinting.
  • Het meegeleverde privacymanifest geeft productinteractie (je events) en aankoopgeschiedenis (aankopen die je meldt) op, gebruikt voor analyse, niet gekoppeld aan identiteit, en geen tracking. Gebruik dezelfde antwoorden voor het privacylabel van je app in de App Store.
  • Een willekeurige installatie-ID, appversie, OS-versie, SDK-versie, telefoon of tablet, taal. Het land komt van de netwerkrand. IP-adressen worden nooit opgeslagen.
  • Zet nooit namen, e-mailadressen of andere persoonsgegevens in eigenschappen van events.

Problemen oplossen

  • Niets in het dashboard? Zet Testapparaten meetellen aan: debugbuilds met debug: true zijn standaard verborgen.
  • Nog steeds niets? Configureer met UnolinkOptions(logLevel: .debug, debug: true) en zoek in de Xcode-console naar [Unolink]. Een verkeerde of ingetrokken sleutel wordt als fout gelogd.
  • Sommige iPhone-installaties zonder link? Dat is normaal: niet elke iPhone-installatie kan aan een klik worden gekoppeld, en die staan op een eigen rij. Zie Deeplinks op iPhone.

Meer in Problemen oplossen.