Apps
Flutter
Analytics für Flutter-Apps und -Games auf Android, iOS, macOS, Windows, Linux und Web. Einzige Abhängigkeit — das http-Paket.
Überblick
- Keine Geräte-Kennungen, keine Werbe-IDs, kein Gerätemodell, kein Fingerprinting.
- Nichts wird auf das Gerät geschrieben (keine shared_preferences, keine Dateien). Events und Session-ID liegen nur im Arbeitsspeicher.
- Gebündelte Übertragung mit automatischer Wiederholung und neutralem
User-Agent: trackd-flutter/<version>.
Voraussetzungen: Flutter 3.10+ (Dart 3.0+).
Installation
Das pub.dev-Paket folgt. Bis dahin:
- Lade
trackd.dartherunter und lege sie unterlib/trackd.dartab. - Füge die einzige Abhängigkeit hinzu:
flutter pub add http. - Importiere sie relativ:
import 'trackd.dart';.
# pubspec.yaml — trackd.dart braucht nur das http-Paket
dependencies:
http: ^1.2.0
Plattform-Einrichtung — nicht überspringen
Android: Release-Builds brauchen die Internet-Berechtigung in android/app/src/main/AndroidManifest.xml — Flutter fügt sie nur den Debug- und Profile-Manifesten hinzu:
<uses-permission android:name="android.permission.INTERNET" />
macOS: Füge das Entitlement in macos/Runner/DebugProfile.entitlements und Release.entitlements hinzu:
<key>com.apple.security.network.client</key>
<true/>
iOS, Windows, Linux: nichts zu tun. Web: Requests tragen einen Origin-Header — die App muss unter der registrierten Domain laufen.
Einrichten
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'trackd.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
Trackd.init(
websiteId: 'YOUR_WEBSITE_ID',
appVersion: '1.2.0', // z. B. aus package_info_plus
debug: kDebugMode,
);
runApp(MaterialApp(
navigatorObservers: [TrackdNavigatorObserver()], // automatisches Screen-Tracking
routes: {'/': (_) => const HomePage(), '/settings': (_) => const SettingsPage()},
));
}
platform, screen, language und device werden aus der Flutter-Engine ermittelt; du kannst jeden Wert in init überschreiben.
API
Trackd.screen('Home'); // Screen-View (Alias: screenView)
Trackd.screen('Settings/Profile', title: 'Profile');
Trackd.event('signup', {'plan': 'pro', 'trial': true});
Trackd.revenue(4.99, currency: 'EUR', orderId: 'order-123'); // → Event "purchase"
await Trackd.flush();
Trackd.setEnabled(false); // Opt-out: stoppen + Warteschlange leeren
// Hilfsmethoden für Games & Medien
Trackd.gameStart(level: 1, mode: 'hard');
Trackd.levelComplete(5, score: 1200, timeMs: 45000);
Trackd.gameOver(3, reason: 'fell');
Trackd.videoWatch('intro', durationMs: 30000, completed: true);
Trackd.adView('rewarded', adId: 'ad-1');
Trackd.tutorialStep(2, 5, skipped: false);
Event-Daten müssen flach sein (String, num, bool); das JSON ist auf 4 KB begrenzt.
Screen-Tracking
TrackdNavigatorObserver trackt jede benannte Route bei push, replace und pop (Dialoge und Bottom Sheets werden ignoriert). Routen mit Parametern bildest du auf generische Namen ab — nie Nutzerdaten senden:
TrackdNavigatorObserver(
nameExtractor: (settings) => settings.name?.replaceAll(RegExp(r'/\d+'), '/:id'),
)
go_router: GoRouter(observers: [TrackdNavigatorObserver()], …) und gib deinen GoRoutes einen name. Ohne benannte Routen trackst du manuell in initState mit Trackd.screen('Checkout').
Store-Angaben
Google Play: App-Aktivität → App-Interaktionen + Standort → Ungefährer Standort, Analytics, nicht weitergegeben, keine Geräte-IDs. App Store: Produktinteraktion + Grober Standort, nicht verknüpft, kein Tracking (Einträge in das PrivacyInfo.xcprivacy deiner iOS-App übernehmen).
Lebenszyklus, Batching, Sessions
- Ein
WidgetsBindingObserversendet die Warteschlange, wenn die App pausiert/versteckt wird, und startet eine neue Session nach 30 Minuten im Hintergrund. - Senden bei 20 Events, 30 s nach einem Event und bei
flush(); max. 50 Events / 60 KB pro Request, max. 500 in der Warteschlange. - Netzwerkfehler,
5xx,408,429→ exponentielles Backoff (1 s … 5 min); derselbe Batch wird mit derselbenbatch_iderneut gesendet.
In wenigen Minuten startklar
Kostenloses Konto erstellen, Website oder App hinzufügen, Snippet kopieren.