- SDK Version: 6.1.1 (Release Notes)
- Versions obsolètes du SDK
Important !
La version 6 du SDK Android comporte des changements majeurs par rapport aux versions précédentes. Ceux-ci concernent les fonctionnalités et les API du SDK, notamment les éléments obsolètes et les changements de nom de méthode. Plus d'informations sur la migration à partir du SDK V5.x.
1. Aperçu
Le SDK Android AppsFlyer offre aux apps Android des fonctionnalités d'installation d'app et d'enregistrement d'événements. Le SDK peut être utilisé avec Java/Kotlin.
Intégrez le SDK dans votre app pour enregistrer les éléments suivants :
- Installations d'app
- Engagement d'utilisateur (ex : sessions et événements in-app)
1.1 Intégration du SDK - Ce qu'il faut faire
Onglet | Objectif | Après opération |
---|---|---|
Intégration du SDK (Obligatoire) |
Ajouter et configurer le SDK |
|
API principales (recommandées) |
Mesurer les évènements et les revenus in-app, activer le deep linking et regrouper des données de conversion |
|
API additionnelles |
Implémenter et utiliser les API facultatives. Par exemple pour la mesure des désinstallations et l'attribution des références. |
|
Document de référence des API de SDK |
1.2 Compatibilité du SDK avec les plates-formes Android
- Démarrer Android V4.0
- Plates-formes Android non mobiles telles que les téléviseurs intelligents, y compris Fire TV d'Amazon
- Marchés hors-store pour les apps Android, comme Amazon ou Baidu
Les sections suivantes décrivent comment implémenter et initialiser le SDK AppsFlyer. Une fois cette section terminée, deux installations apparaîtront sur votre tableau de bord AppsFlyer : organique et non organique.
2. Ajouter le SDK à votre app
2.1 Ajouter le SDK à votre projet
Utilisez l'une des méthodes suivantes pour ajouter le SDK à votre app :
- [Méthode conseillée] Utiliser Gradle
- Ajout manuel du SDK
- Ajoutez le code ci-dessous au niveau Module /app/build.gradle avant
dépendances
:repositories { mavenCentral() }
- Ajoutez la dernière version du SDK d'AppsFlyer en tant que dépendance. Vous pouvez trouver la dernière version ici.
dependencies { //make sure to use the latest SDK version: https://mvnrepository.com/artifact/com.appsflyer/af-android-sdk implementation 'com.appsflyer:af-android-sdk:6.0.0' }
- Synchronisez le projet pour récupérer les dépendances. Voir la capture d'écran suivante :
2.2 Ajout d'un référent d'installation Android à votre app
Le référent d'installation Android améliore la précision de l'attribution, protège contre les installations frauduleuses et bien plus encore. Il est pris en charge par le SDK Android AppsFlyer version 4.8.6.
Remarque
Google deprecated the BroadcastReceiver in March 2020.
- Cette modification n'affecte pas l'app.
- Le BroadcastReceiver peut malgré tout vous être encore utile pour l'attribution hors store. Renseignez-vous auprès du store dans lequel l'app est répertoriée pour vous en assurer.
- L'implémentation du référent d'installation est désormais obligatoire.
Il existe deux façons d'ajouter le référent d'installation à votre app :
- Utiliser Gradle (recommandé)
- Ajouter manuellement le référent d'installation
Ajoutez le référent d'installation Android en tant que dépendance. Vous pouvez trouver la dernière version ici.
-
dependencies { //make sure to use the latest SDK version: https://mvnrepository.com/artifact/com.appsflyer/af-android-sdk implementation 'com.appsflyer:af-android-sdk:5.+' implementation 'com.android.installreferrer:installreferrer:1.1' }
- Synchronisez le projet pour récupérer les dépendances. Voir la capture d'écran suivante :
Si vous utilisez ProGuard et que vous souhaitez utiliser la nouvelle API référente de Google, définissez la règle ProGuard suivante : -keep public class com.android.installreferrer.** { *; }
- Téléchargez le fichier Install Referrer aar
- Ajoutez-le au projet
- Ajoutez l'autorisation suivante au manifeste :
com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE
2.3 Définir les permissions requises
L'ajout d'autorisations permet d'augmenter le taux d'attribution de modélisation probabiliste. Cela permet au SDK d'envoyer plus de données telles que les données de réseau Wi-Fi ou d'opérateurs. Vous pouvez trouver ces données dans les rapports de données brutes et les utiliser pour l'analyse et l'optimisation des campagnes.
Ajoutez les autorisations requises
- Ajoutez les autorisations suivantes à
AndroidManifest.xml
:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- Optional : --> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
2.4 Configurer BroadcastReceiver pour qu'il obtienne des données de Google Play
Remarque
Google deprecated the BroadcastReceiver in March 2020.
- Cette modification n'affecte pas l'app.
- Le BroadcastReceiver peut malgré tout vous être encore utile pour l'attribution hors store. Renseignez-vous auprès du store dans lequel l'app est répertoriée pour vous en assurer.
- L'implémentation du référent d'installation est désormais obligatoire.
Le BroadcastReceiver obtient des informations de Google Play qu'AppsFlyer utilise pour l'attribution. L'utilisation du BroadcastReceiver augmente le taux d'attribution.
Les deux options suivantes sont disponibles pour mettre en place le récepteur de diffusion du référent d'installation :
Si vous n'avez pas de récepteur d'écoute sur INSTALL_REFERRER
, dans AndroidManifest.xml
, ajoutez le récepteur suivant dans la balise application
:
<application>
<receiver android:name="com.appsflyer.SingleInstallBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
</application>
<application>
<receiver android:name="com.appsflyer.MultipleInstallBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
</application>
Astuce
Si vous obtenez l'erreur "Unresolved class SingleInstallBroadcastReceiver" après avoir ajouté le récepteur à AndroidManifest.xml, veillez à créer d'abord l'application.
3. Implémenter et initialiser le SDK
Cette section explique comment implémenter et initialiser le SDK.
3.1 Récupérer votre dev key
AppsFlyer utilise la clé dev pour identifier votre compte de manière unique. La clé dev est obligatoire car elle permet au SDK d'envoyer et de récupérer en toute sécurité des données appartenant à votre compte AppsFlyer.
Attention ! En utilisant la mauvaise clé dev, ou une clé dev incorrecte, tout le trafic envoyé depuis le SDK est impacté, ce qui génère des problèmes d'attribution et de reporting.
Pour récupérer votre clé dev :
- Allez au tableau de bord de votre app
- Sur le tableau de bord, sous Configuration, cliquez sur Paramètres d'app.
- Copiez votre clé dev.
3.2 Initialiser le SDK
Nous vous recommandons d'initialiser le SDK dans la classe d'applications globale de l'app. Cela permet au SDK de s'initialiser dans tous les scénarios, y compris le deep linking.
Les étapes ci-dessous sont à effectuer dans la classe d'applications globale de l'app.
- Dans la classe globale de l'app, importez les bibliothèques suivantes
import android.app.Application; import android.util.Log; import com.appsflyer.AppsFlyerLib; import com.appsflyer.AppsFlyerConversionListener; import java.util.Map;
- Dans la classe globale, attribuez votre clé dev à une variable, de préférence nommée AF_DEV_KEY.
Important : il est essentiel d'utiliser la bonne clé dev lors de l'initialisation du SDK. En utilisant la mauvaise clé dev, ou une clé dev incorrecte, vous impactez tout le trafic envoyé depuis le SDK ce qui génère des problèmes d'attribution et de reporting.
public class AFApplication extends Application { private static final String AF_DEV_KEY = "qrdZGj123456789"; //... }
class AFApplication : Application() { private val devKey = "qrdZGj123456789"; //... }
- Dans la classe globale, après avoir appelé
super.onCreate()
, implémentez le codeAppsFlyerConversionListener
. Consultez le code ci-dessous à l'étape 4. - À l'intérieur de la classe globale, après
ConversionListener
, initialisez le SDK avec la méthodeinit()
.
public class AFApplication extends Application { private static final String AF_DEV_KEY = "qrdZGj123456789"; @Override public void onCreate() { super.onCreate(); AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() { @Override public void onConversionDataSuccess(Map<String, Object> conversionData) { for (String attrName : conversionData.keySet()) { Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName)); } } @Override public void onConversionDataFail(String errorMessage) { Log.d("LOG_TAG", "error getting conversion data: " + errorMessage); } @Override public void onAppOpenAttribution(Map<String, String> attributionData) { for (String attrName : attributionData.keySet()) { Log.d("LOG_TAG", "attribute: " + attrName + " = " + attributionData.get(attrName)); } } @Override public void onAttributionFailure(String errorMessage) { Log.d("LOG_TAG", "error onAttributionFailure : " + errorMessage); } }; AppsFlyerLib.getInstance().init(AF_DEV_KEY, conversionListener, this); } }
class AFApplication : Application() { private val devKey = "qrdZGj123456789"; override fun onCreate() { super.onCreate() val conversionDataListener = object : AppsFlyerConversionListener{ override fun onConversionDataSuccess(data: MutableMap<String, Any>?) { data?.let { cvData -> cvData.map { Log.i(LOG_TAG, "conversion_attribute: ${it.key} = ${it.value}") } } } override fun onConversionDataFail(error: String?) { Log.e(LOG_TAG, "error onAttributionFailure : $error") } override fun onAppOpenAttribution(data: MutableMap<String, String>?) { data?.map { Log.d(LOG_TAG, "onAppOpen_attribute: ${it.key} = ${it.value}") } } override fun onAttributionFailure(error: String?) { Log.e(LOG_TAG, "error onAttributionFailure : $error") } } AppsFlyerLib.getInstance().init(devKey, conversionDataListener, this) } }
- Dans la classe globale de l'app, appelez
start()
.
AppsFlyerLib.getInstance().start(this)
AppsFlyerLib.getInstance().start(this)
3.3 Enregistrer la classe d'applications globale
Dans le fichier AndroidManifest.xml
, à l'intérieur de la balise application
, ajoutez la ligne suivante :
android:name="APP.PACKAGE.NAME.AFApplication"
- APP.PACAKGE.NAME - remplacez cette expression par le nom de package de l'app.
- AFApplication - remplacez cette expression par le nom que vous avez défini pour la classe d'app globale
Cette ligne du fichier manifest.xml indique à l'application quelle est l'application globale. Comme mentionné ci-dessus, cela rend le SDK d'AppsFlyer globalement accessible dans l'ensemble de l'app.
3.4 Retarder l'initialisation du SDK
Pour retarder l'initialisation du SDK, vous pouvez appeler start depuis la classe Activity.
Cette méthode peut être utilisée si, par exemple, vous devez reporter le démarrage de start en attendant le consentement de l'utilisateur vis-à-vis du RGPD, de la CCPA, etc.
Lorsque vous invoquez start dans la classe Activity :
- Assurez-vous de transmettre l'instance Activity en tant qu'argument et non en tant qu'Application.
- Si vous prévoyez d'utiliser les fonctions de deep linking, ajoutez l'API
start()
à tout autre élément Activity que vous pouvez deep-linker et qui ne contient pas start.
4. Tester les installations
Vous êtes prêt à tester l'intégration SDK en simulant des installations organiques et non organiques.
4.1 Enregistrer votre appareil de test
Avant de commencer à tester les installations, enregistrez l'appareil de test.
4.2 Simuler une installation organique
Les installations organiques sont des installations non attribuées qui sont généralement des installations directes à partir des app stores.
Pour simuler une installation organique :
- Assurez-vous qu'un appareil mobile est connecté à votre ordinateur
- Dans Android Studio, ouvrez le Logcat.
- Depuis Android Studio, installez l'application sur l'appareil ou l'émulateur.
- Attendez que l'application se lance.
- Dans le Logcat, recherchez le nom du package de votre app.
Vous devriez voir ce qui suit :
La partie en surbrillance dans la capture d'écran indique que le SDK signale une installation organique. Ces données proviennent de la méthode onConversionDataSuccess
de la classe AFApplication. L'obtention des données de conversion est mentionnée plus loin dans ce guide.
Remarque : depuis le SDK V5, onConversionDataSuccess
est le nom de la méthode d'obtention des données de conversion. Si vous utilisez une version du SDK antérieure à 5.0.0, le nom de la méthode est onInstallConversionDataLoaded
. Nous vous recommandons une mise à niveau vers le SDK 5.0.0. Pour en savoir plus, cliquez ici.
Une installation organique doit désormais apparaître sur la page Présentation du tableau de bord de l'application.
Si vous ne voyez pas l'installation sur le tableau de bord de l'app, consultez notre guide de dépannage du SDK.
4.3 Simuler une installation non organique
Une installation non organique est une installation attribuée qui suit généralement un engagement publicitaire. Vous pouvez simuler une installation non organique en utilisant des liens d'attribution.
Pour simuler une installation non organique :
- Dans le manifeste, recherchez le nom du package de votre app, par exemple, com.company.app.
- Dans l'URL ci-dessous, remplacez <app_id> par le nom du package de votre app :
https://app.appsflyer.com/<app_id>?pid=Test&c=Test
- Le paramètre c indique le nom de la campagne.
- Le paramètre pid indique le nom de la source média à laquelle l'installation est attribuée.
- L'ID publicitaire (GAID) doit être ajouté si vous testez le clic depuis un ordinateur (an ajoutant
&advertising_id=<GAID>
à la fin du lien à l'étape 1).
- Dans l'URL ci-dessous, remplacez <app_id> par le nom du package de votre app :
- Envoyez cette URL à l'appareil. Vous pouvez effectuer cette opération via email ou WhatsApp, par exemple.
- Sur l'appareil, cliquez sur l'URL.
- Si l'application est répertoriée dans l'app store, vous serez redirigé vers l'app store. Ne téléchargez et n'installez pas l'app depuis l'app store. Passez à l'étape 5.
- Si l'app n'est pas répertoriée dans l'app store et est encore en développement, l'écran affiche un message indiquant que l'app n'est pas disponible dans l'app store. Passez à l'étape 5.
- Dans Android Studio, ouvrez le Logcat.
- Connectez l'appareil à votre ordinateur à l'aide d'un câble USB.
- Depuis Android Studio, installez l'app sur l'appareil.
- Dans le Logcat, recherchez le nom du package de votre app.
Vous devriez voir ce qui suit :
Une installation non organique doit désormais apparaître sur la page Présentation du tableau de bord de l'application.
Remarque
Lorsque vous avez terminé de tester et de déboguer l'intégration du SDK, désactivez les journaux du SDK .
Problèmes reconnus liés à l'intégration du SDK
Consultez les informations suivantes pour découvrir les problèmes qui peuvent surgir lors de l'intégration du SDK, et savoir comment les régler.
Avertissement ProGuard
Si vous utilisez ProGuard et que vous rencontrez un avertissement concernant notre classe AFKeystoreWrapper
, ajoutez le code suivant à votre fichier de règles ProGuard :
-keep class com.appsflyer.** { *; }
Règles de sauvegarde
Si vous ajoutez android:fullBackupContent= "true"
à l'intérieur de la balise <application> de AndroidManifest.xml, il se peut que le message d'erreur suivant s'affiche :
Échec de la fusion du manifeste : Attribute application@fullBackupContent value=(true)
Pour corriger cette erreur, ajoutez tools:replace="android:fullBackupContent"
à la balise <application> du fichier AndroidManifest.xml.
Si vous avez vos propres règles de sauvegarde spécifiées (android:fullBackupContent="@xml/my_rules"
), en plus des instructions ci-dessus, veuillez les fusionner manuellement avec celles d'AppsFlyer en ajoutant la règle suivante :
<full-backup-content>
...//your custom rules
<exclude domain="sharedpref" path="appsflyer-data"/>
</full-backup-content>
Fichiers de ressources manquants
Si vous utilisez le SDK Android V5 et +, assurez-vous que dans le fichier APK, en plus des fichiers classes.dex et ressources , le dossier com >appsflyer >internal et les fichiers a- et b- sont présents.
Remarque : avant le SDK 5.3.0, les noms de fichiers sont a. et b.
Vérifiez que vous disposez des fichiers requis en ouvrant votre APK dans Android Studio. Voir la capture d'écran suivante pour référence.
Si ces fichiers sont manquants, le SDK ne pourra pas lancer de requête de réseau à notre serveur, et vous devrez contacter votre CSM ou le centre d'assistance.
Cet onglet explique la façon d'enregistrer les évènements in-app et les revenus et la façon de configurer le deep linking.
Enregistrer les évènements in-app et les revenus vous permet de mesurer la qualité de vos utilisateurs. Le deep linking vous permet d'offrir une meilleur expérience utilisateur aux utilisateurs.
Cet onglet contient des instructions pour les développeurs, mais la participation du marketeur est essentielle pour les raisons suivantes :
- Le marketeur doit décider quels évènements in-app sont à enregistrer pour mesurer la qualité des utilisateurs.
- Le marketeur a accès au tableau de bord AppsFlyer, ce qui est nécessaire afin de configurer OneLink pour le deep linking.
5. Enregistrement des événements In-App
Les événements in-app permettent une analyse de ce qui se passe dans votre application. Nous vous recommandons de prendre le temps de définir les évènements que vous voulez enregistrer. L'enregistrement des évènements in-app vous permet de mesurer les KPI tels que le ROI (retour sur investissement) et la LTV (durée de vie).
Il existe plusieurs façons d'enregistrer les évènements in-app. La façon la plus courante consiste à envoyer les évènements via le SDK. C'est de cette méthode dont il est question dans cet article. Pour connaître les autres façons d'enregistrer les événements in-app, consultez notre guide de présentation des événements in-app.
Si votre app appartient à un certain secteur, par exemple, tourisme, gaming, e-commerce, etc., vous pouvez utiliser la liste complète des évènements in-app recommandés par secteur.
5.1 Noms et paramètres des évènements in-app
Le SDK possède deux interfaces liées aux évènements in-app :
- AFInAppEventType - constantes pour les noms d'événements in-app
- AFInAppEventParameterName - constantes pour les noms des paramètres d'évènements in-app
Nous recommandons fortement d'utiliser ces deux interfaces pour les raisons suivantes :
- La dénomination standard permet à AppsFlyer de mapper automatiquement les évènements sur des SRN tels que Facebook, Google, Twitter et Snapchat.
- Rétrocompatibilité - si AppsFlyer décide de modifier le nom ou le paramètre d'un évènement, votre implémentation est compatible avec les version antérieures.
Pour utiliser ces deux interfaces, importez-les :
import com.appsflyer.AFInAppEventParameterName;
import com.appsflyer.AFInAppEventType;
Voici la liste des noms et structures d'évènements recommandés.
5.2 Enregistrer des revenus
Vous pouvez envoyer des revenus avec n'importe quel évènement in-app. Utilisez le paramètre d'évènement af_revenue
(AFInAppEventParameterName.REVENUE
) pour intégrer le revenu dans l'évènement in-app. Vous pouvez lui affecter n'importe quelle valeur numérique, positive comme négative.
af_revenue
est le seul paramètre d’évènement qu'AppsFlyer compte en tant que revenu réel dans les données brutes et le tableau de bord. Pour plus de détails, veuillez cliquer ici.
Lors de l'envoi d'évènements avec revenus, pensez aux éléments suivants :
- Si vous définissez un code de devise (voir exemple ci-dessous), il doit s'agir d'un code ISO 4217 de 3 caractères. (la valeur par défaut est USD).
- Vous pouvez définir le code devise pour tous les événements en appelant la méthode suivante :
AppsFlyer.setCurrencyCode("ZZZ")
Pour en savoir plus sur les paramètres de devise, l'affichage et la conversion de devise, consultez notre guide sur la devise du revenu. - La valeur de revenu ne doit pas contenir de séparateurs sous forme de virgules, de symbole monétaire ou de texte. Un événement de revenu doit être similaire à 1234.56, par exemple.
Exemple : évènement d'achat d'évènement in-app avec revenus
Map<String, Object> eventValue = new HashMap<String, Object>();
eventValue.put(AFInAppEventParameterName.REVENUE,1234.56);
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"Shirt");
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"1234567");
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD");
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , AFInAppEventType.PURCHASE , eventValue);
val eventValue = HashMap<String, Any>()
eventValue.put(AFInAppEventParameterName.REVENUE,1234.56)
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"Shirt")
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"1234567")
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD")
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , AFInAppEventType.PURCHASE , eventValue)
L’événement d’achat ci-dessus a un revenu de 1234,56 USD qui lui est associé et qui apparait comme revenu dans le tableau de bord.
Enregistrement de revenus négatifs
Dans certaines situations, vous voudrez peut-être enregistrer un revenu négatif.
Par exemple, un utilisateur reçoit un remboursement pour des chaussures qu'il a acheté chez vous.
Map<String, Object> eventValue = new HashMap<String, Object>();
eventValue.put(AFInAppEventParameterName.REVENUE,-200);
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE,"shoes");
eventValue.put(AFInAppEventParameterName.CONTENT_ID,"4875");
eventValue.put(AFInAppEventParameterName.CURRENCY,"USD");
AppsFlyerLib.getInstance().logEvent(getApplicationContext() , "cancel_purchase" , eventValue);
val eventValue = HashMap<String, Any>()
eventValue.put(AFInAppEventParameterName.REVENUE, -200)
eventValue.put(AFInAppEventParameterName.CONTENT_TYPE, "category_a")
eventValue.put(AFInAppEventParameterName.CONTENT_ID, "1234567")
eventValue.put(AFInAppEventParameterName.CURRENCY, "USD")
AppsFlyerLib.getInstance().logEvent(applicationContext, "cancel_purchase", eventValue)
Remarque
Veuillez remarquer les éléments suivants dans le code ci-dessus :
- La valeur de revenu est précédée du signe moins
- Le nom de l'événement a la valeur unique "cancel_purchase" pour vous permettre d'identifier les événements de revenus négatifs dans le tableau de bord et les rapports de données brutes.
5.3 Validation des achats in-app
Le SDK d'AppsFlyer procède à une validation au niveau du serveur pour les achats in-app. Pour valider un achat, appelez la méthode validateAndLogInAppPurchase
.
Cet appel génère automatiquement un évènement in-app af_purchase
si l'achat est validé.
public static void validateAndLogInAppPurchase(Context context,
String publicKey, String signature, String purchaseData,
String price, String currency, HashMap<String, String> additionalParameters);
Paramètres de la méthode
- String publicKey - clé publique de la console développeur Google
- String signature – signature de transaction (renvoyée de l'API Google lorsque l'achat est terminé)
- String purchaseData – produit acheté en format JSON (renvoyé de l'API Google lorsque l'achat est terminé)
- String price – revenu de l'évènement in-app à signaler à AppsFlyer.
- String currency – devise de l'évènement in-app à signaler à AppsFlyer
- HashMap<String, String> additionalParameters – paramètres supplémentaires de l'évènement in-app qui apparaissent dans le champ event_value des données brutes de l'évènement in app.
Rappels de réussite et d'échec de validation d'achat
Lorsque vous voulez savoir si la tentative de validation d'un achat est réussie ou non, implémentez registerValidatorListener dans votre classe d'applications. Ce port d'écoute contient deux blocs de rappel, l'un pour la « réussite » et l'autre pour « l'échec » (quelle qu'en soit la raison, y compris l'échec de validation).
AppsFlyerLib.getInstance().registerValidatorListener(this,new
AppsFlyerInAppPurchaseValidatorListener() {
public void onValidateInApp() {
Log.d(TAG, "Purchase validated successfully");
}
public void onValidateInAppFailure(String error) {
Log.d(TAG, "onValidateInAppFailure called: " + error);
}
});
AppsFlyerLib.getInstance().registerValidatorListener(this, object : AppsFlyerInAppPurchaseValidatorListener {
override fun onValidateInApp() {
Log.d(LOG_TAG, "Purchase validated successfully")
}
override fun onValidateInAppFailure(error: String) {
Log.d(LOG_TAG, "onValidateInAppFailure called: $error")
}
})
Exemple de validation d'un achat :
// Purchase object is returned by Google API in onPurchasesUpdated() callback
private void handlePurchase(Purchase purchase) {
Log.d(LOG_TAG, "Purchase successful!");
Map<String, String> additional_event_values = new HashMap<>();
additional_event_values.put("some_parameter", "some_value");
String price= "10";
String currency = "USD";
AppsFlyerLib.getInstance().validateAndLogInAppPurchase(getApplicationContext(), PUBLIC_KEY, purchase.getSignature(), purchase.getOriginalJson(), revenue, currency, additional_event_values);
}
// Purchase object is returned by Google API in onPurchasesUpdated() callback
private fun handlePurchase(Purchase purchase) {
Log.d(LOG_TAG, "Purchase successful!");
val additional_event_values = HashMap<String, String>()
additional_event_values.put("some_parameter", "some_value");
val price= "10";
val currency = "USD";
AppsFlyerLib.getInstance().validateAndLogInAppPurchase(this, PUBLIC_KEY, purchase.getSignature(), purchase.getOriginalJson(), revenue, currency, additional_event_values);
}
La validation d'un achat in-app envoie automatiquement un évènement d'achat in-app à AppsFlyer. Vous trouverez ci-dessous un exemple des données transmises dans le paramètre event_value :
{
"some_parameter":"some_value", // from additional_event_values
"af_currency":"USD", // from currency
"af_content_id":"test_id", // from purchase
"af_revenue":"10", // from revenue
"af_quantity":"1", // from purchase
"af_validated":true // flag that AF verified the purchase
}
Remarque
L'appel à la méthode validateAndTrackInAppPurchase
génère automatiquement un événement in-app af_purchase. Le fait d'envoyer vous-même cet évènement crée un double rapport d'évènements.
5.4 Limitations des évènements in-app
- Nom de l'événement : 45 caractères maximum
- Valeur de l'événement : ne doit pas dépasser 1000 caractères - s'il est plus long, nous pourrions le tronquer
- Tarification et revenu : utilisez uniquement des chiffres et des décimales, par exemple 5 ou 5,2.
- Les valeurs de tarification et de revenu peuvent comporter jusqu'à 5 chiffres après le symbole de décimale, par exemple, 5.12345
- Les caractères non anglais sont pris en charge, dans les événements in-app, d'autres SDK d'API, à partir du SDK Android V4.8.1.
5.5 Exemples d'enregistrement des évènement in-app
Vous pouvez enregistrer des évènements in-app en appelant trackEvent
avec le nom de l'évènement et les paramètres de valeur. Consultez la documentation Événements in-app pour plus de détails.
Vous trouverez ci-dessous un exemple simple sur la façon d'enregistrer un évènement d'achat. Pour obtenir une liste complète des extraits de code prêts à l'emploi par secteur, consultez notre guide concernant les évènements rich in-app par secteur.
Exemple : évènement d'achat in-app
Map<String,Object> eventValues = new HashMap<>();
eventValues.put(AFInAppEventParameterName.REVENUE, 1200);
eventValues.put(AFInAppEventParameterName.CURRENCY, "JPY");
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, "Shoes");
AppsFlyerLib.getInstance().logEvent(this, AFInAppEventType.PURCHASE, eventValues);
val eventValues = HashMap<String, Any>();
eventValues.put(AFInAppEventParameterName.REVENUE, 1200)
eventValues.put(AFInAppEventParameterName.CURRENCY, "JPY")
eventValues.put(AFInAppEventParameterName.CONTENT_TYPE, "Shoes")
AppsFlyerLib.getInstance().logEvent(this, AFInAppEventType.PURCHASE, eventValues)
5.6 Enregistrer des événements in app hors ligne
Si un utilisateur initie un évènement lorsque la connexion Internet est indisponible, Appsflyer est capable de l'enregistrer. Le fonctionnement est le suivant :
- Le SDK envoie les événements aux serveurs AppsFlyer et attend une réponse.
- Si le SDK ne reçoit pas une réponse 200, l'événement est stocké dans le cache.
- Une fois que la réponse 200 suivante est reçue, l'événement stocké est renvoyé au serveur.
- S'il y a plusieurs événements dans le cache, ils sont envoyés au serveur les uns après les autres.
Remarque
Le cache du SDK peut stocker jusqu’à 40 événements, ce qui signifie que seuls les 40 premiers événements survenus hors ligne sont enregistrés. Tout ce qui vient après, jusqu'à la prochaine réponse 200, n'est pas retenu.
L'heure de l'événement qui apparaît dans les données brutes est l'heure à laquelle l'événement est envoyé à AppsFlyer après la reconnexion en ligne de l'appareil. Ce n'est pas le moment où l'événement a eu lieu.
5.7 Gérer le succès et l'échec lors de l'enregistrement d'événements in-app
Vous pouvez définir un port d'écoute lors de l'enregistrement d'événements in-app. Le port d'écoute vous permet de définir une logique pour deux cas :
- Événement in-app enregistré avec succès.
- Une erreur s'est produite lors de l'enregistrement d'un événement in-app.
AppsFlyerLib.getInstance().logEvent(getApplicationContext(), AFInAppEventType.PURCHASE, eventValue, new AppsFlyerRequestListener() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "Event sent successfully");
}
@Override
public void onError(int i, @NonNull String s) {
Log.d(LOG_TAG, "Event failed to be sent:\n" +
"Error code: " + i + "\n"
+ "Error description: " + s);
}
});
AppsFlyerLib.getInstance().logEvent(getApplicationContext(), AFInAppEventType.PURCHASE, eventValue, object : AppsFlyerRequestListener {
override fun onSuccess() {
Log.d(LOG_TAG, "Event sent successfully")
}
override fun onError(errorCode: Int, errorDesc: String) {
Log.d(LOG_TAG, "Event failed to be sent:\n" +
"Error code: " + errorCode + "\n"
+ "Error description: " + errorDesc)
}
})
En cas d'erreur lors de l'enregistrement de l'événement in-app, un code d'erreur et une description de la chaîne sont fournis, comme indiqué dans le tableau qui suit.
Code d'erreur | Description de la chaîne |
---|---|
10 |
"Event timeout. (« Délai de l'événement ») Vérifiez 'minTimeBetweenSessions' param" |
11 |
"Skipping event because 'isStopped' enabled" (« Sauter l'événement car isStopped est activé ») |
40 |
Erreur réseau : la description de l'erreur provient d'Android |
41 |
"No dev key" (« Pas de clé de développement ») |
50 |
"Status code failure" (« Échec du code d'état » + code de réponse réel du serveur |
6. Deep linking avec OneLink
OneLink est la solution d'AppsFlyer pour l'attribution multiplate-forme, la redirection et le deep linking.
6.1 Détection et redirection d'appareils
OneLink détecte le type d'appareil lors du clic et redirige l'utilisateur vers une destination correspondante, par exemple, Google Play, app store iOS, marchés out-of-source ou pages Web.
Le guide sur les redirections OneLink aborde l'implémentation de liens d'attribution multiplate-forme (aucun codage SDK nécessaire). C'est également la base du deep linking.
6.2 Deep linking
Le deep linking vous permet d'envoyer les utilisateurs vers des activités spécifiques tout en leur offrant un contenu personnalisé. Cette fonction est particulièrement utile lors de l'exécution de campagnes de retargeting.
Pour configurer le deep linking avec OneLink, un marketeur ayant accès au tableau de bord d'AppsFlyer et un développeur ayant accès à l'app doivent travailler ensemble.
Consultez notre guide de configuration du deep linking avec OneLink.
6.3 Deep linking différé
Le deep linking différé vous permet d'effectuer le deep link des nouveaux utilisateurs et de leur offrir du contenu personnalisé après l'installation de l'app. Il est différent du deep linking habituel pour lequel l'app doit déjà être installée sur l'appareil de l'utilisateur.
Pour configurer le deep linking différé avec OneLink, le développeur doit également avoir accès au tableau de bord d'AppsFlyer.
La configuration du deep linking différé est la même que celle du deep linking. La seule différence est que vous devez implémenter une logique supplémentaire dans l'app de façon à pouvoir effectuer le deep link des utilisateurs et leur offrir du contenu personnalisé après installation et lancement de l'application.
Consultez notre guide sur le deep linking différé pour en savoir plus.
6.4 Obtenir les données de deep link
Le SDK vous fournit les données de conversion ou d'engagement après chaque installation ou évènement de deep linking. Vous pouvez utiliser ces données pour personnaliser du contenu et le comportement de l'app par programme.
Pour obtenir des données de deep linking lorsque le deep linking direct est utilisé et que l'app est ouverte, implémentez la méthode onAppOpenAttribution .
Pour obtenir manuellement des données de réengagement de deep linking à tout moment, implémentez la méthode performOnAppAttribution .Cela permet d'accéder aux données de réengagement sans avoir à enregistrer un nouveau réengagement.
Consultez notre guide sur les données de deep linking pour en savoir plus.
7. Obtenir les données de conversion
Vous pouvez accéder aux données d'attribution des utilisateurs en temps réel pour chaque nouvelle installation à partir du SDK.
En faisant cela, vous pouvez offrir aux utilisateurs du contenu personnalisé, ou les renvoyer vers des activités spécifiques dans l'app (voir le deep link différé dans cet article). Cela améliore l'engagement des utilisateurs avec l'app.
Pour obtenir les données de conversion d'AppsFlyer depuis le SDK Android, implémentez AppsFlyerConversionListener
.
import android.app.Application;
import com.appsflyer.AppsFlyerLib;
import com.appsflyer.AppsFlyerConversionListener;
import java.util.Map;
import android.util.Log;
public class AFApplication extends Application {
private static final String AF_DEV_KEY = "qrdZGj123456789";
@Override
public void onCreate() {
super.onCreate();
AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() {
@Override
public void onConversionDataSuccess(Map<String, Object> conversionData) {
for (String attrName : conversionData.keySet()) {
Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName));
}
}
@Override
public void onConversionDataFail(String errorMessage) {
Log.d("LOG_TAG", "error getting conversion data: " + errorMessage);
}
@Override
public void onAppOpenAttribution(Map<String, String> conversionData) {
for (String attrName : conversionData.keySet()) {
Log.d("LOG_TAG", "attribute: " + attrName + " = " + conversionData.get(attrName));
}
}
@Override
public void onAttributionFailure(String errorMessage) {
Log.d("LOG_TAG", "error onAttributionFailure : " + errorMessage);
}
};
AppsFlyerLib.getInstance().init(AF_DEV_KEY, conversionListener, getApplicationContext());
AppsFlyerLib.getInstance().start(this);
}
}
import com.appsflyer.AppsFlyerConversionListener
import com.appsflyer.AppsFlyerLib
import com.appsflyer.AppsFlyerLibCore.LOG_TAG
class AFApplication : Application() {
private val devKey = "qrdZGj123456789";
override fun onCreate() {
super.onCreate()
val conversionDataListener = object : AppsFlyerConversionListener{
override fun onConversionDataSuccess(data: MutableMap<String, Any>?) {
data?.let { cvData ->
cvData.map {
Log.i(LOG_TAG, "conversion_attribute: ${it.key} = ${it.value}")
}
}
}
override fun onConversionDataFail(error: String?) {
Log.e(LOG_TAG, "error onAttributionFailure : $error")
}
override fun onAppOpenAttribution(data: MutableMap<String, String>?) {
data?.map {
Log.d(LOG_TAG, "onAppOpen_attribute: ${it.key} = ${it.value}")
}
}
override fun onAttributionFailure(error: String?) {
Log.e(LOG_TAG, "error onAttributionFailure : $error")
}
}
AppsFlyerLib.getInstance().init(devKey, conversionDataListener, applicationContext)
AppsFlyerLib.getInstance().start(this)
}
}
Les deux principales API dans l'interface AppsFlyerConversionListener
sont :
-
onInstallConversionData
- fournit les données de conversion pour les nouvelles installations. Remarque :depuis le SDK V5,onConversionDataSuccess
est le nom de la méthode d'obtention des données de conversion. Si vous utilisez une version du SDK antérieure à 5.0.0, le nom de la méthode estonInstallConversionDataLoaded
. Nous vous recommandons une mise à niveau vers le SDK 5.0.0. Pour en savoir plus, cliquez ici. -
onAppOpenAttribution
- fournit les données de conversion de retargeting lorsqu'une app existante est lancée, soit manuellement ou via le deep linking.
Pour en savoir plus sur les données de conversion, consultez notre guide sur les scénarios liés aux données de conversion.
8. Attribution
Applications Android out-of-store
Avec AppsFlyer, vous pouvez attribuer des installations pour des applications Android out-of-store. Cela vous permet de promouvoir vos applications et de toucher de plus larges audiences sur les marchés où Google Play n'est pas disponible.
Pour plus de détails sur la façon d'attribuer des installations pour les applications out-of-store, cliquez ici.
Applications pré-installées
Dans les campagnes de pré-installation, les propriétaires d'applications peuvent demander aux fabricants d'appareils de pré-installer leurs applications sur les appareils avant leur départ de l'usine.
Avec AppsFlyer, vous pouvez facilement attribuer les installations d'applications pré-installées. Lorsque les utilisateurs lancent votre application pour la première fois, AppsFlyer attribue l'installation au fabricant en tant que source média.
Pour plus de détails, veuillez cliquer ici.
Mesure des désinstallations
Pour connaître la façon de configurer la mesure des désinstallations, cliquez ici.
Définir un port d'écoute de demande.
Si vous souhaitez recevoir la confirmation que la demande a bien été reçue par les serveurs AppsFlyer, implémentez le port d'écoute AppsFlyerRequestListener.
La méthode de callback onRequestSuccess()
est appelée toutes les 200 response
(200 réponses) dans le cadre d'une demande d'attribution effectuée par le SDK.
La méthode de callback onRequestFailure(String error)
est appelée pour toute autre réponse et renvoie la réponse sous forme de chaîne d'erreur.
Exemple d'implémentation
AppsFlyerLib.getInstance().start(getApplicationContext(), "devKey", new AppsFlyerRequestListener() {
@Override
public void onSuccess() {
Log.d(LOG_TAG, "Launch sent successfully, got 200 response code from server");
}
@Override
public void onError(int i, @NonNull String s) {
Log.d(LOG_TAG, "Launch failed to be sent:\n" +
"Error code: " + i + "\n"
+ "Error description: " + s);
}
});
AppsFlyerLib.getInstance().start(this, "devKey", object : AppsFlyerRequestListener {
override fun onSuccess() {
Log.d(LOG_TAG, "Launch sent successfully")
}
override fun onError(errorCode: Int, errorDesc: String) {
Log.d(LOG_TAG, "Launch failed to be sent:\n" +
"Error code: " + errorCode + "\n"
+ "Error description: " + errorDesc)
}
})
En cas d'erreur lors de l'enregistrement de l'événement in-app, un code d'erreur et une description de la chaîne sont fournis, comme indiqué dans le tableau qui suit.
Code d'erreur | Description de la chaîne |
---|---|
10 |
"Event timeout. (« Délai de l'événement ») Vérifiez 'minTimeBetweenSessions' param" |
11 |
"Skipping event because 'isStopped' enabled" (« Sauter l'événement car isStopped est activé ») |
40 |
Erreur réseau : la description de l'erreur provient d'Android |
41 |
"No dev key" (« Pas de clé de développement ») |
50 |
"Status code failure" (« Échec du code d'état » + code de réponse réel du serveur |
Définition des données personnalisées supplémentaires
L'API setAdditionalData
est requise pour l'intégration au niveau SDK avec plusieurs plates-formes partenaires externes, dont Segment, Adobe et Urban Airship. Utilisez cette API uniquement si l'article d'intégration de la plate-forme indique spécifiquement que l'API setAdditionalData est requise.
Exemple de code setAdditionalData
:
HashMap<String,Object> CustomDataMap = new HashMap<>();
CustomDataMap.put("custom_param_1","value_of_param_1");
AppsFlyerLib.getInstance().setAdditionalData(CustomDataMap);
val customDataMap = HashMap<String, Any>()
customDataMap.put("custom_param_1","value_of_param_1")
AppsFlyerLib.getInstance().setAdditionalData(customDataMap)
Attribuer des sessions d'app initiées depuis des sites (domaines) propres
Les propriétaires d'app qui utilisent des App Links pour le deep linking (sans OneLink), et qui ont un domaine associé à leur app, peuvent attribuer des sessions initiées à partir de ce même domaine grâce à la méthode appendParametersToDeepLinkingURL
.
Prenons comme exemple un utilisateur qui lance une recherche sur Google puis clique sur votre domaine, www.example.com :
- Si l'utilisateur n'a pas encore installé l'application, il est dirigé vers le site (www.example.com).
- Si l'utilisateur a installé l'app sur son appareil, il est deep linké à l'application qui est associée à www.example.com. La session est attribuée à la source média (paramètre
pid
) qui est spécifiée dansappendParametersToDeepLinkingURL
.
Voir la référence du SDK Android pour plus d'informations.
Remarque : les bannières intelligentes permettent aux propriétaires d'app d'augmenter la conversion des visiteurs d'un site en utilisateurs d'app.
9. Sessions
Personnalisation de la durée entre sessions
Par défaut, il doit s'écouler au moins 5 secondes entre deux lancements d'apps pour que cela soit considéré comme deux sessions distinctes (pour en savoir plus sur le comptage de session).
Utilisez l'API suivante pour définir la durée minimale entre les sessions :
AppsFlyerLib.setMinTimeBetweenSessions(int seconds);
Le fait de définir une valeur élevée à la durée personnalisée entre les lancements peut avoir un impact négatif sur les API qui s'appuient sur les données de session, comme le deep linking.
Sessions d'arrière-plan pour applications utilitaires
Vous pouvez signaler de nouvelles sessions utilisateur à l'aide de cette méthode de SDK. Par exemple, cela peut être utile pour les applications utilitaires qui s'exécutent en arrière-plan.
Utilisez cette API dans la fonction onCreate() de votre activité :
public void logSession(Context context);
Exemple d'utilisation :
AppsFlyerLib.getInstance().logSession(context);
10. Médias propres
Résoudre les URL Deep Link encapsulées
Certains services tiers tels que les prestataires de services de messagerie encapsulent des liens dans des emails avec leurs propres domaines d'enregistrement des clics. Certains vous permettent même de définir vos propres domaines d'enregistrement des clics. Si OneLink est encapsulé dans de tels domaines, il est possible que ses fonctionnalités soient limitées.
Pour résoudre ce problème, vous pouvez utiliser l'API setResolveDeepLinkURLs
. Utilisez cette API pour obtenir le OneLink des domaines de clic qui lancent l'application. Assurez-vous d'appeler cette API avant d'initialiser le SDK.
Par exemple, vous avez trois domaines de clic qui redirigent vers votre OneLink : https://mysubdomain.onelink.me/abCD. Utilisez cette API pour obtenir le OneLink vers lequel vos domaines de clic redirigent. Cette méthode d'API reçoit une liste de domaines que le SDK résout. Ajoutez le code suivant avant l'initialisation du SDK.
AppsFlyerLib.getInstance().setResolveDeepLinkURLs("clickdomain.com", "myclickdomain.com", "anotherclickdomain.com");
Le code ci-dessus vous permet d'utiliser votre domaine de clic tout en conservant les fonctionnalités de OneLink. Les domaines de clic sont responsables du lancement de l'application. En retour, l'API obtient le OneLink de ces domaines de clic. Vous pouvez ensuite utiliser les données de ce OneLink pour le deep linking et personnaliser le contenu de l'utilisateur.
Enregistrement des notifications push
Avec AppsFlyer, vous pouvez mesurer les notifications push dans le cadre de campagnes de retargeting.
Pour activer cette fonctionnalité, appelez la méthode sendPushNotificationData
dans la méthode onCreate
de chaque activité lancée à la suite d'un clic sur la notification :
AppsFlyerLib.getInstance().sendPushNotificationData(this);
Pour plus d'informations concernant la mesure des notifications push, veuillez lirececi.
Attribution des invitations utilisateur
Le fait de permettre à vos utilisateurs existants d'inviter leurs amis et contacts en tant que nouveaux utilisateurs de votre application peut être un facteur de croissance important pour votre application. Avec AppsFlyer, vous pouvez attribuer et enregistrer les installations provenant d'invitations utilisateur au sein de votre app.
Pour obtenir plus d'informations, reportez-vous à l'article concernant l'attribution des invitations utilisateur.
Attribution des promotions croisées
11. Identifiants utilisateur
Obtenez un ID AppsFlyer
Un ID AppsFlyer est créé pour chaque nouvelle installation d’une application. Vous pouvez utiliser l'ID AppsFlyer à différentes fins :
- Envoyez des événements in-app serveur à serveur.
- Faites correspondre l'ID AppsFlyer et les enregistrements utilisateur dans vos systèmes en arrière-plan.
- Mappez les entrées lors de la fusion des données de l'API Pull et de l'API Push.
Utilisez l’API suivante pour obtenir l’ID AppsFlyer :
public String getAppsFlyerUID(Context context);
Exemple d'utilisation :
String appsFlyerId = AppsFlyerLib.getInstance().getAppsFlyerUID(this);
Définir l'ID Utilisateur-Client
Pour définir votre ID Utilisateur-Client :
public void setCustomerUserId(String id);
Exemple d'utilisation :
AppsFlyerLib.getInstance().setCustomerUserId("myId");
Nous vous recommandons de définir l'ID utilisateur du client au début du flux de l'app, car il est uniquement associé aux évènements rapportés après son installation :
- Si
setCustomerUserId
est appelé avantstart
, l'ID utilisateur du client apparaîtra dans les rapports de données brutes relatifs aux installations et aux évènements. - S'il est défini après, l'ID utilisateur du client est uniquement associé aux évènements enregistrés après la définition de l'ID utilisateur du client.
Obtenir l'ID Utilisateur-Client :
Pour éviter de redéfinir la valeur de l'ID utilisateur du client après le premier lancement et réduire le nombre d'appels à votre serveur afin d'obtenir l'ID utilisateur du client, vous pouvez vérifier si sa valeur est vide ou non en utilisant :
AppsFlyerProperties.getInstance().getString(AppsFlyerProperties.APP_USER_ID)
Pour plus d’informations sur l’ID Utilisateur-Client, cliquez ici.
Retarder l'initialisation du SDK dans l'attente du customerUserID
Il est possible d'attendre que le customerUserID soit défini pour lancer l'initialisation du SDK.
Pour indiquer que le SDK doit retarder l'initialisation dans l'attente de l'ID utilisateur du client, appelez :
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
immédiatement avant la méthode init(). Le reste de l'initialisation du SDK doit rester inchangé.
Une fois le customerUserID fourni, appelez
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this);
afin de fournir au SDK l'ID utilisateur du client approprié et de déclencher le SDK.
Le code doit apparaître comme suit :
public class AFApplication extends Application {
private static final String AF_DEV_KEY = "qrdZGj123456789";
@Override
public void onCreate() {
super.onCreate();
AppsFlyerConversionListener conversionDataListener =
new AppsFlyerConversionListener() {
...
};
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
//WARNING! Removing above line doesn't cancel its effect.
// Replace with this to stop waiting for CUID:
// AppsFlyerLib.getInstance().waitForCustomerUserId(false);
AppsFlyerLib.getInstance().init(AF_DEV_KEY, getConversionListener(), getApplicationContext());
AppsFlyerLib.getInstance().start(this);
// Do your magic to get the customerUserID
// ...
// any AppsFlyer SDK code invoked here will be discarded
//Call the following API once the customerUserID is available:
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this);
}
}
class AFApplication: Application() {
private val afDevKey = ""
override fun onCreate() {
super.onCreate()
val conversionDataListener = object: AppsFlyerConversionListener {
...
}
AppsFlyerLib.getInstance().waitForCustomerUserId(true);
//WARNING! Removing above line doesn't cancel its effect.
// Replace with this to stop waiting for CUID:
// AppsFlyerLib.getInstance().waitForCustomerUserId(false);
AppsFlyerLib.getInstance().init(afDevKey, conversionDataListener, this)
AppsFlyerLib.getInstance().start(this)
// Do your magic to get the customerUserID
// ...
// any AppsFlyer SDK code invoked here will be discarded
// Call the following API once the customerUserID is available:
AppsFlyerLib.getInstance().setCustomerIdAndLogSession("customer_id", this)
}
}
To learn more about delaying the SDK initialization until the Customer User ID is available, go here.
Avertissement
Utilisez cette API uniquement dans les cas appropriés à votre logique métier. L'utilisation de cette API augmente les risques de divergences et pourrait rendre l'application plus exposée à la fraude.
ID Google Advertising
AppsFlyer collecte automatiquement le google_advertising_id
depuis la version 4.8.0 du SDK.
L'obligation de collecte de l'ID Google Advertising s'applique uniquement aux versions 4.7.X et supérieures du SDK.
OAID, IMEI et ID Android
Un identifiant unique d'appareil au minimum doit être collecté pour activer l'attribution. Les identifiants suivants sont disponibles : GAID, ID Android, IMEI et OAID.
GAID - Google Advertising ID
Recueilli automatiquement dans les apps qui contiennent les services Google Play. Si le GAID est disponible, l'IMEI et l'ID Android ne doivent PAS être collectés par l'app afin d'éviter toute violation de la réglementation Google Play.
Numéro IMEI et ID Android
Disabled by default. Can be collected ONLY for apps that do NOT contain Google Play Services.
Note: Starting with Android 10 (API level 29), released in late 2019, access to the IMEI parameter is restricted.
Pour envoyer ces ID à AppsFlyer :
- Sur l'application ouverte, collectez l'IMEI et / ou l'ID Android de l'appareil.
- Appelez les API suivantes AVANT d'appeler la méthode
start
:
AppsFlyerLib.getInstance().setImeiData("IMEI_HERE"); AppsFlyerLib.getInstance().setAndroidIdData("ANDROID_ID_HERE");
OAID - Open Advertiser Identifier
Guide de mise en œuvre de l'OAID
Désactiver la collecte d'ID d'appareil
Les développeurs peuvent choisir de ne pas collecter les IMEI, ID Android et OAID en utilisant les API suivantes :
AppsFlyerLib.getInstance().setCollectIMEI(false);
AppsFlyerLib.getInstance().setCollectAndroidID(false);
AppsFlyerLib.getInstance().setCollectOaid(false);
12. Confidentialité des utilisateurs
Exclusion
Dans certains cas extrêmes, vous pouvez choisir d'arrêter toute identification via le SDK en raison de la conformité aux exigences légales et relatives à la vie privée. L'API isStopped le permet. Une fois cette API appelée, le SDK cesse de fonctionner et ne communique plus avec les serveurs AppsFlyer.
AppsFlyerLib.getInstance().isStopped(true, context);
There are several different scenarios for user opt-out. We highly recommend following the exact instructions for the scenario, that is relevant for your app.
Dans chaque évènement, le SDK peut être réactivé en appelant la même API, avec la valeur false.
Important
N'appelez pas start
si isStopped
est réglé sur true
Pour reprendre l'identification une fois que l'API isStopped
est définie sur false
, utilisez l'API SDK suivante :
AppsFlyerLib.getInstance().start(getApplicationContext(), AF_DEV_KEY);
Avertissement
Utilisez l'API stop uniquement lorsque vous souhaitez exclure un utilisateur de toute identification. L'utilisation de cette API impacte FORTEMENT votre attribution, votre collecte des données et votre mécanisme de deep linking.
Anonymisation des données de l'utilisateur
Utilisez cette API lors de l'initialisation du SDK pour anonymiser explicitement les installations, les évènements et les sessions d'un utilisateur :
public void anonymizeUser(boolean isDisabled);
Exemple d'utilisation :
AppsFlyerLib.getInstance().anonymizeUser(true);
L'identification peut être redémarrée en appelant anonymizeUser
réglé sur false.
Avertissement
L'anonymisation des utilisateurs impacte FORTEMENT vos informations d'attribution.Utilisez cette option UNIQUEMENT pour les régions dans lesquelles vous êtes légalement tenu de ne pas collecter les informations de vos utilisateurs.
Exclure les partenaires de l'obtention de données
Dans certains cas, les annonceurs peuvent choisir de cesser le partage de données de niveau utilisateur avec des réseaux publicitaires/partenaires pour certains utilisateurs. Parmi les motifs on retrouve :
- Les politiques de confidentialité telles que la CCPA ou le RGPD
- Les mécanismes de retrait des utilisateurs
- La concurrence avec certains partenaires (ad networks, tiers)
AppsFlyer fournit deux méthodes d'API pour arrêter le partage de données avec l'ensemble des partenaires ou avec certains d'entre eux :
- setSharingFilter : utilisée par les annonceurs pour définir certains (un ou plusieurs) réseaux/partenaires intégrés à exclure de l'obtention de données.
- setSharingFilterForAllPartners : utilisée par les annonceurs pour exclure tous les réseaux/partenaires intégrés de l'obtention de données.
Ces méthodes de filtrage sont prises en charge à partir de la version 5.4.1 du SDK.
La méthode de filtrage doit être appelée à chaque fois que le SDK est initialisé et affecte la session entière. Si un délai est requis pour déterminer si vous devez définir les filtres de partage, mieux vaut retarder l'initialisation du SDK.
Lorsque la méthode est activée avant le premier appel start :
- Les utilisateurs des SRN sont attribués comme organiques, et leurs données ne sont pas partagées avec les partenaires intégrés.
- Les utilisateurs des réseaux publicitaires par clic (non-SRN) sont attribués correctement dans AppsFlyer, mais ne sont pas partagés avec ceux-ci via postback, API, rapport de données brutes, ou toute autre méthode.
Actuellement, les données de désinstallation ne peuvent pas être filtrées à l'aide de ces méthodes. Vous pouvez toutefois arrêter d'envoyer des événements de désinstallation aux partenaires en utilisant leurs pages de configuration dans AppsFlyer.
getAppsFlyerUID
Description |
Obtenir l'ID AppsFlyer. Pour plus d'informations, veuillez cliquer ici. |
Signature de la méthode |
|
Exemple d'utilisation |
|
onAppOpenAttribution
Description |
Obtenir des données de deep linking lorsqu'une app s'ouvre via un deep link. |
Signature de la méthode |
|
onAttributionFailure
Description |
Gérer des erreurs lors de l'obtention de données de deep linking. |
Signature de la méthode |
|
onConversionDataSuccess
Description |
Obtenir les données de conversion après une installation. Utile pour le deep linking différé. Remarque :depuis le SDK V5, |
Signature de la méthode |
|
onConversionDataFail
Description |
Gérer les erreurs lors de l'échec de l'obtention des données de conversion des installations. |
Signature de la méthode |
|
onDeepLinking
Description |
Envoyez des utilisateurs mobiles avec et sans votre app installée vers une activité in-app spécifique dès l'ouverture de l'app. En savoir plus |
Signature de la méthode |
|
onRequestFailure
Description |
Méthode de rappel pour AppsFlyerRequestListener. Appelée lorsque le SDK ne parvient pas à rapporter le lancement d'app. |
Signature de la méthode |
|
Exemple d'utilisation |
Consultez Définir un port d'écoute de demande. |
onRequestSuccess
Description |
Méthode de rappel pour AppsFlyerRequestListener. Appelée lorsque le SDK rapporte avec succès le lancement d'app. |
Signature de la méthode |
|
Exemple d'utilisation |
Consultez Définir un port d'écoute de demande. |
performOnAppAttribution
Description |
Cette fonction permet aux développeurs de relancer manuellement onAppOpenAttribution avec un lien spécifique (URI ou URL), sans avoir à enregistrer un nouveau lien de réengagement. Cette méthode peut être requise s'il faut que l'app redirige les utilisateurs en fonction du lien donné ou si vous devez résoudre le lien court AppsFlyer en restant au premier plan. Cela peut s'avérer nécessaire pour la raison suivante : onAppOpenAttribution ne sera appelé que si l'app a été ouverte via le deep link. |
Signature de la méthode |
|
Exemple d'utilisation |
|
logSession
Description |
Signaler les sessions si votre app est une application utilitaire qui s'exécute en arrière-plan. |
Signature de la méthode |
|
Exemple d'utilisation |
|
sendDeepLinkData (obsolète depuis la version 5.3.0)
Description |
Cette méthode n'est plus utilisée pour vérifier que vous obtenez bien les données attribuées, et ce même si l'utilisateur est deep linké vers une activité spécifique. Assurez-vous plutôt que start() a bien été appelé. Pour plus d'informations, veuillez cliquer ici. |
Signature de la méthode |
|
Exemple d'utilisation |
|
sendPushNotificationData
Description |
Mesurer et obtenir des données de campagnes de notifications push. Pour plus d'informations, consultez Mesurer les notifications push. |
Signature de la méthode |
|
Exemple d'utilisation |
|
setAdditionalData
Description |
Ajouter des données supplémentaires à envoyer aux plates-formes partenaires externes. |
Signature de la méthode |
|
Exemple d'utilisation |
Consultez Définir des données supplémentaires. |
setAndroidIdData
Description |
Envoyez l'ID Android à AppsFlyer. Consulter OAID, IMEI et ID Android. |
Signature de la méthode |
|
Exemple d'utilisation |
|
setAppInviteOneLink
Description |
Définir l'ID du modèle OneLink utilisé afin de créer des liens d'attribution personnalisés pour les invitations utilisateur. |
Signature de la méthode |
|
Exemple d'utilisation |
Consultez Configurer OneLink pour l'attribution des invitations utilisateur. |
setCollectAndroidID
Description |
Indiquer si l'ID Android doit être envoyé à AppsFlyer. |
Signature de la méthode |
|
Exemple d'utilisation |
Consulter OAID, IMEI et ID Android. |
setCollectIMEI
Description |
Indiquer si l'IMEI doit être envoyé à AppsFlyer. |
Signature de la méthode |
|
Exemple d'utilisation |
Consulter OAID, IMEI et ID Android. |
setCustomerIdAndLogSession
Description |
Initie le SDK dès qu'un ID utilisateur du client est disponible. Pour plus d'informations, consultez Retarder l'initialisation du SDK pour l'ID utilisateur du client. |
Signature de la méthode |
|
Exemple d'utilisation |
|
Définir l'ID Utilisateur-Client
Description |
Définir l'ID utilisateur du client. Pour plus d'informations, consultez Définir l'ID utilisateur du client. |
Signature de la méthode |
|
Exemple d'utilisation |
|
setDebugLog
Description |
Activer les journaux de débogage. Consultez Débogage pour Android. |
Signature de la méthode |
|
Exemple d'utilisation |
|
anonymizeUser
Description |
Anonymiser les installations, évènements et sessions d'un utilisateur. Pour plus d'informations, consultez Anonymiser les données de l'utilisateur. |
Signature de la méthode |
|
Exemple d'utilisation |
|
setLogLevel
Description |
Définir le niveau de journal du SDK d'AppsFlyer. |
Signature de la méthode |
|
Exemple d'utilisation |
|
setMinTimeBetweenSessions
Description |
Définir la durée minimale entre les sessions. Pour plus d'informations, consultez Personnaliser la durée entre les sessions. |
Signature de la méthode |
|
Exemple d'utilisation |
|
setOaidData
Description |
Envoyez l'OAID à AppsFlyer. Consulter OAID, IMEI et ID Android. |
Signature de la méthode |
|
Exemple d'utilisation |
|
setOutOfStore
Description |
Spécifier l'app store alternative depuis laquelle l'app a été téléchargée. |
Signature de la méthode |
|
Exemple d'utilisation |
|
setPreinstallAttribution
Description |
Définir le SDK pour rapporter la pré-installation lors du lancement d'une application pré-installée. |
Signature de la méthode |
|
Exemple d'utilisation |
Consultez Campagnes pré-installées pour Android. |
setResolveDeepLinkURLs
Description |
Résoudre OneLink depuis les domaines de clic. Pour plus d’informations, consultez Résoudre les URL Deep Link encapsulées. |
Signature de la méthode |
|
Exemple d'utilisation |
|
setSharingFilter
Description |
Utilisée par les annonceurs pour configurer certains (un ou plusieurs) réseaux/partenaires intégrés qui doivent être exclus de l'obtention des données. En savoir plus |
Signature de la méthode |
|
Exemple d'utilisation |
|
setSharingFilterForAllPartners
Description |
Utilisée par les annonceurs pour exclure tous les réseaux/partenaires intégrés de l'obtention de données. En savoir plus |
Signature de la méthode |
|
Exemple d'utilisation |
|
Démarrer
Description |
Démarrer le SDK au lancement de l'app. Pour plus d'informations, consultez Initialiser le SDK. |
Signature de la méthode |
|
Exemple d'utilisation |
|
stop
Description |
Cesser toutes les fonctionnalités du SDK. Pour plus d'informations, consultez Confidentialité des utilisateurs - exclure. |
Signature de la méthode |
|
Exemple d'utilisation |
|
trackAppLaunch (obsolète depuis la V5.2.0)
Description |
Cette méthode est obsolète. Utilisez start à la place. A deux fonctions :
|
Signature de la méthode |
|
Exemple d'utilisation |
|
logEvent
Description |
Envoyer des évènements in-app à AppsFlyer. Pour plus d'informations, consultez Enregistrement des évènements in-app. |
Signature de la méthode |
|
Exemple d'utilisation |
|
updateServerUninstallToken
Description |
Pour les développeurs qui utilisent Firebase à des fins autres que la mesure des désinstallations. Pour plus d'informations, consultez Mesure des désinstallations. |
Signature de la méthode |
|
Exemple d'utilisation |
|
waitForCustomerUserId
Description |
Retarder l'initialisation du SDK jusqu'à ce que l'ID utilisateur du client soit défini. |
Signature de la méthode |
|
Exemple d'utilisation |
|
appendParametersToDeepLinkingURL
Description |
Les propriétaires d'app qui utilisent des App Links pour le deep linking (sans OneLink) peuvent attribuer des sessions qui sont initiées via un domaine associé à leur app. Appelez cette méthode avant d'appeler start.
|
Signature de la méthode |
|
Exemple d'utilisation |
|
API obsolètes
En cas d'API obsolète, la méthode est remplacée. C'est donc le moment idéal pour que les développeurs mettent à jour leur code.
La date d'échéance est le moment où la méthode cesse de fonctionner ou bien continue de fonctionner mais avec des capacités limitées.
Nom de l'API / interface | Obsolète depuis la version | Avis d'échéance | Changé en |
---|---|---|---|
trackAppLaunch |
5.2.0 |
2020-10-14 |
|
sendDeepLinkData |
5.3.0 |
2020-10-14 |
|
stopTracking |
6.0.0 |
|
stop |
setCustomerIdAndTrack |
6.0.0 |
|
setCustomerIdAndLogSession |
startTracking |
6.0.0 |
|
Démarrer |
trackLocation |
6.0.0 |
|
logLocation |
reportTrackSession |
6.0.0 |
|
logSession |
trackEvent |
6.0.0 |
|
logEvent |
setDeviceTrackingDisabled |
6.0.0 |
|
anonymizeUser |
validateAndTrackInAppPurchase |
6.0.0 |
|
validateAndLogInAppPurchase |
isStopTracking |
6.0.0 |
|
isStopped |
trackAndOpenStore |
6.0.0 |
|
logAndOpenStore |
trackCrossPromoteImpression |
6.0.0 |
|
logCrossPromoteImpression |
trackInvite |
6.0.0 |
|
logInvite |
AppsFlyerTrackingRequestListener |
6.0.0 |
|
AppsFlyerRequestListener |
Commentaires
Vous devez vous connecter pour laisser un commentaire.