Flutter AppsFlyer Tutorial | Deep Linking & Analytics Integration

Flutter Appsflyer

Flutter Appsflyer, a way to get ahead with deeplinking and analytics as well in our previous blogs on deeplinking we  have discussed various integrations like app referrals, one signal, firebase and now appsflyer.

In this blog we will drive through the appsflyer integrations on both android and iOS, adding test devices and later implementing analytics, deeplinks.

You can find a series of tutorials categorising each task at our official youtube channel

Here you can find relevant code for the tutorials and will be updated accordingly

 

info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

....

    <key>AppleAppID</key>
    <string>YOUR_APPLE_APP_ID_HERE</string>

    <key>NSUserTrackingUsageDescription</key>
    <string>This identifier will be used to deliver personalized ads</string>
</dict>
</plist>

 

pubspec.yaml :

Here you can find following three dependencies

For..

Appsflyer integration in flutter app – appsflyer_sdk

Getting Device info (IDFV) for flutter i..e, android, iOS and more  – device_info_plus

Requesting ATT for iOS – app_tracking_transparency

 

dependencies:
  flutter:
    sdk: flutter

 ....
  appsflyer_sdk: ^6.15.2
  device_info_plus: ^11.3.0
  app_tracking_transparency: ^2.0.6+1

 

 

main.dart :

import 'package:app_tracking_transparency/app_tracking_transparency.dart';
import 'package:appsflyer_sdk/appsflyer_sdk.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/material.dart';

void main(){
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  late AppsflyerSdk appsflyerSdk;

  @override
  void initState() {
    super.initState();
    appsflyerSdk = AppsflyerSdk(
      AppsFlyerOptions(
        afDevKey: "dTUckosyNHAywNJJXAgNvH",
        appId: "",
        showDebug: true,
        timeToWaitForATTUserAuthorization: 0
      )
    );

    appsflyerSdk.initSdk();

    //getIDFV();

    requestAtt();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text("Live Template"),
        ),
        body: Center(
          child: TextButton(
            onPressed: (){},
            child: const Text("Submit"),
          ),
        ),
      ),
    );
  }

  void getIDFV() async {
    final deviceInfo = DeviceInfoPlugin();
    final iosInfo = await deviceInfo.iosInfo;
    final idfv = iosInfo.identifierForVendor;
    print("IDFV : $idfv");
  }

  void requestAtt() async {
    final status = await
        AppTrackingTransparency.trackingAuthorizationStatus;

    if(status== TrackingStatus.notDetermined){
      await AppTrackingTransparency.requestTrackingAuthorization();
    }
    getIDFA();
  }

  void getIDFA() async {
    final status = await
        AppTrackingTransparency.trackingAuthorizationStatus;
    if(status == TrackingStatus.authorized){
      final idfa = await
          AppTrackingTransparency.getAdvertisingIdentifier();
      print("IDFA : $idfa");
    }else{
      print("Tracking not authorized : $status");
    }

  }
}

 

 

If you have ay query’s just let me know in comment section below or in tutorial page on youtube.

Show Buttons
Hide Buttons
Read previous post:
sonarbanner
Mastering Sonar from Scratch: A Beginner’s Guide

Introduction : Why Sonar ? Sonar (SonarQube & SonarCloud) helps developers identify and fix code issues before they become critical....

Close