En bref : le SDK iOS AppsFlyer V6.X, communément appelé SDK, fournit des fonctionnalités d'attribution d'app et de reporting d'événements aux apps iOS, et il permet aux propriétaires et développeurs d'app de se préparer à la sortie d'iOS 14. Cette version de SDK intègre des changements de méthode significatifs par rapport aux versions précédentes.
Notes de version (jusqu'à la V6.1.2)
Important !
L'iOS SDK V5.4.4 est totalement opérationnel sous iOS 14. Cependant, nous recommandons de faire la mise à jour vers le SDK V6 pour assurer la compatibilité avec les futures versions d'iOS. Vous pouvez consulter la mise à jour du SDK iOS V6.
L'attribution des clips d'app Apple est disponible à partir de la version V6.0.8 du SDK IOS.
1. Aperçu
Le SDK offre des fonctionnalités d'enregistrement d'installation d'app et d'événements. Le SDK est robuste, sécurisé, léger et simple à intégrer.
Vous pouvez enregistrer les installations, les mises à jour, les sessions et les évènements in-app. Les événements in-app prennent en charge les achats in-app, niveaux de jeu, et autres pour évaluer le ROI et la qualité de l'utilisateur.
Version iOS | Modèles d'attribution pris en charge |
---|---|
iOS 13 et précédente |
|
iOS 14 et supérieure |
|
* iOS SDK V5.4 et - :
|
1.1 Intégration du SDK - Ce qu'il faut faire
Onglet | Objectif | Résultat |
---|---|---|
Intégration du SDK |
Indique comment ajouter et configurer le SDK. |
|
API principales |
Indique comment utiliser les API principales du SDK. Ces API permettent de mesurer les évènements in-app et les revenus, d'effectuer du deep linking et de regrouper des données de conversion. |
Les évènements in-app et les revenus apparaissent sur votre tableau de bord. Vous pouvez effectuer du deep linking. |
Indique comment implémenter et utiliser des API optionnelles telles que la mesure de désinstallation, les Références (attribution d'invitation d'utilisateur) et les notifications push. |
Vous pouvez mesurer les désinstallations, les références, l'engagement des utilisateurs via notifications push, gérer les scénarios de confidentialité et plus encore. |
|
Référence rapide des API du SDK pour les développeurs |
|
1.2 Compatibilité du SDK avec iOS
- Ce SDK est :
- Compatible avec tous les appareils iOS et tvOS (iPhone, iPod, iPad, Apple TV) avec iOS version 6 et versions ultérieures et tvOS version 9 et versions ultérieures.
- Conforme aux réseaux DNS64/NAT64 IPv6 d'Apple.
Remarque
Les clips de l'app Apple iOS 14 arrivent ! Découvrez-les dans notre Grand guide des clips d'app pour les développeurs
Cet onglet explique la façon d'implémenter et d'initialiser le SDK. Il est destiné aux développeurs d'applications. Après avoir terminé cet onglet, deux installations apparaîtront sur le tableau de bord de votre app, une organique et une non organique.
2. Ajouter le SDK à votre app
2.1 Télécharger et ajouter le SDK à Xcode
- Télécharger et installer la dernière version de CocoaPods.
- Ajoutez la ligne suivante à votre
Podfile
:
pod 'AppsFlyerFramework'
- Exécutez
pod install
. - Utilisez le fichier
.xcworkspace
pour ouvrir le projet dans Xcode, à la place du fichier.xcodeproj
à partir de ce stade.
Remarque
Si vous développez une application tvOS, CocoaPods ajoute automatiquement les dépendances pertinentes d'AppsFlyerFramework.
- Installer la dernière version de Carthage.
- Ajoutez la ligne suivante à votre Cartfile binaire :
https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerFramework/master/Carthage/appsflyer-ios.json
Remarque
Le lien ci-dessus renvoie à une bibliothèque statique. Si vous effectuez une mise à niveau vers une version iOS plus récente, procédez comme suit :
- Supprimez l'étape Run Script de Xcode qui exécute les frameworks de copie.
- Assurez-vous que la bibliothèque n'est pas intégrée.
Pour en savoir plus, voir documents Carthage .
Ne prend pas en charge les applications tvOS actuellement.
- Télécharger le SDK iOS en tant que cadre statique.Pour vérifier l’intégrité du téléchargement de cadre statique SDK, cliquez ici.
- Décompressez le fichier AppsFlyerLib.framework.zip que vous venez de télécharger
- Faites glisser le AppsFlyerLib.framework et déposez-le dans votre projet Xcode
- Assurez-vous que Copier les éléments si nécessaire est coché.
Remarque
Cette approche n'est compatible qu'avec iOS 8 et les versions ultérieures.
Pour les applications tvOS, vous avez besoin d'un autre AppsFlyerFramework :
- Clonez ce dépôt.
- Trouvez AppsFlyerLib.framework dans ce dossier de dépôt cloné.
- Répétez les étapes 3 et 4.
2.2 Ajouter des infrastructures de support
Ce SDK ajoute et utilise automatiquement les infrastructures natives suivants :
- AdSupport.framework
- Ce cadre est nécessaire pour collecter l’IDFA des appareils.
Sans IDFA vous ne pouvez pas attribuer d'installations à Facebook Ads, Twitter, Google Ads et aux autres réseaux. - iAd.framework
- Ce cadre est nécessaire pour enregistrer et mesurer les performances des Apple Search Ads dans votre application.
Si vous souhaitez supprimer ces infrastructures et désactiver la collecte IDFA :
- Pour désactiver la collecte IDFA, consultez les instructions ici .
- Pour désactiver iAd.framework, consultez les instructions ici.
SDK en mode strict
Utilisez le SDK en mode strict pour supprimer complètement la fonctionnalité de collecte IDFA et les dépendances de structure AdSupport (par exemple, lors du développement d'une app pour enfant).
Dans votre Podfile
, remplacez la dépendance AppsFlyerLib
par :
pod 'AppsFlyerFramework/Strict','6.1.1'
Remarque : si vous utilisez le SDK en mode strict et que vous appelez disableAdvertisingIdentifier
dans votre app, vous recevrez une erreur de compilation.
Remarque
Si vous utilisez une version du SDK antérieure à la version 4.10.4, vous devez ajouter manuellement des infrastructures de publicité.
Pour ajouter manuellement des infrastructures de publicité :
- Dans votre projet XCode, sélectionnez la cible du projet.
- Sélectionnez l'onglet Général pour votre cible.
- Développez la section Infrastructures et librairies associées.
- Cliquez sur + pour ajouter un cadre.
- Recherchez AdSupport.framework
- Sélectionnez AdSupport.framework dans la liste.
Répétez le processus pour iAd.framework.
3. Implémenter et initialiser le SDK
Cette section décrit comment implémenter et initialiser le SDK iOS d'AppsFlyer.
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.
Marche à suivre :
- Rendez-vous dans le 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
Remarque
Pour prendre en charge les apps iOS qui utilisent SceneDelegate
, voir Initialiser le SDK avec SceneDelegate.
Le code suivant est un exemple d'implémentation. Assurez-vous de modifier les balises <AF_DEV_KEY>
et <APPLE_APP_ID>
selon les besoins.
Dans le fichier AppDelegate.h
:
- Importez l'en-tête
AppsFlyerLib/AppsFlyerLib.h
. - Ajoutez
AppsFlyerLibDelegate
à la déclaration de l'interfaceAppDelegate
.
#import <UIKit/UIKit.h>
#import <AppsFlyerLib/AppsFlyerLib.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate, AppsFlyerLibDelegate>
@end
Dans AppDelegate.m
:
- Dans
didFinishLaunchingWithOptions
, configurez :- La clé dev AppsFlyer
- L'ID de l'app
- Réglages supplémentaires
- Remplacez les rappels
onConversionDataSuccess
etonConversionDataFail
pour traiter les conversions et permettre le deep linking différé. - Remplacez les rappels
onAppOpenAttribution
etonAppOpenAttributionFailure
pour traiter l'attribution et activer le deep linking direct. - Dans le rappel
didReceiveRemoteNotification
, appelezhandlePushNotification
pour attribuer les réengagements de notification push. - Dans
applicationDidBecomeActive
callback, appelezstart
.
#import "AppDelegate.h"
#import <UserNotifications/UserNotifications.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
/** APPSFLYER INIT **/
[AppsFlyerLib shared].appsFlyerDevKey = @"<AF_DEV_KEY>";
[AppsFlyerLib shared].appleAppID = @"<APPLE_APP_ID>";
[AppsFlyerLib shared].delegate = self;
/* Set isDebug to true to see AppsFlyer debug logs */
[AppsFlyerLib shared].isDebug = true;
if (@available(iOS 10, *)) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
}];
} else {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes: UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
[[UIApplication sharedApplication] registerForRemoteNotifications];
return YES;
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[[AppsFlyerLib shared] start];
}
// Deep linking
// Open URI-scheme for iOS 9 and above
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *) options {
[[AppsFlyerLib shared] handleOpenUrl:url options:options];
return YES;
}
// Open URI-scheme for iOS 8 and below
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation {
[[AppsFlyerLib shared] handleOpenURL:url sourceApplication:sourceApplication withAnnotation:annotation];
return YES;
}
// Open Universal Links
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
[[AppsFlyerLib shared] continueUserActivity:userActivity restorationHandler:restorationHandler];
return YES;
}
// Report Push Notification attribution data for re-engagements
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[[AppsFlyerLib shared] handlePushNotification:userInfo];
}
// AppsFlyerLib implementation
//Handle Conversion Data (Deferred Deep Link)
-(void)onConversionDataSuccess:(NSDictionary*) installData {
id status = [installData objectForKey:@"af_status"];
if([status isEqualToString:@"Non-organic"]) {
id sourceID = [installData objectForKey:@"media_source"];
id campaign = [installData objectForKey:@"campaign"];
NSLog(@"This is a non-organic install. Media source: %@ Campaign: %@",sourceID,campaign);
} else if([status isEqualToString:@"Organic"]) {
NSLog(@"This is an organic install.");
}
}
-(void)onConversionDataFail:(NSError *) error {
NSLog(@"%@",error);
}
//Handle Direct Deep Link
- (void) onAppOpenAttribution:(NSDictionary*) attributionData {
NSLog(@"%@",attributionData);
}
- (void) onAppOpenAttributionFailure:(NSError *)error {
NSLog(@"%@",error);
}
@end
Dans le fichier AppDelegate.swift
:
- Importez
AppsFlyerLib
. - ajoutez
AppsFlyerLibDelegate
à la déclaration de classeAppDelegate
. - Dans
didFinishLaunchingWithOptions
, configurez :- La clé dev AppsFlyer
- L'ID de l'app
- Réglages supplémentaires
- Remplacez les rappels
onConversionDataSuccess
etonConversionDataFail
pour traiter les conversions et permettre le deep linking différé. - Remplacez les rappels
onAppOpenAttribution
etonAppOpenAttributionFailure
pour traiter l'attribution et activer le deep linking direct. - Dans le rappel
didReceiveRemoteNotification
, appelezhandlePushNotification
pour attribuer les réengagements de notification push. - Dans
applicationDidBecomeActive
callback, appelezstart
.
import UIKit
import AppsFlyerLib
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
let defaults = UserDefaults.standard
//MARK: LifeCycle
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
AppsFlyerLib.shared().appsFlyerDevKey = "<AF_DEV_KEY>"
AppsFlyerLib.shared().appleAppID = "<APPLE_APP_ID>"
AppsFlyerLib.shared().delegate = self
AppsFlyerLib.shared().isDebug = true
// iOS 10 or later
if #available(iOS 10, *) {
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound]) { _, _ in }
application.registerForRemoteNotifications()
}
// iOS 9 support - Given for reference. This demo app supports iOS 13 and above
else {
application.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil))
application.registerForRemoteNotifications()
}
return true
}
func applicationDidBecomeActive(_ application: UIApplication) {
// Start the SDK (start the IDFA timeout set above, for iOS 14 or later)
AppsFlyerLib.shared().start()
}
// Open Univerasal Links
// For Swift version < 4.2 replace function signature with the commented out code:
// func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
print(" user info \(userInfo)")
AppsFlyerLib.shared().handlePushNotification(userInfo)
}
// Open Deeplinks
// Open URI-scheme for iOS 8 and below
private func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
AppsFlyerLib.shared().continue(userActivity, restorationHandler: restorationHandler)
return true
}
// Open URI-scheme for iOS 9 and above
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
AppsFlyerLib.shared().handleOpen(url, sourceApplication: sourceApplication, withAnnotation: annotation)
return true
}
// Report Push Notification attribution data for re-engagements
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
AppsFlyerLib.shared().handleOpen(url, options: options)
return true
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
AppsFlyerLib.shared().handlePushNotification(userInfo)
}
// Reports app open from deep link for iOS 10 or later
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
AppsFlyerLib.shared().continue(userActivity, restorationHandler: nil)
return true
}
}
//MARK: AppsFlyerLibDelegate
extension AppDelegate: AppsFlyerLibDelegate{
// Handle Organic/Non-organic installation
func onConversionDataSuccess(_ installData: [AnyHashable: Any]) {
print("onConversionDataSuccess data:")
for (key, value) in installData {
print(key, ":", value)
}
if let status = installData["af_status"] as? String {
if (status == "Non-organic") {
if let sourceID = installData["media_source"],
let campaign = installData["campaign"] {
print("This is a Non-Organic install. Media source: \(sourceID) Campaign: \(campaign)")
}
} else {
print("This is an organic install.")
}
if let is_first_launch = installData["is_first_launch"] as? Bool,
is_first_launch {
print("First Launch")
} else {
print("Not First Launch")
}
}
}
func onConversionDataFail(_ error: Error) {
print(error)
}
//Handle Deep Link
func onAppOpenAttribution(_ attributionData: [AnyHashable : Any]) {
//Handle Deep Link Data
print("onAppOpenAttribution data:")
for (key, value) in attributionData {
print(key, ":",value)
}
}
func onAppOpenAttributionFailure(_ error: Error) {
print(error)
}
}
3.2.1 Initialisez le SDK avec SceneDelegate
Utilisez cette méthode d'initialisation uniquement si vous utilisez SceneDelegate
.
Puisque applicationDidBecomeActive
n'est pas appelé lorsque vous utilisez SceneDelegate
, utilisez la solution de contournement UIApplicationDidBecomeActiveNotification
pour initialiser le SDK, comme le montre l'exemple suivant.
Le code suivant est un exemple d'implémentation. Assurez-vous de modifier les balises <AF_DEV_KEY>
et <APPLE_APP_ID>
selon les besoins.
Dans le fichier AppDelegate.h
:
- Importez l'en-tête
AppsFlyerLib/AppsFlyerLib.h
. - Ajoutez
AppsFlyerLibDelegate
à la déclaration de l'interfaceAppDelegate
.
#import <AppsFlyerLib/AppsFlyerLib.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate, AppsFlyerLibDelegate>
@end
Dans AppDelegate.m
:
- Dans le rappel
didFinishLaunchingWithOptions
, configurez :- La clé dev AppsFlyer
- L'ID de l'app
- Réglages supplémentaires
- Remplacez les rappels
onConversionDataSuccess
etonConversionDataFail
pour traiter les conversions et permettre le deep linking différé. - Remplacez les rappels
onAppOpenAttribution
etonAppOpenAttributionFailure
pour traiter l'attribution et activer le deep linking direct. - Dans le rappel
didReceiveRemoteNotification
, appelezhandlePushNotification::userInfo
pour attribuer les réengagements de notification push. - Dans le rappel
sendLaunch
, appelezstart
.
#import "AppDelegate.h"
#import <AppsFlyerLib/AppsFlyerLib.h>
#import <UserNotifications/UserNotifications.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
// Start the AppsFlyer SDK
- (void)sendLaunch:(UIApplication *)application {
[[AppsFlyerLib shared] start];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
/** APPSFLYER INIT **/
[AppsFlyerLib shared].appsFlyerDevKey = @"<AF_DEV_KEY>";
[AppsFlyerLib shared].appleAppID = @"<APPLE_APP_ID>";
[AppsFlyerLib shared].delegate = self;
/* Set isDebug to true to see AppsFlyer debug logs */
[AppsFlyerLib shared].isDebug = true;
// Use UIApplicationDidBecomeActiveNotification to start the SDK
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(sendLaunch:)
name:UIApplicationDidBecomeActiveNotification
object:nil];
return YES;
}
if (@available(iOS 10, *)) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
}];
} else {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes: UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
[[UIApplication sharedApplication] registerForRemoteNotifications];
return YES;
}
// Report Push Notification attribution data for re-engagements
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[[AppsFlyerLib shared] handlePushNotification:userInfo];
}
// AppsFlyerLib implementation
//Handle Conversion Data (Deferred Deep Link)
-(void)onConversionDataSuccess:(NSDictionary*) installData {
id status = [installData objectForKey:@"af_status"];
if([status isEqualToString:@"Non-organic"]) {
id sourceID = [installData objectForKey:@"media_source"];
id campaign = [installData objectForKey:@"campaign"];
NSLog(@"This is a none organic install. Media source: %@ Campaign: %@",sourceID,campaign);
} else if([status isEqualToString:@"Organic"]) {
NSLog(@"This is an organic install.");
}
}
-(void)onConversionDataFail:(NSError *) error {
NSLog(@"%@",error);
}
//Handle Direct Deep Link
- (void) onAppOpenAttribution:(NSDictionary*) attributionData {
NSLog(@"%@",attributionData);
}
- (void) onAppOpenAttributionFailure:(NSError *)error {
NSLog(@"%@",error);
}
// support for scene delegate
#pragma mark - UISceneSession lifecycle
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options API_AVAILABLE(ios(13)){
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet *)sceneSessions API_AVAILABLE(ios(13.0)){
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
@end
Dans le fichier SceneDelegate.m
:
- Dans le rappel
openURLContexts
, appelezhandleOpenUrl
. - Dans le rappel
continueUserActivity
, appelezcontinueUserActivity
.
#import "SceneDelegate.h"
@interface SceneDelegate ()
@end
@implementation SceneDelegate
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts API_AVAILABLE(ios(13.0)){
NSURL* url = [[URLContexts allObjects] objectAtIndex:0].URL;
if(url){
[[AppsFlyerLib shared] handleOpenUrl:url options:nil];
}
}
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity API_AVAILABLE(ios(13.0)){
[[AppsFlyerLib shared]continueUserActivity:userActivity restorationHandler:nil];
}
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
NSUserActivity *activity = [[connectionOptions userActivities] allObjects].firstObject;
if (activity) {
[self scene:scene continueUserActivity:activity];
}
[self scene:scene openURLContexts: [connectionOptions URLContexts]];
}
- (void)sceneDidDisconnect:(UIScene *)scene API_AVAILABLE(ios(13.0)){
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
}
- (void)sceneDidBecomeActive:(UIScene *)scene API_AVAILABLE(ios(13.0)){
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}
- (void)sceneWillResignActive:(UIScene *)scene API_AVAILABLE(ios(13.0)){
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
}
- (void)sceneWillEnterForeground:(UIScene *)scene API_AVAILABLE(ios(13.0)){
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
}
- (void)sceneDidEnterBackground:(UIScene *)scene API_AVAILABLE(ios(13.0)){
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
}
@end
Dans le fichier AppDelegate.swift
:
- Importez
AppsFlyerLib
. - Ajoutez
AppsFlyerLibDelegate
à la déclaration de classeAppDelegate
. - Dans le rappel
didFinishLaunchingWithOptions
, configurez votre :- La clé dev AppsFlyer
- L'ID de l'app
- Réglages supplémentaires
- Remplacez les rappels
onConversionDataSuccess
etonConversionDataFail
pour traiter les conversions et permettre le deep linking différé. - Remplacez les rappels
onAppOpenAttribution
etonAppOpenAttributionFailure
pour traiter l'attribution et activer le deep linking direct - Dans le rappel
didReceiveRemoteNotification
, appelezhandlePushNotification
pour attribuer les réengagements de notification push. - Dans le rappel
sendLaunch
, appelezstart
.
import UIKit
import AppsFlyerLib
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, AppsFlyerLibDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
AppsFlyerLib.shared().appsFlyerDevKey = "<AF_DEV_KEY>"
AppsFlyerLib.shared().appleAppID = "<APPLE_APP_ID>"
AppsFlyerLib.shared().delegate = self
AppsFlyerLib.shared().isDebug = true
NotificationCenter.default.addObserver(self, selector: NSSelectorFromString("sendLaunch"), name: UIApplication.didBecomeActiveNotification, object: nil)
return true
}
@objc func sendLaunch() {
AppsFlyerLib.shared().start()
}
// MARK: UISceneSession Lifecycle
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
}
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
//MARK: -GCD
func onConversionDataSuccess(_ installData: [AnyHashable: Any]) {
print("onConversionDataSuccess data:")
for (key, value) in installData {
print(key, ":", value)
}
if let status = installData["af_status"] as? String {
if (status == "Non-organic") {
if let sourceID = installData["media_source"],
let campaign = installData["campaign"] {
print("This is a Non-Organic install. Media source: \(sourceID) Campaign: \(campaign)")
}
} else {
print("This is an organic install.")
}
if let is_first_launch = installData["is_first_launch"] as? Bool,
is_first_launch {
print("First Launch")
} else {
print("Not First Launch")
}
}
}
func onConversionDataFail(_ error: Error!) {
if let err = error{
print(err)
}
}
func onAppOpenAttribution(_ attributionData: [AnyHashable : Any]!) {
if let data = attributionData{
print("\(data)")
}
}
func onAppOpenAttributionFailure(_ error: Error!) {
if let err = error{
print(err)
}
}
}
Dans le fichier SceneDelegate.swift
:
- Importez
AppsFlyerLib
. - Dans le rappel
openURLContexts
, appelezAppsFlyerLib.shared().handleOpen
. - Dans le rappel
continue
, appelezAppsFlyerLib.shared().continue
.
import UIKit
import AppsFlyerLib
@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Processing Universal Link from the killed state
if let userActivity = connectionOptions.userActivities.first {
self.scene(scene, continue: userActivity)
}
// Processing URI-scheme from the killed state
self.scene(scene, openURLContexts: connectionOptions.urlContexts)
guard let _ = (scene as? UIWindowScene) else { return }
}
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
AppsFlyerLib.shared().continue(userActivity, restorationHandler: nil)
}
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
if let url = URLContexts.first?.url {
AppsFlyerLib.shared().handleOpen(url, options: nil)
}
}
func sceneDidDisconnect(_ scene: UIScene) {
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
}
func sceneDidBecomeActive(_ scene: UIScene) {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}
func sceneWillResignActive(_ scene: UIScene) {
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
}
func sceneWillEnterForeground(_ scene: UIScene) {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
}
func sceneDidEnterBackground(_ scene: UIScene) {
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
}
}
3.3 Soutien à l'attribution du SKAdNetwork
SKAdNetwork est une classe utilisée par iOS qui valide les installations d'app pilotées par les annonceurs. Le processus de validation de l'installation d'une app implique l'app source et l'app annoncée.
Une app source est une app qui participe à des campagnes publicitaires en affichant des publicités signées par un ad network. La configuration de votre app pour l'affichage de publicités sort du cadre du SDK AppsFlyer. Pour configurer, suivez les instructions d'Apple.
Pour l'app annoncée (l'app avec le SDK AppsFlyer), la solution AppsFlyer SKAdNetwork utilise SKAdNetwork pour fournir le postback d'attribution pendant tandis qu'AppsFlyer collecte, traduit et agrège les données, tout en préservant la vie privée des utilisateurs. Lors du premier lancement de l'app, la plate-forme AppsFlyer indique au SDK comment définir la valeur de conversion SKAdNetwork en utilisant la configuration définie par le marketeur.
Pour utiliser la Solution SKAdNetwork :
- Le développeur n'a rien à faire.
-
Le SDK AppsFlyer appelle automatiquement les API SKAdNetwork nécessaires, c'est-à-dire
registerAppForAdNetworkAttribution ()
etupdateConversionValue ()
. Le développeur ne doit pas les appeler. - N'autorisez pas d'autres SDK à appeler les API SKAdNet. Cela risquerait de retarder l'envoi du postback par IOS à AppsFlyer, et de modifier la valeur de conversion que nous utilisons pour calculer les métriques de qualité des utilisateurs du tableau de bord SKAdNetwork.
- Le marketeur doit configurer la mesure SKAdNetwork dans AppsFlyer.
Aucune action ou procédure d'enregistrement n'est requise dans l'app store, que ce soit par le développeur ou le marketeur.
3.4 Retarder l'initialisation du SDK
Vous pouvez retarder l'initialisation du SDK et l'envoi de données jusqu'à ce que l'utilisateur donne son consentement (par exemple, pour le RGPD ou le COPPA).
Remarque : ceci est sans rapport avec l'ATT introduit dans l'iOS 14.
Pour retarder l'initialisation du SDK :
- Empêchez la session d'être envoyée sur la transition arrière-plan/premier plan. Avec la méthode sendLaunch() (qui sera appelée sur chaque applicationDidBecomeActive - conformément à la section 3.3), encapsulez l'appel pour appeler
start
avec une vérification de la condition. Par exemple :
-(void)sendLaunch:(UIApplication *)application { if (consent_given) { // check the condition [[AppsFlyerLib shared] start]; // Start } }
-
Envoyez la session dès que la temporisation ne se justifie plus (juste après le changement de condition). Appelez
start
lorsque vous êtes prêt à envoyer les données de la première session. Par exemple :
... consent_given = YES; // change the condition [[AppsFlyerLib shared] start]; // Start ...
4. Tester les installations
Vous êtes maintenant 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 :
- Assurez-vous que l'app n'est pas installée sur votre appareil.
- Enregistrez l'appareil sur lequel vous allez effectuer le 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 Xcode, ouvrez le terminal de débogage.
- Depuis Xcode Studio, installez l'app sur l'appareil ou l'émulateur.
- Attendez que l'application se lance.
- Dans le terminal de débogage, recherchez le nom du package de l'app.
Vous devriez voir ce qui suit :
L'envoi de start() dans le journal indique que le SDK signale une installation. Ces données proviennent de la méthodeonConversionDataSuccess
d'App Delegate. 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 inférieure à la version 5.0.0, le nom de la méthode est onConversionDataReceived
. Nous vous recommandons une mise à niveau vers le SDK 5.0.0. Pour en savoir plus, cliquez ici.
Une installation organique devrait maintenant apparaître sur la page Présentation du tableau de bord de l'app.
Si vous ne voyez pas l'installation sur le tableau de bord de l'app, consultez le 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.
Marche à suivre :
- Trouvez quel est l'ID iTunes de votre app, par exemple id123456789.
- Dans l'URL ci-dessous, remplacez <APP_ID> par l'ID itunes de votre app :
Le paramètrehttps://app.appsflyer.com/<APP_ID>?pid=sdk_test&c=sdk_test
pid
représente le nom de la source média. Le paramètrec
représente le nom de la campagne. - Envoyez cette URL à l'appareil (via email ou WhatsApp par exemple).
- Sur l'appareil, cliquez sur l'URL.
- Si l'app est répertoriée dans l'app store, vous serez redirigé vers l'app store. Ne pas télécharger 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 Xcode Studio, ouvrez le terminal de débogage.
- Connectez l'appareil à votre ordinateur à l'aide d'un câble USB.
- Depuis Xcode, installez l'app sur l'appareil.
- Dans le terminal de débogage, recherchez l'ID itunes de votre app.
Vous devriez voir ce qui suit :
Une installation non organique devrait maintenant apparaître sur la page Présentation du tableau de bord de l'app.
Remarque
Lorsque vous avez terminé de tester et de déboguer l'intégration du SDK, désactivez les journaux du SDK .
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. Enregistrer 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 contient deux types de constantes qui représentent les informations liées aux événements in app.
- Noms d'événements - ces constantes sont au format
AFEventEventName
.
Par exempleAFEventPurchase
,AFEventAddToCart
. - Paramètres d'événement - Ces constantes sont au format
AFEventParameterParameterName
.
Par exempleAFEventParameterRevenue
,AFEventParamaterContentId
.
Nous recommandons fortement d'utiliser ces constantes 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 AppsFlyerLib.h si vous utilisez Objective-C (ou AppsFlyerLib si vous utilisez Swift :
Ajoutez ceci dans le fichier d'implémentation de classe.
#import AppsFlyerLib.h
Ajoutez ceci dans le fichier de classe Swift.
import AppsFlyerLib
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, cliquez 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 devise par défaut est USD).
- Vous pouvez définir le code de devise pour tous les événements en appelant la propriété suivante :
- Objective-C:
[AppsFlyerLib shared].currencyCode = @"ZZZ";
, - Swift:
AppsFlyerLib.shared().currencyCode = "ZZZ"
- Objective-C:
- 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
[[AppsFlyerLib shared] logEvent: @"purchase"
withValues:@{
AFEventParamContentId:@"1234567",
AFEventParamContentType : @"category_a",
AFEventParamRevenue: @200,
AFEventParamCurrency:@"USD"
}];
AppsFlyerLib.shared().logEvent("purchase",
withValues: [
AFEventParamContentId:"1234567",
AFEventParamContentType : "category_a",
AFEventParamRevenue: 200,
AFEventParamCurrency:"USD"
]);
L’événement d’achat ci-dessus a un revenu de 200 USD, apparaissant en tant que 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, si l'utilisateur reçoit un remboursement ou annule un abonnement.
[[AppsFlyerLib shared] logEvent: @"cancel_purchase"
withValues:@{
AFEventParamContentId:@"1234567",
AFEventParamContentType : @"category_a",
AFEventParamRevenue: @-1.99,
AFEventParamCurrency:@"USD"
}];
AppsFlyerLib.shared().logEvent("cancel_purchase",
withValues: [
AFEventParamContentId:"1234567",
AFEventParamContentType : "category_a",
AFEventParamRevenue: -1.99,
AFEventParamCurrency:"USD"
]);
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 AppsFlyer fournit une vérification 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é.
Cet appel contient deux blocs de callback, l'un pour la « réussite » et l'autre pour « l'échec » (quelle qu'en soit la raison, y compris l'échec de validation). En cas de réussite, un dictionnaire est retourné avec les données de validation de reçu fournies par les serveurs d’Apple.
Exemple de validation d'un achat :
- (void) validateAndLogInAppPurchase:(NSString *) productIdentifier
price:(NSString *) price
currency:(NSString *) currency
transactionId:(NSString *) tranactionId
additionalParameters:(NSDictionary *) params
success:(void (^)(NSDictionary *response)) successBlock
failure:(void (^)(NSError *error, id reponse)) failedBlock;
[[AppsFlyerLib shared] validateAndLogInAppPurchase:@"ProductIdentifier" price:@"price"
currency:@"USD"
transactionId:@"transactionID"
additionalParameters:@{@"test": @"val" , @"test1" : @"val 1"}
success:^(NSDictionary *result){
NSLog(@"Purchase succeeded And verified!!! response: %@", result[@"receipt"]);
} failure:^(NSError *error, id response) {
NSLog(@"response = %@", response);
if([response isKindOfClass:[NSDictionary class]]) {
if([response[@"status"] isEqualToString:@"in_app_arr_empty"]){
// retry with 'SKReceiptRefreshRequest' because
// Apple has returned an empty response
// <YOUR CODE HERE>
}
} else {
//handle other errors
return;
}
}];
AppsFlyerLib
.shared()?
.validateAndLogInAppPurchase ("productIdentifier",
price: "price",
currency: "currency",
transactionId: "transactionId",
additionalParameters: [:],
success: {
guard let dictionary = $0 as? [String:Any] else { return }
dump(dictionary)
}, failure: { error, result in
guard let emptyInApp = result as? [String:Any],
let status = emptyInApp["status"] as? String,
status == "in_app_arr_empty" else {
// Try to handle other errors
return
}
// retry with 'SKReceiptRefreshRequest' because
// Apple has returned an empty response
// <YOUR CODE HERE>
})
[AppsFlyerLib shared].useReceiptValidationSandbox = YES;
AppsFlyerLib.shared().useReceiptValidationSandbox = true
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, les autres API SDK à 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
[[AppsFlyerLib shared] logEvent:AFEventPurchase
withValues: @{
AFEventParamRevenue: @200,
AFEventParamCurrency: @"USD",
AFEventParamQuantity: @2,
AFEventParamContentId: @"092",
AFEventParamReceiptId: @"9277"
}];
Remarque
- Le dictionnaire de valeurs d'événement transmis au SDK d'événement doit être valide pour la conversion JSON par NSJSONSerialization. Pour plus d'informations, veuillez cliquer ici.
- Pour les revenus, n'ajoutez pas de symboles monétaires car ils ne sont pas reconnus.
AppsFlyerLib.shared().logEvent(AFEventPurchase,
withValues: [
AFEventParamRevenue: "200",
AFEventParamCurrency: "USD",
AFEventParamQuantity: 2,
AFEventParamContent: "shoes",
AFEventParamContentId: "092",
AFEventParamReceiptId: "9277"]);
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
- Événement in-app enregistré avec succès.
- Une erreur s'est produite lors de l'enregistrement d'un événement in-app.
[[AppsFlyerLib shared] logEventWithEventName:AFEventPurchase
eventValues: @{
AFEventParamRevenue: @200,
AFEventParamCurrency: @"USD",
AFEventParamQuantity: @2,
AFEventParamContentId: @"092",
AFEventParamReceiptId: @"9277"
}
completionHandler:^(NSDictionary<NSString *,id> * _Nullable dictionary, NSError * _Nullable error){
if(dictionary != nil) {
NSLog(@"In app callback success:");
for(id key in dictionary){
NSLog(@"Callback response: key=%@ value=%@", key, [dictionary objectForKey:key]);
}
}
if(error != nil) {
NSLog(@"In app callback error:", error);
}
}];
AppsFlyerLib.shared().logEvent(name: "In app event name", values: ["id": 12345, "name": "John doe"], completionHandler: { (response: [String : Any]?, error: Error?) in
if let response = response {
print("In app event callback Success: ", response)
}
if let error = error {
print("In app event callback ERROR:", error)
}
})
}
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 'isStopTracking' enabled" (« Sauter l'événement car isStopTracking 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é dès le premier lancement 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 linking
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
Obtenir les données de conversion
Vous pouvez accéder aux données d’attribution d'utilisateur en temps réel pour chaque nouvelle installation, directement depuis le SDK.
Ce faisant, vous pouvez offrir aux utilisateurs un contenu personnalisé ou les envoyer vers des activités spécifiques au sein de l’application (voir la section Deep linking différé de cet article), ce qui peut considérablement améliorer leur engagement avec votre application.
Pour obtenir les données de conversion depuis le SDK iOS, implémentez les méthodes suivantes :
- (void) onAppOpenAttribution:(NSDictionary*) attributionData {
NSLog(@"onAppOpenAttribution");
for(id key in attributionData){
NSLog(@"onAppOpenAttribution: key=%@ value=%@", key, [attributionData objectForKey:key]);
}
}
- (void)onAppOpenAttributionFailure:(NSError *)error {
NSLog(@"%@", [error description]);
}
-(void)onConversionDataSuccess:(NSDictionary*) installData {
BOOL first_launch_flag = [[installData objectForKey:@"is_first_launch"] boolValue];
NSString *status = [installData objectForKey:@"af_status"];
if(first_launch_flag) {
if ([status isEqualToString:@"Non-organic"]){
NSString *sourceID = [installData objectForKey:@"media_source"];
NSString *campaign = [installData objectForKey:@"campaign"];
NSLog(@"This is a non-organic install. Media source: %@ Campaign: %@", sourceID, campaign);
} else {
NSLog(@"This is an organic install");
}
} else {
NSLog(@"Not first launch");
}
}
-(void)onConversionDataFail:(NSError *) error {
NSLog(@"%@", [error description]);
}
class AppDelegate: UIResponder, UIApplicationDelegate, AppsFlyerLibDelegate{
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
AppsFlyerLib.shared().appsFlyerDevKey = "MY_DEV_KEY"
AppsFlyerLib.shared().appleAppID = "123456789"
AppsFlyerLib.shared().delegate = self
//AppsFlyerLib.shared().isDebug = true
//AppsFlyerLib.shared().appInviteOneLinkID = "ONELINK_ID";
return true
}
func applicationDidBecomeActive(_ application: UIApplication) {
AppsFlyerLib.shared().start()
}
func onConversionDataSuccess(_ installData: [AnyHashable: Any]) {
guard let first_launch_flag = installData["is_first_launch"] as? Int else {
return
}
guard let status = installData["af_status"] as? String else {
return
}
if(first_launch_flag == 1) {
if(status == "Non-organic") {
if let media_source = installData["media_source"] , let campaign = installData["campaign"]{
print("This is a Non-Organic install. Media source: \(media_source) Campaign: \(campaign)")
}
} else {
print("This is an organic install.")
}
} else {
print("Not First Launch")
}
}
func onConversionDataFail(_ error: Error!) {
if let err = error{
print(err)
}
}
func onAppOpenAttribution(_ attributionData: [AnyHashable : Any]!) {
if let data = attributionData{
print("\(data)")
}
}
func onAppOpenAttributionFailure(_ error: Error!) {
if let err = error{
print(err)
}
}
Les deux méthodes les plus importantes sont :
-
onConversionDataSuccess
- 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 inférieure à la version 5.0.0, le nom de la méthode estonConversionDataReceived
. 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
Mesure des désinstallations
Pour connaître la façon de configurer la mesure des désinstallations, cliquez ici.
Définition d'un gestionnaire de démarrage du SDK
Si vous souhaitez recevoir la confirmation que le SDK a bien démarré et que l'information a bien été reçue par les serveurs AppsFlyer, implémentez le gestionnaire startWithCompletionHandler
. Vous pouvez ensuite appliquer cette logique pour gérer le succès ou l'échec du suivi des lancements de SDK.
Exemple d'implémentation
[[AppsFlyerLib shared] startWithCompletionHandler:^(NSDictionary<NSString *,id> *dictionary, NSError *error) {
if (error) {
NSLog(@"%@", error);
return;
}
if (dictionary) {
NSLog(@"%@", dictionary);
return;
}
}];
AppsFlyerLib.shared()?.start(completionHandler: { (dictionnary, error) in
if (error != nil){
print(error ?? "")
return
} else {
print(dictionnary ?? "")
return
}
})
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 'isStopTracking' enabled" (« Sauter l'événement car isStopTracking 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
:
NSDictionary* CustomDataMap = [[NSDictionary alloc] initWithObjectsAndKeys:@"value_of_param_1", @"custom_param_1", nil];
[[AppsFlyerLib shared] setAdditionalData:CustomDataMap];
let CustomDataMap: [AnyHashable: Any] = [
"custom_param_1" : "value_of_param_1"
]
AppsFlyerLib.shared().customData = CustomDataMap
Attribuer des sessions d'app initiées depuis des sites (domaines) propres
Les propriétaires d'app qui utilisent des liens universels 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'app, 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
.
Consultez la référence du SDK iOS 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 shared].minTimeBetweenSessions = <your_custom_time_in_seconds>;
AppsFlyerLib.shared().minTimeBetweenSessions = <your_custom_time_in_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
Non disponible pour iOS.
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.
[AppsFlyerLib shared].resolveDeepLinkURLs = @[@"example.com",@"click.example.com"];
AppsFlyerLib.shared().resolveDeepLinkURLs = ["example.com", "click.example.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 handlePushNotificationData
dans AppDelegate.m.
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[[AppsFlyerLib shared] handlePushNotification:userInfo];
}
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
AppsFlyerLib.shared().handlePushNotification(userInfo)
}
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 unique AppsFlyer est créé pour chaque nouvelle installation d’une application. Vous pouvez utiliser cet ID à différentes fins :
- Envoyez des événements in-app serveur à serveur.
- Faites le correspondre avec les enregistrements d'utilisateurs 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.
Utiliser l’API suivante pour obtenir l’ID unique :
NSString *appsflyerId = [AppsFlyerLib shared].getAppsFlyerUID;
let appsflyerId = AppsFlyerLib.shared().getAppsFlyerUID()
Définir l'ID Utilisateur-Client
Pour définir votre ID Utilisateur-Client :
[AppsFlyerLib shared].customerUserID = @"my user id";
AppsFlyerLib.shared().customerUserID = "my user id"
Dans iOS, l'ID utilisateur du client doit être défini à chaque lancement d'app. 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 :
NSString *customerUserID = [AppsFlyerLib shared].customerUserID;
let customerUserID = AppsFlyerLib.shared().customerUserID
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 l'ID utilisateur client soit défini pour lancer l'initialisation du SDK. Ceci est utile si vous souhaitez que les données d'installation et d'événement contiennent votre ID utilisateur client.
Implémentez le code suivant :
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSString *customUserId = [[NSUserDefaults standardUserDefaults] stringForKey:@"customerUserId"]; // Your custom logic of retrieving CUID
if (customUserId != nil && ![customUserId isEqual: @""]) {
[AppsFlyerLib shared].customerUserID = customUserId; // Set CUID in AppsFlyer SDK for this session
[[AppsFlyerLib shared] start]; // Start
}
}
func applicationDidBecomeActive(_ application: UIApplication) {
let customUserId = UserDefaults.standard.string(forKey: "customUserId") // your logic to retrieve CUID
if(customUserId != nil && customUserId != ""){
AppsFlyerLib.shared().customerUserID = customUserId // Set CUID in AppsFlyer SDK for this session
AppsFlyerLib.shared().start() // Start
}
}
Pour en savoir plus sur la façon de retarder l'initialisation du SDK jusqu'à ce que l'ID utilisateur du client soit disponible, cliquez ici.
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.
12. Confidentialité des utilisateurs
Exclusion
Dans certains cas extrêmes, vous pouvez vouloir arrêter tout enregistrement de données via le SDK en raison de la conformité aux exigences légales et relatives à la vie privée. La propriété isStop le permet. Une fois cette propriété définie sur true, le SDK cesse de fonctionner et ne communique plus avec les serveurs AppsFlyer.
Il existe différents scénarios d'exclusion d'utilisateurs. Nous recommandons vivement de suivre les instructions exactes du scénario qui correspond à votre application.
Avertissement
Utilisez l'API isStopped uniquement lorsque vous souhaitez exclure un utilisateur de tout suivi. L'utilisation de cette API impacte FORTEMENT votre attribution, votre collecte des données et votre mécanisme de deep linking.
[AppsFlyerLib shared].isStopped = true;
AppsFlyerLib.shared().isStopped = true
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 recommencer à consigner les données, réglez isStopped
sur false
.
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 :
[AppsFlyer shared].disableAdvertisingIdentifier = YES;
AppsFlyerLib.shared().disableAdvertisingIdentifier = true
Les données de connexion peuvent être redémarrées en réglant anonymizeUser
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.
Prendre en charge AppTrackingTransparency (ATT)
Les messages d'Apple indiquent qu'à l'avenir, iOS 14 exigera l'autorisation de l'utilisateur pour collecter l'IDFA.
Actuellement, l'IDFA est collecté par défaut. Cependant, pour les versions iOS 14 et +, vous avez la possibilité de demander l'autorisation de l'utilisateur de collecter l'IDFA , et ce par une boite de dialogue qui lui demandera son accord. Si l'utilisateur de donne pas son accord, l'IDFA ne sera pas collectée.Le temps d'attente retarde l'envoi de toute demande aux serveurs AppsFlyer. Une fois le délai dépassé, la demande est envoyée.
Pour demander l'autorisation de collecter l'IDFA à l'utilisateur, ajoutez le code suivant avant start()
:
// The following block is for applications wishing to give users the option to block IDFA collection.
// for iOS 14 and above - The user can be prompted to block IDFA collection.
// If user opts-out, the IDFA will not be collected by the SDK.
// for iOS 13 and below - The IDFA will be collected by the SDK. The user will NOT be prompted to block collection.
if #available(iOS 14, *) {
// Set a timeout for the SDK to wait for the IDFA collection before handling app launch
// If timeout expires before user asks to block IDFA collection, the IDFA will be collected.
[[AppsFlyerLib shared] waitForATTUserAuthorizationWithTimeoutInterval:60];
// Show the user the Apple IDFA consent dialog
(AppTrackingTransparency)
// MUST be called here before start() in order to prevent IDFA collection by the SDK
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
//....
}];
}
// The following block is for applications wishing to give users the option to block IDFA collection.
// for iOS 14 and above - The user can be prompted to block IDFA collection.
// If user opts-out, the IDFA will not be collected by the SDK.
// for iOS 13 and below - The IDFA will be collected by the SDK. The user will NOT be prompted to block collection.
if #available(iOS 14, *) {
// Set a timeout for the SDK to wait for the IDFA collection before handling app launch
// If timeout expires before user asks to block IDFA collection, the IDFA will be collected.
AppsFlyerLib.shared().waitForATTUserAuthorization(timeoutInterval: 60)
// Show the user the Apple IDFA consent dialog (AppTrackingTransparency)
// MUST be called here before start() in order to prevent IDFA collection by the SDK
ATTrackingManager.requestTrackingAuthorization { (status) in
}
}
Pour configurer le texte présenté à l'utilisateur dans la fenêtre popup :
- Sélectionnez le fichier
Info.plist
du projet dans le navigateur de projet Xcode. - Ajoutez une entrée à la liste : appuyez sur
+
à côté deListe des propriétés
. - Faites défiler vers le bas et sélectionnez
Confidentialité - Description des pratiques en matière de suivi
. - Ajoutez en tant que
valeur
la formulation que vous souhaitez présenter à l'utilisateur lorsque vous lui demandez l'autorisation de collecter l'IDFA.
Remarque : textes ATT suggérés
- Pour vous proposer du contenu en fonction de vos préférences personnelles, l'app a besoin de votre autorisation
- Pour vous offrir un contenu personnalisé approprié, l'app doit permettre aux annonceurs d'accéder au device ID de votre appareil
Les actions possibles de l'utilisateur dans la fenêtre popup ATT et leurs résultats (basés sur le délai fixé par le développeur dans la méthode waitForATTUserAuthorization) sont répertoriés dans le tableau suivant.
Remarque : après l'expiration du délai, le SDk AppsFlyer est lancé, avec ou sans collecte de l'IDFA.
Action de l'utilisateur | Résultat |
---|---|
Acceptation de la collecte de l'IDFA avant l'expiration du délai |
L'IDFA est collecté |
Refus de la collecte de l'IDFA avant l'expiration du délai |
L'IDFA n'est pas collecté |
Laisser la fenêtre popup s'exécuter en arrière-plan |
Le minuteur se met en pause jusqu'à ce que l'utilisateur remette la fenêtre au premier plan |
Laisser la fenêtre popup s'exécuter au premier plan, puis accepter l'expiration du délai |
L'IDFA est collecté |
Laisser la fenêtre popup s'exécuter au premier plan, puis accepter l'expiration du délai |
L'IDFA n'est pas collecté |
Apps pour enfant
Pour que l'app apparaisse dans la Catégorie Enfants de l'App Store, Apple exige que vous ne « transmettiez à des tiers aucun renseignement personnel identifiable ni information concernant l'appareil ». Pour vous conformer à cette obligation, vous devez clairement désactiver les infrastructures AdSupport et iAD.
Pour désactiver les infrastructures de publicité :
-
disableCollectASA = true
. En savoir plus -
disableAdvertisingIdentifier = true
. En savoir plus
[AppsFlyerLib shared].disableCollectASA = YES [AppsFlyerLib shared].disableAdvertisingIdentifier = YES;
AppsFlyerLib.shared().disableCollectASA = true AppsFlyerLib.shared().disableAdvertisingIdentifier = true
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é par les annonceurs pour empêcher le partage de données avec certains (un ou plusieurs) réseaux/partenaires intégrés.
- setSharingFilterForAllPartners : utilisé par les annonceurs pour empêcher le partage de données avec tous les réseaux/partenaires intégrés.
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 nécessaire pour déterminer si vous devez définir les filtres de partage, retardez l'initialisation du SDK.
Lorsque la méthode est activée avant le premier appel start :
- Les utilisateurs de SRN sont attribués comme organiques, et leurs données ne sont pas partagées avec les partenaires intégrés.
- Les utilisateurs de réseaux publicitaires par clic (non-SRN) sont attribués correctement dans AppsFlyer, mais ne sont pas partagés avec les ad networks via des postbacks, des API, des rapports de données brutes, ou par toute autre méthode.
Actuellement, les données de désinstallation ne peuvent pas être filtrées par 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.
continueUserActivity
Description |
Appelle onAppOpenAttribution lorsqu'une app est ouverte à partir d'un lien universel pour iOS 9 et +. |
Signature de la méthode |
|
Exemple d'utilisation |
|
currencyCode
Description |
Définir le code de devise pour les événements générant des revenus. Accepte les codes de devise ISO. |
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 |
|
disableCollectASA
Description |
À partir de la version 4.8.11 du SDK, Le SDK AppsFlyer charge dynamiquement iAd.framework d'Apple. Ce cadre est nécessaire pour enregistrer et mesurer les performances des Apple Search Ads dans votre application. Si vous ne souhaitez pas qu'AppsFlyer charge dynamiquement cette infrastructure, définissez cette propriété sur true. |
Signature de la méthode |
|
Exemple d'utilisation |
|
handleOpenUrl
Description |
Cette méthode signale le schéma d'URI au SDK AppsFlyer lorsque l'app s'ouvre via un deep link avec le schéma d'URI. Cette méthode est placée dans AppDelegate. |
Signature de la méthode |
|
Exemple d'utilisation |
|
handlePushNotification
Description |
Mesurer et obtenir des données de campagnes de notifications push. Pour plus d'informations, consultez Enregistrement des notifications push. |
Signature de la méthode |
|
Exemple d'utilisation |
|
isDebug
Description |
Afficher les journaux du SDK AppsFlyer dans la console Xcode. Le débogage doit se limiter à la phase de développement uniquement. Ne distribuez pas l'application à l'App Store avec le débogage activé. Cela poserait des risques majeurs pour la sécurité et la vie privée. |
Signature de la méthode |
|
Exemple d'utilisation |
|
isStopped
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 |
|
onAppOpenAttribution
Description |
Obtenir des données de deep linking lorsqu'une app s'ouvre via un deep link. |
Signature de la méthode |
|
Exemple d'utilisation |
|
onAppOpenAttributionFailure
Description |
Gérer des erreurs lors de l'obtention de données de deep linking. |
Signature de la méthode |
|
Exemple d'utilisation |
|
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 |
|
Exemple d'utilisation |
|
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 |
|
Exemple d'utilisation |
|
didResolveDeepLink
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 |
|
performOnAppAttribution
Description |
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 |
|
registerUninstall
Description |
Mesurer les désinstallations Voir Mesure des désinstallations pour iOS. |
Signature de la méthode |
|
Exemple d'utilisation |
|
resolveDeepLinkURLs
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 |
|
setAdditionalData
Description |
Ajouter des données supplémentaires à envoyer aux plates-formes partenaires externes. |
Signature de la méthode |
|
Exemple d'utilisation |
Voir Définition des données personnalisées supplémentaires. |
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. |
setAppleAppID
Description |
Définissez votre ID app (l'ID iTunes) afin que le SDK puisse envoyer des données au tableau de bord de la bonne app. Utilisez-le lorsque vous initialisez le SDK . |
Signature de la méthode |
|
Exemple d'utilisation |
|
appsFlyerDevKey
Description |
Définissez la clé dev AppsFlyer afin que le SDK puisse envoyer des données au tableau de bord de la bonne app.Utilisez-le lorsque vous initialisez le SDK .Pour savoir comment obtenir votre clé dev, cliquez ici. |
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 |
setSharingFilter
Description |
Utilisé par les annonceurs pour configurer quels (un ou plusieurs) réseaux/partenaires intégrés exclure de l'obtention des données. |
Signature de la méthode |
|
Exemple d'utilisation |
|
setSharingFilterForAllPartners
Description |
Utilisé par les annonceurs pour exclure tous les réseaux/partenaires intégrés de l'obtention de données. |
Signature de la méthode |
|
Exemple d'utilisation |
|
setShouldCollectDeviceName
Description |
Indique si le SDK doit collecter le nom de l'appareil. La valeur par défaut est false. |
Signature de la méthode |
|
Exemple d'utilisation |
|
setUseUninstallSandbox
Description |
Pour tester les désinstallations pour les apps en cours de développement (non publiées sur l'App Store d'Apple), définissez cette propriété sur true. |
Signature de la méthode |
|
Exemple d'utilisation |
|
startWithCompletionHandler
Description |
Vérifiez si start est un succès ou un échec. Vous pouvez appliquer votre propre logique pour gérer le succès ou l'échec du suivi de lancement du SDK. |
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 |
|
validateAndLogInAppPurchase
Description |
Définissez la clé dev AppsFlyer afin que le SDK puisse envoyer des données au tableau de bord de l'application. Pour savoir comment obtenir votre clé dev, cliquez ici. Utilisez-le lorsque vous initialisez le SDK . |
Signature de la méthode |
|
Exemple d'utilisation |
Voir Validation des achats in-app |
disableAdvertisingIdentifier
Description |
À partir de la version 4.8.11 du SDK, le SDK AppsFlyer charge dynamiquement adSupport.framework d'Apple. Cette inftastructure est nécessaire pour collecter l’IDFA pour des besoins d'attribution. Si vous ne souhaitez pas qu'AppsFlyer charge dynamiquement cette infrastructure, définissez cette propriété sur true. |
Signature de la méthode |
|
Exemple d'utilisation |
[AppsFlyerLib shared].disableAdvertisingIdentifier= YES; AppsFlyerLib.shared().disableAdvertisingIdentifier = true |
waitForATTUserAuthorization
Description |
À utiliser si vous souhaitez demander l'autorisation de l'utilisateur dans un popup avant d'accéder aux données liées à l'app pour enregistrer soit l'utilisateur, soit le dispositif (par exemple, IDFA) Si l'utilisateur accepte, l'IDFA sera transmis au SDK.L'intervalle de temporisation donne à l'utilisateur un délai déterminé pour accepter la collecte de l'IDFA. Après l'expiration du délai, l'IDFA n'est pas collectée. |
Signature de la méthode |
|
Exemple d'utilisation |
|
start
Description |
Une fois cette API invoquée, le SDK démarrera, les sessions seront immédiatement envoyées et toutes les transitions d'arrière-plan et d'avant-plan enregistreront une session. |
Signature de la méthode |
|
Exemple d'utilisation |
|
logLocation
Description |
Enregistrer manuellement l'emplacement de l'utilisateur. |
Signature de la méthode |
|
Exemple d'utilisation |
|
appendParametersToDeepLinkingURL
Description |
Les propriétaires d'app qui passent par les liens universels 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. La méthode nécessite :
|
Signature de la méthode |
|
Exemple d'utilisation |
|
Commentaires
Vous devez vous connecter pour laisser un commentaire.