Intégrez le SDK AppsFLyer à votre app iOS et enregistrez les installations, les mises à jour et les évènements in-app. Évaluez l'engagement des utilisateurs.
Version SDK : 5.0.0 (Notes de version)
1. Aperçu
Grâce au SDK AppsFlyer, vous pouvez enregistrer les installations, les mises à jour, les sessions et les évènements in-app supplémentaires. En utilisant les évènements in-app, vous pouvez enregistrer des évènements tels que les achats in-app et les niveaux de jeu. Utilisez ces informations pour évaluer le ROI et les niveaux d'engagement des utilisateurs. Le SDK iOS est compatible avec tous les appareils iOS (iPhone, iPod, iPad) fonctionnant sous iOS version 6.0 et ultérieures.
Remarque
Le SDK AppsFlyer est entièrement compatible avec les réseaux DNS64/NAT64 IPv6 d’Apple. Pour plus d'informations, veuillez cliquer ici.
Important !
Le SDK AppsFlyer utilise la classe NSUserDefaults. Effacer toutes les valeurs de NSUserDefaults peut provoquer des problèmes d’attribution.
Astuce
- Afin d'implémenter l'intégration SDK de base, c.-à-d. l'attribution d'installations uniquement, il est obligatoire de terminer les procédures des sections 2 et 3 de ce document.
- Il est recommandé de lire la section Enregistrement des événements in-app pour faciliter l'implémentation
- Les autres fonctionnalités décrites sont optionnelles et leur implémentation dépend de la logique métier de votre app. Par exemple, l'enregistrement des revenus ou l'obtention des données de conversion au premier lancement peuvent être essentiels pour le flux de votre application
2. Démarrage rapide
2.1 Télécharger et ajouter le SDK AppsFlyer à Xcode
- Assurez-vous que vous avez téléchargé et installé la dernière version de CocoaPods.
- Ajoutez la ligne suivante à votre
Podfile
:pod 'AppsFlyerFramework'
- Exécutez
pod install
- Assurez-vous que vous utilisez le fichier
.xcworkspace
pour ouvrir votre projet dans Xcode, à la place du fichier.xcodeproj
à partir de ce stade.
- Assurez-vous que vous avez téléchargé et installé la dernière version de Carthage.
- Ajoutez la ligne suivante à votre Cartfile :
- binaire « https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerFramework/master/AppsFlyerTracker.json »
Remarque
Cette approche n'est compatible qu'avec iOS 8 et les versions ultérieures.
- Téléchargez 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 la case Copier les éléments si nécessaire est cochée
- Ajoutez AdSupport.framework et iAd.framework à votre projet et définissez-les comme optionnels
Remarque
- Cette approche n'est recommandée que si vous souhaitez prendre en charge iOS 7 dans votre application.
- Lors de l’import de Static Lib dans un projet Swift, le fichier
AppsFlyerTrackher.h
doit être ajouté comme en-tête de pontage à votre projet.
- Téléchargez le SDK iOS en tant que biblioth``eque statique
Pour vérifier l’intégrité du téléchargement de biblioth`eque statique SDK, cliquez ici. - Décompressez le fichier téléchargé
- Glissez / déposez AppsFlyerTracker.h et libAppsFlyerLib.a dans votre projet Xcode
- Assurez-vous que la case Copier les éléments si nécessaire est cochée
- Ajoutez AdSupport.framework et iAd.framework à votre projet et définissez-les comme optionnels
Le SDK AppsFlyer utilise les cadres natifs 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.
2.2 Configurer l’intégration dans le délégué in-app
Dans AppDelegate.swift, procédez comme suit :
- importez AppsFlyerLib
- Ajoutez
AppsFlyerTrackerDelegate
à la déclaration de classe
import AppsFlyerLib
class AppDelegate: UIResponder, UIApplicationDelegate, AppsFlyerTrackerDelegate {
// your code here
}
Dans AppDelegate.h, procédez comme suit :
- Importez
AppsFlyerLib/AppsFlyerTracker.h
- Ajoutez
AppsFlyerTrackerDelegate
à la déclaration de l'interface
#import < AppsFlyerLib/AppsFlyerTracker.h >@interface AppDelegate : UIResponder <UIApplicationDelegate, AppsFlyerTrackerDelegate>
Importez AppsFlyerLib/AppsFlyerTracker.h
#import < AppsFlyerLib/AppsFlyerTracker.h >
3. Initialisation du SDK
Initialisez le SDK dans la méthode didFinishLaunchingWithOptions
en utilisant votre ID app extrait de iTunes Connect et votre clé dev AppsFlyer. Ajoutez également les méthodes d'API pour gérer les données de conversion et le deep linking.
Notez que vous devez utiliser des chiffres uniquement, sans le préfixe « id » pour définir l'ID application ici.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
AppsFlyerTracker.shared().appsFlyerDevKey = ""
AppsFlyerTracker.shared().appleAppID = ""
AppsFlyerTracker.shared().delegate = self
/* Set isDebug to true to see AppsFlyer debug logs */
AppsFlyerTracker.shared().isDebug = true
return true
}
// rest of your code, methods such as applicationWillResignActive, applicationDidEnterBackground etc.
//get conversion data and deep linking
func onConversionDataReceived(_ installData: [AnyHashable: Any]) {
//Handle Conversion Data (Deferred Deep Link)
}
func onConversionDataRequestFailure(_ error: Error?) {
// print("\(error)")
}
func onAppOpenAttribution(_ attributionData: [AnyHashable: Any]) {
//Handle Deep Link Data
}
func onAppOpenAttributionFailure(_ error: Error?) {
}
// Reports app open from a Universal Link for iOS 9 or later
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
AppsFlyerTracker.shared().continue(userActivity, restorationHandler: restorationHandler)
return true
}
// Reports app open from deep link from apps which do not support Universal Links (Twitter) and for iOS8 and below
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
AppsFlyerTracker.shared().handleOpen(url, sourceApplication: sourceApplication, withAnnotation: annotation)
return true
}
// Reports app open from deep link for iOS 10 or later
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
AppsFlyerTracker.shared().handleOpen(url, options: options)
return true
}
Pour Swift 4.2 et versions ultérieures, utilisez le code suivant pour la méthode continue userActivity
:
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
AppsFlyerTracker.shared().continue(userActivity, restorationHandler: nil)
return true
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
/** APPSFLYER INIT **/
[AppsFlyerTracker sharedTracker].appsFlyerDevKey = @"<DEV_KEY>";
[AppsFlyerTracker sharedTracker].appleAppID = @"<APP_ID>";
[AppsFlyerTracker sharedTracker].delegate = self;
/* Set isDebug to true to see AppsFlyer debug logs */
[AppsFlyerTracker sharedTracker].isDebug = true;
return YES;
}
// rest of your code, methods such as applicationWillResignActive, applicationDidEnterBackground etc.
//get conversion data and deep linking
-(void)onConversionDataReceived:(NSDictionary*) installData {
//Handle Conversion Data (Deferred Deep Link)
}
-(void)onConversionDataRequestFailure:(NSError *) error {
NSLog(@"%@",error);
}
- (void) onAppOpenAttribution:(NSDictionary*) attributionData {
//Handle Deep Link
}
- (void) onAppOpenAttributionFailure:(NSError *)error {
NSLog(@"%@",error);
}
// Reports app open from a Universal Link for iOS 9 or above
- (BOOL) application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id> *restorableObjects))restorationHandler {
[[AppsFlyerTracker sharedTracker] continueUserActivity:userActivity restorationHandler:restorationHandler];
return YES;
}
// Reports app open from deep link from apps which do not support Universal Links (Twitter) and for iOS8 and below
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation {
[[AppsFlyerTracker sharedTracker] handleOpenURL:url sourceApplication:sourceApplication withAnnotation:annotation];
return YES;
}
// Reports app open from deep link for iOS 10
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
options:(NSDictionary *) options {
[[AppsFlyerTracker sharedTracker] handleOpenUrl:url options:options];
return YES;
}
Remarque
Si isDebug = true
est défini, les journaux du SDK AppsFlyer sont affichés dans la console xCode
- Ajoutez le code suivant à la fonction
applicationDidBecomeActive :
func applicationDidBecomeActive(application: UIApplication) {
// attribute Installs, updates & sessions(app opens)
// (You must include this API to enable SDK functions)
AppsFlyerTracker.shared().trackAppLaunch()
// your other code here.... }
- (void)applicationDidBecomeActive:(UIApplication *)application {
// attribute Installs, updates & sessions(app opens)
// (You must include this API to enable SDK functions)
[[AppsFlyerTracker sharedTracker] trackAppLaunch];
// your other code here.... }
Vérifier que le suivi des lancements d'application est un succès
Vous pouvez vérifier que la demande de suivi du lancement d'application est un succès en implémentant trackAppLaunchWithCompletionHandler
. Vous pouvez ensuite appliquer la logique pour gérer le succès ou l'échec du suivi des lancements d'application.
Exemple
[[AppsFlyerTracker sharedTracker] trackAppLaunchWithCompletionHandler:^(NSDictionary<NSString *,id> *dictionary, NSError *error) {
if (error) {
NSLog(@"%@", error);
return;
}
if (dictionary) {
NSLog(@"%@", dictionary);
return;
}
[NSException exceptionWithName:@"fatalError" reason:nil userInfo:nil];
}];
4. Enregistrement des événements In-App
Les événements In-App permettent d'analyser ce qui se passe dans votre application. Il est recommandé de prendre le temps de définir les événements que vous voulez mesurer pour vous permettre de mesurer le ROI (Return On Investment) et la LTV (Lifetime Value).
L'enregistrement des évènements in-app est réalisé en appelant trackEvent
avec le nom de l'évènement et les paramètres de valeur. Consultez la documentation Évènement in-app pour plus de détails.
Le nom d’un évènement in-app ne doit pas dépasser 45 caractères. Les noms d’évènements dépassant 45 caractères n’apparaissent pas dans le tableau de bord, mais seulement dans les API de données brutes, Push et Pull.
Exemple : Événement In-App d'achat
AppsFlyerTracker.shared().trackEvent(AFEventPurchase,
withValues: [
AFEventParamRevenue: "1200",
AFEventParamContent: "shoes",
AFEventParamContentId: "123"
]);
Ceci génère un événement de type af_purchase
(utilisant la constante AFEventPurchase
) avec les valeurs d'événement suivantes : {af_revenue: 200 , af_currency: "USD", af_quantity: 2, af_content_id: "092" af_receipt_id: "9277"}
Remarque
AppsFlyer prend en charge les caractères non anglais dans les évènements in-app ou toute autre API SDK, en commençant par le SDK iOS version 4.8.1.
Pour les revenus, n'ajoutez pas de symboles monétaires car ils ne sont pas reconnus.
Exemple d'utilisation
AppsFlyerTracker.shared().trackEvent(AFEventPurchase,
withValues: [
AFEventParamRevenue: @1200,
AFEventParamCurrency : @"JPY"
]);
[[AppsFlyerTracker sharedTracker] trackEvent: AFEventPurchase
withValues: @{
AFEventParamRevenue: @1200, AFEventParamCurrency: @"JPY"
}];
Vérification de l'enregistrement d'évènements in-app
Vous pouvez vérifier le succès ou l'échec de l’enregistrement des évènements in-app en implémentant completionHandler
. Vous pouvez ensuite appliquer la logique pour gérer le succès ou l'échec de l'enregistrement d'évènements.
Exemple
[[AppsFlyerTracker sharedTracker] trackEventWithEventName:AFEventPurchase
eventValues:@{AFEventParamRevenue: @"1200",
AFEventParamContent: @"shoes",
AFEventParamContentId: @"123"}
completionHandler:^(NSDictionary<NSString *,id> *dictionary, NSError *error) {
if (error) {
NSLog(@"%@", error);
return;
}
if (dictionary) {
NSLog(@"%@", dictionary);
return;
}
[NSException exceptionWithName:@"fatalError" reason:nil userInfo:nil];
5. Effectuer du Deep Linking
Astuce
Nous vous recommandons fortement d'intégrer le Deep Linking à votre application. Le Deep Linking est un élément crucial des campagnes de retargeting, et il est fortement recommandé de l'utiliser quand on exécute des campagnes de retargeting.
iOS9 et les versions ultérieures nécessitent que votre application prenne en charge les Universal Links. Pour plus de détails, veuillez cliquer ici.
Pour gérer le deep linking, ajoutez le code suivant dans votre application (dans la classe app delegate). Les méthodes de ce code vous permettent d’obtenir les données de deep linking. Les données de deep linking vous permettent de rediriger les utilisateurs vers l'activité de l'application pertinente et de leur fournir le contenu correspondant.
func onConversionDataReceived(_ installData: [AnyHashable: Any]) {
//Handle Conversion Data (Deferred Deep Link)
}
func onConversionDataRequestFailure(_ error: Error?) {
// print("\(error)")
}
func onAppOpenAttribution(_ attributionData: [AnyHashable: Any]) {
//Handle Deep Link Data
}
func onAppOpenAttributionFailure(_ error: Error?) {
}
// Reports app open from a Universal Link for iOS 9 or later
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
AppsFlyerTracker.shared().continue(userActivity, restorationHandler: restorationHandler)
return true
}
// Reports app open from deep link from apps which do not support Universal Links (Twitter) and for iOS8 and below
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
AppsFlyerTracker.shared().handleOpen(url, sourceApplication: sourceApplication, withAnnotation: annotation)
return true
}
// Reports app open from deep link for iOS 10 or later
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
AppsFlyerTracker.shared().handleOpen(url, options: options)
return true
}
Pour Swift 4.2 et versions ultérieures, utilisez le code suivant pour la méthode continue userActivity
:
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
AppsFlyerTracker.shared().continue(userActivity, restorationHandler: nil)
return true
}
-(void)onConversionDataReceived:(NSDictionary*) installData {
//Handle Conversion Data (Deferred Deep Link)
}
-(void)onConversionDataRequestFailure:(NSError *) error {
NSLog(@"%@",error);
}
- (void) onAppOpenAttribution:(NSDictionary*) attributionData {
//Handle Deep Link
}
- (void) onAppOpenAttributionFailure:(NSError *)error {
NSLog(@"%@",error);
}
// Reports app open from a Universal Link for iOS 9 or above
- (BOOL) application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> *restorableObjects))restorationHandler {
[[AppsFlyerTracker sharedTracker] continueUserActivity:userActivity restorationHandler:restorationHandler];
return YES;
}
// Reports app open from deep link from apps which do not support Universal Links (Twitter) and for iOS8 and below
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation {
[[AppsFlyerTracker sharedTracker] handleOpenURL:url sourceApplication:sourceApplication withAnnotation:annotation];
return YES;
}
// Reports app open from deep link for iOS 10
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
options:(NSDictionary *) options {
[[AppsFlyerTracker sharedTracker] handleOpenUrl:url options:options];
return YES;
}
6. Enregistrement des revenus
Utilisez le paramètre d'événement af_revenue
(AFEventParamRevenue
) pour intégrer le revenu comme élément d'un événement in-app. Vous pouvez lui affecter n'importe quelle valeur numérique, positive comme négative.
Remarque
AFEventParamRevenue
(équivalent à l’utilisation d’af_revenue
) est le SEUL paramètre d’événement qui est compté sur AppsFlyer comme un revenu réel dans les données brutes et le tableau de bord. Pour plus de détails, veuillez cliquer ici.
Exemple : Évènement In-App de revenu
AppsFlyerTracker.shared().trackEvent(AFEventPurchase,
withValues: [
AFEventParamContentId:"1234567",
AFEventParamContentType : "category_a",
AFEventParamRevenue: 1.99,
AFEventParamCurrency:"USD"
]);
[[AppsFlyerTracker sharedTracker] trackEvent: AFEventPurchase
withValues:@{
AFEventParamContentId:@"1234567",
AFEventParamContentType : @"category_a",
AFEventParamRevenue: @1.99,
AFEventParamCurrency:@"USD"
}];
Important !
Veillez à ne PAS formater la valeur de revenu. Elle 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.
Enregistrement de revenus négatifs
Si vous devez effectuer l'enregistrement de revenus négatifs, par exemple lorsqu'un utilisateur annule un achat ou reçoit un remboursement, vous pouvez envoyer un revenu négatif.
AppsFlyerTracker.shared().trackEvent("cancel_purchase",
withValues: [
AFEventParamContentId:"1234567",
AFEventParamContentType : "category_a",
AFEventParamRevenue: -1.99,
AFEventParamCurrency:"USD"
]);
[[AppsFlyerTracker sharedTracker] trackEvent: @"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.
7. Obtenir les données de conversion
AppsFlyer vous permet d’accéder aux données d’attribution de l’utilisateur en temps réel pour chaque nouvelle installation, directement au niveau SDK. En faisant cela, vous pouvez offrir aux utilisateurs un contenu personnalisé ou les envoyer vers des activités spécifiques au sein de l’application, ce qui peut considérablement améliorer leur engagement avec votre application.
Pour plus d’informations au sujet de cette fonctionnalité avancée, cliquez ici.
8. Identifiants utilisateur
Il existe plusieurs options pour récupérer les identifiants utilisateur :
Obtenez le DeviceID AppsFlyer
Le DeviceID unique d'AppsFlyer est créé pour chaque nouvelle installation d’une application. Vous pouvez l’obtenir en utilisant le code suivant :
let appsflyerId = AppsFlyerTracker.shared().getAppsFlyerUID()
NSString *appsflyerId = [AppsFlyerTracker sharedTracker].getAppsFlyerUID;
Définir l'ID Utilisateur-Client
Définir votre propre ID client vous permet de croiser votre propre ID unique avec l'ID unique d'AppsFlyer et les ID des autres appareils. Cet ID est disponible dans les rapports de données brutes d'AppsFlyer et les API de postback, vous permettant de les croiser avec vos ID internes.
Pour définir votre ID Utilisateur-Client :
AppsFlyerTracker.shared().customerUserID = "my user id"
[AppsFlyerTracker sharedTracker].customerUserID = @"my user id";
Remarque importante
Il est recommandé de définir votre ID utilisateur-client
dès que possible, car il n'est associé qu'aux événements signalés après son installation. Si setCustomerUserId
est appelé avant de faire appel à trackAppLaunch
, l'ID utilisateur-client sera visible dans l'exportation brute en ce qui concerne les installations et les événements. S'il est défini après, seule la valeur pour les événements enregistrés sera visible après l'appel de cette méthode.
L'ID Utilisateur-Client peut également être utilisé pour compléter les intégrations avec des plate-formes d'analyse, telles que Mixpanel et Swrve.
Obtenir l'ID Utilisateur-Client :
Pour obtenir l'ID utilisateur-client, récupérez-le à partir de sharedTracker.
[AppsFlyerTracker sharedTracker].customerUserID
Important !
Assurez-vous de définir l'ID utilisateur-client à chaque lancement de l'application, avant d'appeler la méthode trackAppLaunch
.
Pour plus d’informations sur l’ID Utilisateur-Client, cliquez ici.
IDFA et IDFV
AppsFlyer recueille automatiquement l’IDFA (ID pour les annonceurs) et IDFV (ID pour les vendeurs) si AdSupport.framework est inclus dans l’application.
9. Fonctionnalités facultatives
Mesure des désinstallations
Pour la mesure de désinstallation, activez la notification push distante sur votre application. Consultez le Remote Notification Programming Guide d'Apple pour plus de détails.
Suivez les instructions d’intégration du SDK iOS pour terminer la configuration de la fonctionnalité de mesure de désinstallation.
Enregistrement des notifications push
Pour activer le suivi des lancements d'application par les notifications push, ajoutez le code suivant à votre app delegate :
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
AppsFlyerTracker.shared().handlePushNotification(userInfo)
}
-(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
[[AppsFlyerTracker sharedTracker] handlePushNotification:userInfo];
}
Le message push doit avoir un paramètre af
avec les paramètres d'attribution AppsFlyer.
Exemple de message :
{
"aps":{
"alert":"Push text",
"sound":"default",
"category":"REMINDER_CATEGORY"
},
"_p":123456,
"payloadKey":"payloadValue",
"af":{
"pid":"swrve_int",
"is_retargeting":"true",
"c":"test_campaign"
}
}
Attribution des promotions croisées
AppsFlyer vous permet d'enregistrer et d'attribuer les installations provenant d'une promotion croisée de l'une de vos applications au sein de l'application actuelle dont dispose l'utilisateur. Les applications de promotion croisée peuvent être un facteur de croissance important en entrainant des installations supplémentaires pour vos applications.
Pour plus d'informations, reportez-vous à l'article concernant l'attribution de promotion croisée, ici.
Attribution des invitations utilisateur
Configuration du Code Devise
La valeur par défaut est USD. Vous pouvez trouver les codes devise ISO acceptables ici.
Utilisez l'API suivante pour configurer le code de devise :
public void currencyCode(String currencyCode);
Exemple d'utilisation :
AppsFlyerTracker.shared().currencyCode = "USD"
[AppsFlyerTracker sharedTracker].currencyCode = @"USD";
Validation des achats in-app
Remarque
Cette fonction est prise en charge pour iOS7 et les versions ultérieures
Le SDK AppsFlyer peut fournir une vérification serveur des achat in-app. Pour configurer le suivi de validation de reçu, vous devez appeler la méthode validateAndTrackInAppPurchase dans le callback Transaction finalisée du SKStoreKit. Cet appel génère automatiquement un évènement in-app af_purchase.
- (void) validateAndTrackInAppPurchase:(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;
Remarque
Le paramètre de prix doit contenir le total des revenus associé à l'événement d'achat 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.
Important
À des fins de test, nous vous recommandons de définir l’indicateur useReceiptValidationSandbox sur OUI, car cela redirige les requêtes vers les serveurs sandbox d’Apple.
#ifdef DEBUG
[AppsFlyerTracker sharedTracker].useReceiptValidationSandbox = YES;
#endif
Exemple
[[AppsFlyerTracker sharedTracker] validateAndTrackInAppPurchase:@"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;
}
}];
AppsFlyerTracker
.shared()?
.validateAndTrack(inAppPurchase: "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>
})
Important !
Lorsqu'AppsFlyer valide un achat auprès de serveurs Apple, si la réponse contient un tableau in-app
vide, AppsFlyer renvoie {"status":"in_app_arr_empty"}
au callback d'erreur.
Si vous recevez cet indicateur, vous devez restaurer le produit acheté avec Apple en envoyant une demande d'actualisation de reçu. Pour plus d'informations, consultez la documentation d'Apple.
Après l'actualisation du reçu, appelez de nouveau validateAndTrackInAppPurchase
.
Consultez le code ci-dessus pour savoir comment gérer cette erreur.
Pour obtenir la liste des valeurs possibles de retour pour la validation des reçus, veuillez vous reporter à la documentation d’Apple ici.
Anonymisation
AppsFlyer vous fournit une méthode permettant d'anonymiser des identifiants utilisateur spécifiques dans les analyses AppsFlyer. Cette méthode est conforme aux dernières exigences de confidentialité ainsi qu'aux politiques de confidentialité des données de Facebook. La valeur par défaut est NON, ce qui signifie qu'aucune anonymisation n'est effectuée par défaut.
Utilisez cette API lors de l'initialisation du SDK pour anonymiser explicitement les installations, les évènements et les sessions d'un utilisateur :
AppsFlyerTracker.shared().deviceTrackingDisabled = true
[AppsFlyerTracker sharedTracker].deviceTrackingDisabled = YES;
Il est possible de reprendre le suivi en appelant de nouveau deviceTrackingDisabled
, défini 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.
Personnalisation de la durée entre sessions
Par défaut, au moins 5 secondes doivent s'écouler entre 2 lancements d'applications pour que cela soit considéré comme 2 sessions distinctes (pour en savoir plus sur le comptage de session).
Toutefois, vous pouvez utiliser l'API suivante pour définir votre valeur personnalisée de durée minimale requise entre les sessions :
AppsFlyerTracker.shared().minTimeBetweenSessions = <votre_temps_personnalisé_en_secondes>
[AppsFlyerTracker sharedTracker].minTimeBetweenSessions = <votre_temps_personnalisé_en_secondes>;
Sessions d'arrière-plan pour applications utilitaires
Extensions d'application et WatchKit iOS
L’extension de l’application requiert des autorisations pour utiliser internet :
- Allez au fichier info.plist de l’extension de votre application
- Dans
NSExtension
/NSExtensionAttributes
définissez l'indicateurRequestsOpenAccess
sur YES.
Ajoutez le code suivant au UIViewController de l’extension de l’application viewDidLoad
:
override func viewDidLoad() {
super.viewDidLoad()
AppsFlyerTracker.shared().appsFlyerDevKey = "MY_APPSFLYER_KEY"
// MY_APP_ID below stands for you app ID on iTunes Connect. Should be 9 or 10 digits.
AppsFlyerTracker.shared().appleAppID = "MY_APP_ID"
AppsFlyerTracker.sharedTracker().trackAppLaunch()
}
- (void)viewDidLoad {
[super viewDidLoad];
// Replace MY_APPSFLYER_KEY below by your AppsFlyer dev key
[AppsFlyerTracker sharedTracker].appsFlyerDevKey = @"MY_APPSFLYER_KEY";
// MY_APP_ID below stands for you app ID on iTunes Connect. Should be 9 or 10 digits.
[AppsFlyerTracker sharedTracker].appleAppID = @"MY_APP_ID";
[[AppsFlyerTracker sharedTracker] trackAppLaunch];
}
Pour recevoir les données d’attribution sur l’extension de l’application, suivez les instructions ici et implémentez-les sur le UIViewController
de votre application au lieu du AppDelegate.
Exclusion
Dans certains cas extrêmes, vous pouvez vouloir arrêter toute fonction du SDK en raison de la conformité aux exigences légales et à la vie privée. L'API isStopTracking le permet. Une fois cette API appelée, notre SDK ne communiquera plus avec nos serveurs et cessera de fonctionner.
Il existe différents scénarios d'exclusion d'utilisateurs. Nous recommandons vivement de suivre les instructions exactes du le scénario qui correspond à votre application.
Avertissement
Utilisez cette API uniquement lorsque vous souhaitez exclure cet utilisateur de toute attribution d'installation et de tout enregistrement d’événement. L'utilisation de cette API impacte FORTEMENT votre attribution, votre collecte des données et votre mécanisme de deep linking.
AppsFlyerTracker.shared().isStopTracking = true
[AppsFlyerTracker sharedTracker].isStopTracking = true;
Important
N'appelez pas la méthode trackAppLaunch
si l'API isStopTracking
est définie sur true
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. Cette fonctionnalité permet de s'assurer que le SDK ne commence pas avant d'avoir obtenu le customerUserID. Lorsque vous retardez l'initialisation du SDK, tous les évènements in-app ainsi que tous les appels à une API SDK sont ignorés, jusqu'à ce que le customerUserID soit fourni et enregistré.
Vous pouvez ajouter une logique à l'API iOS applicationDidBecomeActive pour retarder l'initialisation du SDK jusqu'à ce que l'ID utilisateur du client soit défini. Consultez les exemples ci-dessous :
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSString *customUserId = [[NSUserDefaults standardUserDefaults] stringForKey:@"customerUserId"]; // Your custom logic of retrieving CUID
if (customUserId != nil && ![customUserId isEqual: @""]) {
[AppsFlyerTracker sharedTracker].customerUserID = customUserId; // Set CUID in AppsFlyer SDK for this session
[[AppsFlyerTracker sharedTracker] trackAppLaunch]; // Track App Launch
}
}
func applicationDidBecomeActive(_ application: UIApplication) {
let customUserId = UserDefaults.standard.string(forKey: "customUserId") // your logic to retrieve CUID
if(customUserId != nil && customUserId != ""){
AppsFlyerTracker.shared().customerUserID = customUserId // Set CUID in AppsFlyer SDK for this session
AppsFlyerTracker.shared().trackAppLaunch() // Track App Launch
}
}
Collecte du nom d'appareil
Le SDK AppsFlyer vous permet de collecter le nom de l'appareil pour votre analyse interne. Cette fonctionnalité est désactivée par défaut. Pour l'activer, utilisez l'API suivante :
AppsFlyerTracker.shared().shouldCollectDeviceName = false
[AppsFlyerTracker sharedTracker].shouldCollectDeviceName = NO;
Important
Le nom de l'appareil est susceptible d'être considéré comme une donnée personnelle dans certaines régions. Collectez ces informations uniquement si vous savez que vous êtes légalement autorisé à le faire et que vous avez reçu le consentement explicite de l'utilisateur.
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.
Le code qui suit illustre l'implémentation de setAdditionalData sur iOS pour Objective-C ou Swift
NSDictionary* CustomDataMap = [[NSDictionary alloc] initWithObjectsAndKeys:@"value_of_param_1", @"custom_param_1", nil];
[[AppsFlyerTracker sharedTracker] setAdditionalData:CustomDataMap];
let CustomDataMap: [AnyHashable: Any] = [
"custom_param_1" : "value_of_param_1"
]
AppsFlyerTracker.shared().customData = CustomDataMap
Résoudre les URL Deep Link encapsulées
Si vous utilisez les liens OneLink (qui prennent en charge les liens universels) et les encapsulez avec un lien universel tiers, vous pouvez utiliser l'API setResolveDeepLinkURLs pour indiquer au SDK AppsFlyer quels sont les domaines de clic appelant l'application qui doivent être résolus par le SDK et en extraire le lien OneLink sous-jacent. Cela vous permettra de maintenir le deep linking et l'attribution tout en encapsulant le lien OneLink avec un lien universel tiers. Assurez-vous d'appeler cette API avant d'initialiser le SDK.
[AppsFlyerTracker sharedTracker].resolveDeepLinkURLs = @[@"example.com",@"click.example.com"];
AppsFlyerTracker.shared().resolveDeepLinkURLs = ["example.com", "click.example.com]
10. Tester votre intégration
Pour plus de détails sur la manière de tester votre intégration, cliquez ici.
Vous pouvez maintenant commencer à mesurer les résultats des sources média avec lesquelles vous travaillez.
11. Soumettre une application à l’App Store
Vous pouvez trouver des instructions sur la soumission de votre application à l’App Store ici.
Commentaires
Vous devez vous connecter pour laisser un commentaire.