Flutter
Het pakket unolink is een dunne laag over de native SDK's voor iOS en Android, die erin zitten. Er zijn geen
andere permissies dan internet nodig en geen Info.plist-items. Gepubliceerd op pub.dev door unolink.dev. Pro-abonnement en hoger.
Vereisten
- Flutter 3.22+ (Dart 3.4+).
- Android 6.0+ (
minSdk 23) en iOS 13+. - 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
flutter pub add unolink
Dat voegt unolink: ^0.3.3 toe aan pubspec.yaml en haalt het pakket op. Bouw de app daarna opnieuw; een hot reload is niet genoeg
nadat je native code hebt toegevoegd.
Faalt CocoaPods in de iOS-build met een coderingsfout (Ruby 4, of een locale die niet UTF-8 is), voer het dan zelf uit in UTF-8 en bouw opnieuw:
cd ios && LANG=en_US.UTF-8 pod install
Configureren
Roep configure één keer aan in main(), na WidgetsFlutterBinding.ensureInitialized() en vóór runApp:
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:unolink/unolink.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Unolink.configure('ulk_…', debug: kDebugMode);
runApp(const MyApp());
}
Opties
| Optie | Standaard | Wat het doet |
|---|---|---|
debug | false | Markeert deze installatie als testapparaat. Geef kDebugMode mee. Dashboards verbergen testapparaten, tenzij Testapparaten meetellen aan staat. |
logLevel | UnolinkLogLevel.warn | Hoeveel er naar de Xcode-console of Logcat gaat (tag Unolink): none, error, warn, info, debug. |
baseUrl | https://api.unolink.dev | De SDK-API. Laat hem zoals hij is. |
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 string, zodat het nooit wordt afgerond:
Unolink.trialStarted(productId: 'pro_yearly');
Unolink.purchase('49.99', 'USD', productId: 'pro_yearly');
Unolink.purchaseCancelled(productId: 'pro_yearly'); // closed the purchase sheet
Unolink.purchaseFailed(productId: 'pro_yearly', reason: 'payment_failed');
Je eigen events krijgen een naam en tot 20 eigenschappen:
Unolink.track('level_up', {'level': 3});
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.appUserID,
addListener: Purchases.addCustomerInfoUpdateListener,
removeListener: Purchases.removeCustomerInfoUpdateListener,
);
Unolink leest de ID zodra RevenueCat is geconfigureerd, bij elke update van de klantinfo (aankopen, logIn, logOut) en telkens
wanneer de app hervat, en verstuurt hem alleen als hij is veranderd. Is RevenueCat nog niet geconfigureerd, dan mislukt het lezen
stil en wordt het later opnieuw geprobeerd. Het geeft een functie terug die de verbinding verbreekt. Unolink.revenueCatUserChanged() is op Flutter dus normaal niet nodig.
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(await Purchases.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
Als iemand op Android installeert via een Unolink-link met een deeplink, draait de listener één keer, bij de eerste keer openen. Op iPhone wordt hij niet aangeroepen: Apple heeft geen install referrer, en Unolink gebruikt nooit fingerprinting.
Unolink.setDeferredDeepLinkListener((link) {
// link.deepLink: '/promo/3for2', link.params: {'offer': '3for2'}
// link.linkSlug: 'tiktok' or null, link.clickId: 'clk_01JA…'
if (link.deepLink != null) router.go(link.deepLink!);
Unolink.consumeDeferredDeepLink();
});
De listener wordt één keer per installatie aangeroepen. Een link die binnenkwam voordat je hem instelde, wordt afgeleverd zodra je hem instelt.
Open hem na de onboarding
De eerste keer openen begint meestal met de onboarding. Zit het scherm van de link achter de onboarding of het inloggen, open hem dan niet vanuit de listener. Lees de wachtende link zodra de onboarding (of het inloggen) klaar is, open hem en markeer hem daarna als gebruikt:
// when onboarding (or sign-in) is done, and on every launch after that until it's consumed
final link = await Unolink.getPendingDeferredDeepLink();
if (link?.deepLink != null) {
router.go(link!.deepLink!);
await Unolink.consumeDeferredDeepLink();
}
De link wacht tot je hem als gebruikt markeert, ook als de app intussen wordt gesloten (tot 30 dagen na de installatie;
0.3.3+). Een nieuwe gebruiker die halverwege de onboarding stopt, krijgt hem bij de volgende start toch, dus je hoeft hem
niet zelf op te slaan. Roep consumeDeferredDeepLink() aan zodra je hem hebt geopend: tot dan geeft
getPendingDeferredDeepLink() hem bij elke start terug. Vóór configure en tot Google Play heeft geantwoord is hij null, en op iPhone
altijd.
Stel de Deeplink en Parameters van de link in het dashboard in (Links → ⋯ → Bewerken). Hoe het werkt, staat in Uitgestelde deep links op Android.
Andere aanroepen
| Aanroep | Wat het doet |
|---|---|
await Unolink.getInstallId() | De willekeurige ID van deze installatie, of null 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. |
Testapparaten
Met debug: kDebugMode zijn debugbuilds testapparaten. Hun gegevens zijn echt, maar verborgen tot je Testapparaten
meetellen aanzet in Funnel en Trajecten. Meer in Testen.
Privacy
- Geen IDFA, geen Google Advertising ID, geen App Tracking Transparency-melding, geen fingerprinting.
- Een willekeurige installatie-ID, appversie, OS-versie, SDK-versie, telefoon of tablet, taal. Het land komt van de netwerkrand. IP-adressen worden nooit opgeslagen.
- Op iOS zit het privacymanifest van de native SDK in het pakket: analyse, niet gekoppeld aan identiteit.
- Zet nooit namen, e-mailadressen of andere persoonsgegevens in eigenschappen van events.
Problemen oplossen
- MissingPluginException? Stop de app en start hem opnieuw. Hot reload en hot restart laden geen nieuwe native code.
- Niets in het dashboard? Zet Testapparaten meetellen aan:
kDebugMode-builds zijn standaard verborgen. - Nog steeds niets? Configureer met
logLevel: UnolinkLogLevel.debugen zoek naarUnolinkin de Xcode-console of Logcat. Een verkeerde of ingetrokken sleutel wordt als fout gelogd.
Meer in Problemen oplossen.