Flutter SDK

Flutter SDK є основною реалізацією середовища виконання Attriax і найкращим місцем для початку роботи, коли вам потрібна першокласна мобільна атрибуція, глибокі посилання та відстеження життєвого циклу.

Поверхня пакету

Загальний посібник для attriax_flutter. Використовуйте робочий простір проєкту, коли вам потрібні детальні кроки налаштування, контекст релізу та значення, специфічні для проєкту.

Для чого команди це використовують

Це завдання середовища виконання, які продукт вже надає через SDK та відповідні інструменти робочого простору.

Середовище виконання, орієнтоване на мобільні пристрої

Розроблено для атрибуції відкриття застосунку, обробки реферера встановлення, відкладених глибоких посилань та маршрутизації всередині застосунку.

Операційна прозорість

Поєднує відстеження під час виконання з аналітикою, збоями, діагностикою та помічниками конфіденційності в одному робочому просторі.

Підходить для команд з активним випуском

Використовуйте одну поверхню інтеграції, поки робочий простір обробляє специфічну для платформи діагностику та кроки перегляду.

Примітки щодо інтеграції

Тримайте публічну документацію легкою, а потім відкривайте робочий простір проєкту, коли вам потрібні точні кроки налаштування для вашого власного потоку релізів.

Можливості

  • Ініціалізуйте один екземпляр SDK для всього застосунку і тримайте відстеження навігації близько до середовища виконання.
  • Зачекайте на початкове глибоке посилання, обробляйте відкладені глибокі посилання та підписуйтесь на події, що вирішуються після запуску.
  • Перевіряйте інформацію про реферера встановлення на Android, коли вона доступна.
  • Вмикайте доставку з урахуванням GDPR за допомогою gdprEnabled та використовуйте attriax.consent.gdpr для стану GDPR, перевірок та записів згоди.
  • Завантажуйте керовані через панель правила SKAdNetwork під час відкриття застосунку та оцінюйте локальні сигнали утримання, покупки, доходу та показу реклами на платформах Apple.
  • Відстежуйте перегляди сторінок, кастомні події, збої, рекламні зворотні виклики, доходи, ідентичність та потоки мобільних токенів через зосереджені фасади, такі як attriax.tracking, attriax.deepLinks та attriax.consent.

Примітки

  • Flutter є еталонним середовищем виконання для спільної поведінки продукту, тому це найпряміший шлях для нових мобільних інтеграцій.
  • Android та iOS є найсильнішими цільовими середовищами виконання. Пересилання на робочий стіл існує, але воно більш ручне і повинно бути перевірено за допомогою діагностики.
  • Використовуйте робочий простір проєкту, коли вам потрібна проєктна конфігурація, точні значення хоста та специфічний для платформи статус налаштування.
  • Не задавайте відображення SKAN жорстко в коді застосунку. Використовуйте локальну конфігурацію SKAN лише тоді, коли збірка повинна вимкнути локальні оновлення конверсій.

Встановлення

Використовуйте публікований пакет Flutter, а потім відкрийте робочий простір проєкту для детальної діагностики та конфігурації платформи.

Команда встановлення

flutter pub add attriax_flutter

Приклад

Фрагмент нижче відображає початкову точку робочого простору проєкту, зберігаючи посібник загальним замість проєктно-специфічного.

lib/main.dart

Ініціалізуйте один раз, зачекайте на SDK, підпишіться на глибокі посилання та направте вирішені шляхи до стека навігації Flutter.

1import 'dart:async';
2import 'package:flutter/material.dart';
3import 'package:attriax_flutter/attriax.dart';
4
5// Create one SDK instance for the whole application.
6final Attriax attriax = Attriax(
7  config: const AttriaxConfig(
8    projectToken: 'ax_your_project_token',
9    gdprEnabled: true,
10  ),
11);
12
13final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
14
15Future<void> main() async {
16  WidgetsFlutterBinding.ensureInitialized();
17
18  // Wait for the SDK before the UI starts.
19  await attriax.init();
20
21  // Use the GDPR helper from your privacy UI or settings screen when needed.
22  // final needsConsent = await attriax.consent.gdpr.needsConsent(localOnly: true);
23
24  runApp(const MyApp());
25}
26
27class MyApp extends StatelessWidget {
28  const MyApp({super.key});
29
30  
31  Widget build(BuildContext context) {
32    return MaterialApp(
33      navigatorKey: navigatorKey,
34      navigatorObservers: <NavigatorObserver>[
35        // This tracks page changes for normal Flutter navigation.
36        AttriaxNavigationObserver(attriax: attriax),
37      ],
38      routes: <String, WidgetBuilder>{
39        '/': (_) => const HomeScreen(),
40        '/promo': (_) => const PromoScreen(),
41        '/deep-link': (_) => const DeepLinkScreen(),
42      },
43    );
44  }
45}
46
47class HomeScreen extends StatefulWidget {
48  const HomeScreen({super.key});
49
50  
51  State<HomeScreen> createState() => _HomeScreenState();
52}
53
54class _HomeScreenState extends State<HomeScreen> {
55  StreamSubscription<AttriaxDeepLinkEvent>? _deepLinkSubscription;
56
57  
58  void initState() {
59    super.initState();
60
61    // Listen for deep links that resolve after startup.
62    _deepLinkSubscription = attriax.deepLinks.stream.listen(_handleDeepLinkEvent);
63
64    // Load startup attribution without blocking the first frame.
65    unawaited(_loadStartupAttribution());
66  }
67
68  
69  void dispose() {
70    unawaited(_deepLinkSubscription?.cancel() ?? Future<void>.value());
71    super.dispose();
72  }
73
74  Future<void> _loadStartupAttribution() async {
75    final initialDeepLinkEvent = await attriax.deepLinks.waitForInitialDeepLink();
76    final originalInstallReferrer = await attriax.referrer
77        .getOriginalInstallReferrer();
78    final reinstallReferrer = await attriax.referrer
79        .getReinstallReferrer();
80
81    if (!mounted) {
82      return;
83    }
84
85    if (originalInstallReferrer != null) {
86      debugPrint(
87        'Original install referrer: ${originalInstallReferrer.campaign}',
88      );
89    }
90
91    if (reinstallReferrer != null) {
92      debugPrint('Reinstall referrer: ${reinstallReferrer.campaign}');
93    }
94
95    if (initialDeepLinkEvent?.found == true) {
96      _openDeepLink(initialDeepLinkEvent!);
97    }
98  }
99
100  void _handleDeepLinkEvent(AttriaxDeepLinkEvent event) {
101    if (!mounted || !event.found) {
102      return;
103    }
104
105    _openDeepLink(event);
106  }
107
108  void _openDeepLink(AttriaxDeepLinkEvent event) {
109    final attriaxPath = event.uri.path.replaceFirst(RegExp(r'^/+'), '');
110    final routeName = attriaxPath.startsWith('promo/')
111        ? '/promo'
112        : '/deep-link';
113
114    navigatorKey.currentState?.pushNamed(routeName, arguments: event);
115  }
116
117  
118  Widget build(BuildContext context) {
119    return const Scaffold(body: Center(child: Text('Attriax ready')));
120  }
121}
122
123class PromoScreen extends StatelessWidget {
124  const PromoScreen({super.key});
125
126  
127  Widget build(BuildContext context) {
128    return const Scaffold(body: Center(child: Text('Promo screen')));
129  }
130}
131class DeepLinkScreen extends StatelessWidget {
132  const DeepLinkScreen({super.key});
133
134  
135  Widget build(BuildContext context) {
136    return const Scaffold(body: Center(child: Text('Deep link screen')));
137  }
138}