Integrar SDK

Aprende a inicializar e iniciar el SDK para iOS.

Antes de comenzar

Get started with our SDK integration wizard

  • Antes de la integración, debes instalar el SDK.
  • Este documento contiene implementaciones de ejemplo. Asegúrate de reemplazar lo siguiente:
    • <YOUR_DEV_KEY>: La clave de desarrollador de AppsFlyer.
    • <APPLE_APP_ID>: el ID de aplicación de Apple (sin el prefijo id ).
    • Marcadores de posición adicionales, donde sea necesario.

Inicializar el SDK para iOS

Paso 1: Importar dependencias
Importar AppsFlyerLib:

// AppDelegate.h
#import <AppsFlyerLib/AppsFlyerLib.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@end
import UIKit
import AppsFlyerLib

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    // ...
}

Paso 2: Inicializar el SDK
In didFinishLaunchingWithOptions configura tu ID de aplicación de Apple y la clave de desarrollador de AppsFlyer:

[[AppsFlyerLib shared] setAppsFlyerDevKey:@"<YOUR_DEV_KEY>"];
[[AppsFlyerLib shared] setAppleAppID:@"<APPLE_APP_ID>"];
AppsFlyerLib.shared().appsFlyerDevKey = "<YOUR_DEV_KEY>"
AppsFlyerLib.shared().appleAppID = "<APPLE_APP_ID>"

Iniciar el SDK para iOS

In applicationDidBecomeActive, call start:

[[AppsFlyerLib shared] start];
func applicationDidBecomeActive(_ application: UIApplication) {
    AppsFlyerLib.shared().start()
    // ...
}

Add SceneDelegate support

OPCIONAL
Haz lo siguiente solo si usas SceneDelegates:

In didFinishLaunchingWithOptions, añade un observador UIApplicationDidBecomeActiveNotification y configúralo para que ejecute start:

@implementation AppDelegate
    // SceneDelegate support - start AppsFlyer SDK
    - (void)sendLaunch:(UIApplication *)application {
    [[AppsFlyerLib shared] start];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // ...
    // SceneDelegate support
    [[NSNotificationCenter defaultCenter] addObserver:self
     selector:@selector(sendLaunch:)
     name:UIApplicationDidBecomeActiveNotification
     object:nil];
    // ...
    return YES;
}
// ...
@end
import UIKit
import AppsFlyerLib
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        ...
        // SceneDelegate support
        NotificationCenter.default.addObserver(self, selector: NSSelectorFromString("sendLaunch"), name: UIApplicationdidBecomeActiveNotification, object: nil)
        return true
    }
    // SceneDelegate support - start AppsFlyer SDK
    @objc func sendLaunch() {
        AppsFlyerLib.shared().start()
    }
// ...
}

Start with completion handler

OPCIONAL
Para confirmar que el SDK se inició correctamente y notificó a los servidores de AppsFlyer, llama a start con un controlador de finalización. A continuación, puedes aplicar una lógica para manejar el éxito o el fracaso del inicio del SDK.

[[AppsFlyerLib shared] startWithCompletionHandler:^(NSDictionary<NSString *,id> *dictionary, NSError *error) {
        if (error) {
            NSLog(@"%@", error);
            return;
        }
        if (dictionary) {
            NSLog(@"%@", dictionary);
            return;
        }
    }];
AppsFlyerLib.shared()?.start(completionHandler: { (dictionary, error) in
            if (error != nil){
                print(error ?? "")
                return
            } else {
                print(dictionary ?? "")
                return
            }
        })

Ejemplo completo

#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 = @"<YOUR_DEV_KEY>";
    [AppsFlyerLib shared].appleAppID = @"<APPLE_APP_ID>";
    /* Uncomment the following line to see AppsFlyer debug logs */
    // [AppsFlyerLib shared].isDebug = true;
  
    // SceneDelegate support
    [[NSNotificationCenter defaultCenter] addObserver:self
     selector:@selector(sendLaunch:)
     name:UIApplicationDidBecomeActiveNotification
     object:nil];
    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;
}

@end
import UIKit
import AppsFlyerLib
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        AppsFlyerLib.shared().appsFlyerDevKey = "<YOUR_DEV_KEY>"
        AppsFlyerLib.shared().appleAppID = "<APPLE_APP_ID>"
        /* Uncomment the following line to see AppsFlyer debug logs */
        // AppsFlyerLib.shared().isDebug = true
        // SceneDelegate support
        NotificationCenter.default.addObserver(self, selector: NSSelectorFromString("sendLaunch"), name: UIApplication.didBecomeActiveNotification, object: nil)
        return true
    }
    // SceneDelegate support
    @objc func sendLaunch() {
        AppsFlyerLib.shared().start()
    }
// ...
}

Enlace de Github

Configuración del ID de usuario de cliente

OPCIONAL
El ID de usuario de cliente (CUID) es un identificador de usuario único creado fuera del SDK por el propietario de la aplicación. Si se pone a disposición del SDK, se puede asociar con las instalaciones y otros eventos in-app. Se pueden crear referencias cruzadas entre estos eventos etiquetados con el CUID y los datos de usuario de otros dispositivos y aplicaciones.

Set the CUID

Para establecer el CUID:

[AppsFlyerLib shared].customerUserID = @"my user id";
AppsFlyerLib.shared().customerUserID = "my user id"

📘

Nota

The Customer User ID must be set with every app launch.

Associate the CUID with the install event

If it’s important for you to associate the install event with the CUID, you should set to set the customerUserId antes de llamar al método start . Esto se debe a que start envía el evento de instalación a AppsFlyer. Si el CUID se establece después de llamar a start, no se asociará con el evento de instalación.

- (void)applicationDidBecomeActive:(UIApplication *)application {
  	// Your custom logic of retrieving CUID
    NSString *customUserId = [[NSUserDefaults standardUserDefaults] stringForKey:@"customerUserId"];  
    if (customUserId != nil && ![customUserId  isEqual: @""]) {
        // Set CUID in AppsFlyer SDK for this session
        [AppsFlyerLib shared].customerUserID = customUserId; 
        // Start
        [[AppsFlyerLib shared] start]; 
    }
}
func applicationDidBecomeActive(_ application: UIApplication) {
  //  your logic to retrieve CUID
  let customUserId = UserDefaults.standard.string(forKey: "customUserId") 
  
  if(customUserId != nil && customUserId != ""){
     // Set CUID in AppsFlyer SDK for this session
    AppsFlyerLib.shared().customerUserID = customUserId    
    AppsFlyerLib.shared().start() // Start
  }
}

Log sessions

The SDK sends an af_app_opened message whenever the app is opened or brought to the foreground, providing that start is called in the didBecomeActive lifecycle event method. Before the message is sent, the SDK makes sure that the time passed since sending the last message is not smaller than a predefined interval.

Setting the time interval between app launches

Establecido minTimeBetweenSessions to the minimal time interval that must lapse between two af_app_opened messages. The default interval is 5 seconds.

Soporte para iOS 14

A continuación encontrarás guías sobre cómo configurar la compatibilidad con las funciones de iOS 14+.

Enabling App Tracking Transparency (ATT) support

A partir de iOS 14.5, el acceso al IDFA se rige por el marco ATT.
La habilitación del soporte de ATT en el SDK maneja la recopilación del IDFA en dispositivos con iOS 14.5+ instalado.

🚧

Atención

Llama a waitForATTUserAuthorization solo si tienes la intención de llamar a requestTrackingAuthorization en algún lugar de tu aplicación.

Paso 1: Configuración waitForATTUserAuthorization
Al inicializar el SDK, antes de llamar start In applicationDidBecomeActive, call waitForATTUserAuthorization:

[[AppsFlyerLib shared] waitForATTUserAuthorizationWithTimeoutInterval:60];
AppsFlyerLib.shared().waitForATTUserAuthorization(timeoutInterval: 60)

Enlace de Github

Establecido timeoutInterval para que los usuarios de la aplicación tengan tiempo suficiente para ver e interactuar con el aviso de ATT. Algunos ejemplos:

  • Si aparece el aviso de la ATT en el inicio de la aplicación, un intervalo de 60 segundos debería ser suficiente.
  • Si aparece el aviso de la ATT después de un tutorial que tarda aproximadamente 2 minutos en completarse, un intervalo de 120 segundos debería ser suficiente.

Paso 2: Llamar requestTrackingAuthorization
Llama a requestTrackingAuthorization donde desees que se muestre el mensaje:

- (void)didBecomeActiveNotification {
    // start is usually called here:
    // [[AppsFlyerLib shared] start]; 
    if @available(iOS 14, *) {
      
      [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
        NSLog(@"Status: %lu", (unsigned long)status);
      }];
    }
}
@objc func didBecomeActiveNotification() {
    // start is usually called here:
    // AppsFlyerLib.shared().start()
    if #available(iOS 14, *) {
      ATTrackingManager.requestTrackingAuthorization { (status) in
        switch status {
        case .denied:
            print("AuthorizationSatus is denied")
        case .notDetermined:
            print("AuthorizationSatus is notDetermined")
        case .restricted:
            print("AuthorizationSatus is restricted")
        case .authorized:
            print("AuthorizationSatus is authorized")
        @unknown default:
            fatalError("Invalid authorization status")
        }
      }
    }
}

Enlace de Github

📘

Nota

  • Es necesario importar el marco AppTrackingTransparency para llamar a requestTrackingAuthorization.
  • Según la documentación de Apple:
    • requestTrackingAuthorization solo se invoca si la aplicación está en el estado UIApplicationStateActive estado.
    • requestTrackingAuthorization no se puede invocar desde las extensiones de aplicación.

Customizing the ATT consent dialog

El cuadro de diálogo de consentimiento de ATT se puede personalizar en tu proyecto de Xcode modificando info.plist:

Para más información, consulta la documentación de Apple.

Attributing App Clips

La atribución de App Clips de Apple se introdujo en el SDK para iOS V6.0.8Consulta nuestra guía de integración de App Clips para obtener instrucciones detalladas.

Sending SKAN postback copies to AppsFlyer

iOS 15
Configura tu aplicación para enviar copias de postbacks a AppsFlyer.

Para registrar el punto de conexión de AppsFlyer:

  1. Agrega NSAdvertisingAttributionReportEndpoint como clave de tu app para info.plist.
  2. Establece el valor de la clave en https://appsflyer-skadnetwork.com/.

Según Apple, solo puedes establecer un punto de conexión. Las copias de los postbacks recibidos están disponibles en el reporte de copias de postbacks.

Cómo habilitar el modo de depuración

Puedes habilitar los registros de depuración configurando isDebug en true:

[AppsFlyerLib shared].isDebug = true;
AppsFlyerLib.shared().isDebug = true

📘

Nota

Para ver los registros de depuración completos, asegúrate de configurar isDebug antes de invocar otros métodos SDK.

Ver ejemplo.

🚧

Advertencia

Para evitar la filtración de información confidencial, asegúrate de que los registros de depuración estén deshabilitados antes de distribuir la aplicación.

Pruebas de integración

Para obtener instrucciones detalladas sobre las pruebas de integración, consulta la guía de pruebas de integración del SDK para iOS.