Loslegen

iOS SDK

Swift, aus Objective-C aufrufbar. Keine Abhängigkeiten. Mit Privacy Manifest. Ab dem Pro-Tarif.

Voraussetzungen

  • iOS 13+.
  • Swift oder Objective-C.
  • Ein SDK-Schlüssel: Öffne im Dashboard deine App → Einstellungen → SDK-Schlüssel → Neuer Schlüssel. Er wird nur einmal angezeigt, kopiere ihn also gleich.

Installieren

Wähle in Xcode File → Add Package Dependencies…, füge die Repository-Adresse ein, wähle Up to Next Major Version ab 0.3.3 und füge die Bibliothek Unolink zu deinem App-Target hinzu.

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

Unolink wird mit dem Swift Package Manager installiert, nicht mit CocoaPods. Wenn dein Projekt CocoaPods für andere Bibliotheken nutzt und pod install mit einem Encoding-Fehler abbricht (Ruby 4 oder eine Locale ohne UTF-8), führe es in UTF-8 aus:

LANG=en_US.UTF-8 pod install

Konfigurieren

Ruf configure einmal auf, so früh wie möglich: im init() deiner @main-App oder 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() } }
}

Eine kompilierte Bibliothek sieht deine Build-Einstellungen nicht, also übergib debug: true in Debug-Builds selbst, wie oben. Das markiert die Installation als Testgerät.

Objective-C:

@import Unolink;

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

Optionen

OptionStandardWas sie macht
debugfalseMarkiert diese Installation als Testgerät. Dashboards blenden Testgeräte aus, solange Testgeräte einbeziehen nicht aktiv ist.
logLevel.warnWie viel in der Xcode-Konsole landet, Präfix [Unolink]: .none, .error, .warn, .info, .debug.
baseURLhttps://api.unolink.devDie SDK-API. Lass sie, wie sie ist.
Unolink.configure(apiKey: "ulk_…", options: UnolinkOptions(logLevel: .debug, debug: true))

Der Schlüssel ist öffentlich: Er wird mit deiner App ausgeliefert und kann nur Daten für genau diese eine App melden. Siehe SDK-Schlüssel.

Funnel-Events

Füge an jedem wichtigen Moment eine Zeile hinzu. Daraus werden die Schritte in Funnel und Journeys.

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

Ohne RevenueCat meldest du Testphasen und Käufe selbst. Der Betrag ist ein Decimal, Preise werden also nie gerundet:

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

Eigene Events nehmen einen Namen und bis zu 20 Eigenschaften:

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

Die vollständige Liste mit den Namen, die im Dashboard ankommen, findest du unter Events.

Nutzer-ID und RevenueCat

Wenn du RevenueCat nutzt, verbinde es unter deiner App → Einstellungen → RevenueCat. Ruf dann nicht purchase oder trialStarted auf: RevenueCat sendet Testphasen, Käufe, Verlängerungen, Kündigungen und Erstattungen selbst, und Unolink ignoriert Kaufaufrufe aus der App, damit nichts doppelt zählt.

Um diese Käufe mit der Installation zu verknüpfen, melde RevenueCats eigene App-User-ID. Ab SDK 0.3.2 hält eine Zeile sie aktuell. Ruf sie einmal beim Start auf, vor oder nach configure:

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

Unolink liest die ID beim Start, jedes Mal, wenn die App aktiv wird, und vor jedem Event, und sendet sie nur, wenn sie sich geändert hat. Ruf nach Purchases.logIn und Purchases.logOut Unolink.revenueCatUserChanged() auf, um die neue ID sofort zu senden. Gib nil zurück, solange RevenueCat nicht konfiguriert ist: Liest du Purchases.shared vorher, stürzt die App ab.

Ohne sie (oder vor 0.3.2) ruf setUserId mit RevenueCats ID auf, nach Purchases.configure, nach jedem Purchases.logIn und Purchases.logOut, und bei jedem Start. Nutze das eine oder das andere, nicht beides:

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

Für einen Gast ist das RevenueCats anonyme ID, sodass ein Kauf, der vor der Registrierung gemacht wird, sofort mit der Installation verknüpft wird. Nach logIn ist es die ID des Kontos. Jede ID, die eine Installation gemeldet hat, zählt, sodass der Kauf des Gasts verknüpft bleibt. Siehe Gäste und Konten.

Unolink speichert die ID selbst nie, nur einen Einweg-Hash, der für jede deiner Apps anders ist.

Deferred Deep Links gibt es nur unter Android. Apple gibt Apps keinen Install-Referrer, daher kann deine App nicht erfahren, welcher Link angetippt wurde, und Unolink erstellt nie Fingerprints von Geräten, um zu raten. Unolink.onDeferredDeepLink(_:) gibt es, damit Code plattformübergreifend geteilt werden kann, aber auf dem iPhone wird es derzeit nicht aufgerufen.

Im Dashboard werden iPhone-Installationen dem Link-Klick zugeordnet, von dem sie kamen, ohne Fingerprinting. Die Zuordnung wird nicht an die App gesendet. Du kannst sie pro App in ihren Einstellungen ausschalten.

Deine Links schicken iPhone-Besucher trotzdem direkt in den App Store und zählen ihre Klicks, und das SDK zählt weiterhin jede Installation und jedes Event.

Weitere Aufrufe

AufrufWas er macht
Unolink.installIdDie zufällige ID dieser Installation, oder nil vor configure. Sie identifiziert keine Person und kein Gerät.
Unolink.flush()Sendet Events aus der Warteschlange sofort. Normalerweise nicht nötig.
Unolink.setEnabled(false)Schaltet das Tracking aus und löscht Events aus der Warteschlange, für deine Opt-out-Einstellung. true schaltet es wieder ein.

Wie es sich verhält

  • Erster Start: erstellt eine zufällige Installations-ID in Application Support (vom iCloud-Backup ausgenommen, nie im Schlüsselbund), sodass eine Neuinstallation oder ein neues Smartphone eine neue Installation ist.
  • Automatische Events: first_open, session_start (beim Start oder nach 30 Minuten im Hintergrund) und app_background. Sie sind kostenlos.
  • Events werden auf dem Gerät gespeichert (bis zu 1.000) und alle 15 Sekunden gebündelt gesendet, solange die App aktiv ist, und wenn sie in den Hintergrund geht. Offline warten sie und werden erneut versucht.
  • Es blockiert nie den Main-Thread und wirft nie Exceptions.

Testgeräte

Konfiguriere in Debug-Builds mit debug: true, wie oben. Ihre Daten sind echt, aber ausgeblendet, bis du Testgeräte einbeziehen in Funnel und Journeys aktivierst. Mehr unter Testen.

Datenschutz

  • Keine IDFA, keine Abfrage für App Tracking Transparency, kein Fingerprinting.
  • Das mitgelieferte Privacy Manifest deklariert Produktinteraktion (deine Events) und Kaufverlauf (Käufe, die du meldest), genutzt für Analysen, nicht mit der Identität verknüpft, und kein Tracking. Nutze dieselben Antworten für das Datenschutzetikett im App Store.
  • Eine zufällige Installations-ID, App-Version, OS-Version, SDK-Version, Smartphone oder Tablet, Sprache. Das Land kommt vom Netzwerk-Edge. IP-Adressen werden nie gespeichert.
  • Pack nie Namen, E-Mail-Adressen oder andere personenbezogene Daten in Event-Eigenschaften.

Fehlerbehebung

  • Nichts im Dashboard? Aktiviere Testgeräte einbeziehen: Debug-Builds mit debug: true sind standardmäßig ausgeblendet.
  • Immer noch nichts? Konfiguriere mit UnolinkOptions(logLevel: .debug, debug: true) und such in der Xcode-Konsole nach [Unolink]. Ein falscher oder widerrufener Schlüssel wird als Fehler geloggt.
  • Manche iPhone-Installationen zeigen keinen Link? Das ist so zu erwarten: Nicht jede iPhone-Installation lässt sich einem Klick zuordnen, und diese stehen in einer eigenen Zeile. Siehe Deeplinks auf dem iPhone.

Mehr unter Fehlerbehebung.