Integración de SDK de AppsFlyer - iOS

  • Los anunciantes
  • Desarrolladores

ios.pngVersión del SDK: 4.10.0 (Notas de lanzamiento)

1. Resumen

This guide details how to integrate AppsFlyer's SDK into your iOS app. You can record installs, updates, sessions, and additional in-app events as well as app installs (including in-app purchases, game levels, etc.) to evaluate ROI and user engagement levels. The iOS SDK is compatible with all iOS devices (iPhone, iPod, iPad) with iOS version 6 and later.

 Nota

El SDK de AppsFlyer cumple totalmente con las redes IPv6 DNS64 / NAT64 de Apple. Para obtener más información, haz clic aquí.

 ¡Importante!

El SDK de AppsFlyer hace uso de la clase NSUserDefaults. Borrar todos los valores de NSUserDefaults puede causar problemas de atribución.

 Consejo

  • In order to implement basic SDK integration that is, install attribution only, it is mandatory to complete the procedures in sections 2 and 3 in this document. 
  • It is recommended that you read the Recording in-app events section as an aid to implementation
  • The rest of the described features described, are optional and implementing them will depend on your app's business logic. For example, recording revenue or getting the conversion data on first launch may be vital for your app's flow

2. Inicio rápido

2.1 Descarga y agrega el SDK de AppsFlyer a Xcode

CocoaPodsCarthageStatic FrameworkStatic Lib
  1. Asegúrate de haber descargado e instalado la última versión de CocoaPods.
  2. Agrega la siguiente fila a tu Podfile:
    pod 'AppsFlyerFramework'
  3. ejecuta la instalación pod
  4. Asegúrate de usar el archivo .xcworkspace para abrir tu proyecto en Xcode, en lugar del archivo .xcodeproj, de aquí en adelante.

El SDK de AppsFlyer usa los siguientes marcos nativos:

AdSupport.framework
Para recolectar el identificador de anunciante (IDFA) de los dispositivos, necesitarás este marco.
Sin el IDFA, no podrás atribuir instalaciones de Facebook Ads, Twitter, Google Ads y otras redes.
iAd.framework
Este marco es necesario para registrar y medir el rendimiento de Apple Search Ads en tu aplicación.

2.2 Configurar la Integración en el Delegado de la Aplicación

SwiftObjective-C

En AppDelegate.swift, haz lo siguiente:

  1. importa AppsFlyerLib
  2. Agrega AppsFlyerTrackerDelegate a la declaración de clase.
Importa AppsFlyerLib
class AppDelegate: UIResponder, UIApplicationDelegate, AppsFlyerTrackerDelegate {
   // your code here
}

3. Inicialización del SDK

Inicializa el SDK en el método didFinishLaunchingWithOptions con tu ID de aplicación tomada de iTunes Connect y tu clave de desarrollador de AppsFlyer

Ten en cuenta que aquí debes configurar el ID de aplicación únicamente con dígitos, sin el prefijo "id".

SwiftObjective-C
AppsFlyerTracker.shared().appsFlyerDevKey = "<your-appsflyer-dev-key>";
AppsFlyerTracker.shared().appleAppID = "123456789"
AppsFlyerTracker.shared().delegate = self
#if DEBUG AppsFlyerTracker.shared().isDebug = true
#endif

 Nota

Si se establece isDebug = true, los registros del SDK de AppsFlyer se muestran en la Consola xCode.

 

  • Agrega el siguiente código en la función applicationDidBecomeActive:
SwiftObjective-C
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.... }

Cómo verificar que los inicios de la aplicación se rastreen correctamente

Para verificar que tenga éxito la solicitud de rastrear los inicios de la aplicación, puede implementar trackAppLaunchWithCompletionHandler. A continuación, puede aplicar una lógica para manejar el éxito o el fracaso del rastreo de inicios de la aplicación.

Ejemplo

[[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. Registro de eventos in-app

Los eventos in-app brindan insights sobre lo que está sucediendo en tu aplicación. Se recomienda tomarse el tiempo y definir los eventos que deseas medir para que puedas medir el ROI (Retorno de la Inversión) y el LTV (Valor del Tiempo de Vida).

El registro de eventos in-app se realiza llamando a trackEvent con el nombre del evento y los parámetros de valor. Para más detalles, consulta Eventos in-app.

El nombre para el evento in-app no debe tener más de 45 caracteres. Los nombres de eventos con más de 45 caracteres no aparecerán en el panel de control, sino solo en las API de pull y push y de raw data.

Ejemplo: Compra de evento in-app

SwiftObjective-C
AppsFlyerTracker.shared().trackEvent(AFEventPurchase,
  withValues: [
     AFEventParamRevenue: "1200",
     AFEventParamContent: "shoes",
     AFEventParamContentId: "123"
]);

swift-record-in-app-events.png

Esto genera un tipo de evento af_purchase (que emplea la constante AFEventPurchase) con los siguientes valores de evento: {af_revenue: 200 , af_currency: "USD", af_quantity: 2, af_content_id: "092" af_receipt_id: "9277"}

 Nota

AppsFlyer admite caracteres no ingleses con eventos in-app o con cualquier otra API de SDK a partir de la versión 4.8.1 del SDK de iOS.

Para los ingresos, no agregues ningún símbolo de moneda, ya que no se reconocen.

 Ejemplo de Uso

SwiftObjective C
AppsFlyerTracker.shared().trackEvent(AFEventPurchase,
withValues: [
  AFEventParamRevenue: @1200,
  AFEventParamCurrency : @"JPY"
]); 

Verificación del registro de eventos in-app

Puedes verificar si el registro de eventos in-app se realiza correctamente o no mediante la implementación de completionHandler. A continuación, puedes aplicar la lógica para manejar el éxito o el error de los eventos de registro.

Ejemplo

[[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. Realización de conexiones profundas

 Consejo

Recomendamos encarecidamente que se integren las conexiones profundas en tu aplicación. Las Conexiones Profundas son una parte crucial de las campañas de retargeting, y es muy recomendable usarlas cuando se realizan dichas campañas.

iOS9 y versiones posteriores requieren que tu aplicación sea compatible con enlaces universales. Para obtener más detalles, haz clic aquí.


Para administrar enlaces profundos, agrega el siguiente código a tu aplicación (en la clase de delegado de aplicación). Los métodos de este código te permiten obtener datos de enlaces profundos. Con los datos de enlaces profundos, puedes redireccionar usuarios a la actividad de la aplicación pertinente y ofrecerles contenido relevante.

SwiftObjective-C

 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
  }
  

 ¡Importante!

Para Swift 4.2 o versión superior, utiliza el siguiente código para el método continue userActivity:

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
	AppsFlyerTracker.shared().continue(userActivity, restorationHandler: nil)
	return true
}

6. Registro de ingresos

Utilice el parámetro de evento af_revenue (AFEventParamRevenue) para considerar los ingresos como parte de un evento in-app. Puedes llenarlo con cualquier valor numérico, positivo o negativo.

 Nota

AFEventParamRevenue (equivale al uso de af_revenue) es el ÚNICO parámetro de evento que se considera en AppsFlyer como ingreso real en los datos sin procesar y en el panel de control. Para conocer más detalles, haz clic aquí.


Ejemplo: evento in-app de ingresos

SwiftObjective-C
AppsFlyerTracker.shared().trackEvent(AFEventPurchase, 
withValues: [
	AFEventParamContentId:"1234567",
	AFEventParamContentType : "category_a",
	AFEventParamRevenue: 1.99,
	AFEventParamCurrency:"USD"
]);

 ¡Importante!

No altere el formato del valor de los ingresos bajo ningún concepto. No debería contener comas separadoras, signos de divisas o texto. Un evento de ingresos podría ser, por ejemplo, 1234.56.

Registro de ingresos negativos

Si necesitas registrar ingresos negativos, por ejemplo cuando un usuario cancela una compra o recibe un reembolso, puedes enviar ingresos negativos.

SwiftObjective-C
AppsFlyerTracker.shared().trackEvent("cancel_purchase", 
withValues: [
	AFEventParamContentId:"1234567",
	AFEventParamContentType : "category_a",
	AFEventParamRevenue: -1.99,
	AFEventParamCurrency:"USD"
]);

 Nota

Observe lo siguiente en el código anterior:

  1. El valor de ingresos está precedido por un signo de menos
  2. El nombre del evento tiene un valor único de "cancel_purchase" para permitirle identificar los eventos con ingresos negativos en el panel de control y en los informes de datos sin procesar.

7. Obtener Datos de Conversión

AppsFlyer te permite acceder a los datos de atribución del usuario en tiempo actual por cada nueva instalación, directamente desde el nivel del SDK. Al hacer esto, puedes ofrecer a los usuarios contenido personalizado o enviarlos a actividades específicas dentro de la aplicación, lo que puede mejorar enormemente su engagement con tu aplicación.

Para obtener más información sobre esta funcionalidad avanzada, haz clic aquí.

8. Identificadores de Usuario

Hay una serie de opciones para recuperar identificadores de usuarios:

Obtener el ID de Dispositivo de AppsFlyer

El ID de dispositivo único de AppsFlyer se crea por cada nueva instalación de una aplicación. Puedes obtenerlo usando el siguiente código:

SwiftObjective-C
let appsflyerId = AppsFlyerTracker.shared().getAppsFlyerUID()

Establecer ID de Usuario de Cliente

Establecer tu propio ID de cliente te permite hacer una referencia cruzada de tu propio ID único con el ID único de AppsFlyer y los ID de los otros dispositivos. Este ID está disponible en los reportes de CSV de AppsFlyer junto con las API de Postback para referencias cruzadas con tus ID internos.

Para configurar tu ID de usuario de cliente:

SwiftObjective-C
AppsFlyerTracker.shared().customerUserID = "my user id"

  Nota Importante

Se recomienda que establezcas tu ID de usuario de cliente lo antes posible, ya que solo estará asociado a los eventos informados una vez definido. Si setCustomerUserId se invoca antes de invocar trackAppLaunch, el ID de usuario del cliente aparecerá en la exportación de datos sin procesar para instalaciones y para eventos. Si se define después, solo se verá el valor para eventos registrados tras invocar este método.

El ID de Usuario de Cliente también puede usarse para completar integraciones con plataformas de analítica como Mixpanel y Swrve.

Cómo obtener un ID de usuario de cliente:

Para obtener el ID de usuario de cliente, recupéralo de sharedTracker.

[AppsFlyerTracker sharedTracker].customerUserID

 ¡Importante!

Asegúrate de definir el ID de usuario de cliente cada vez que se inicie la aplicación, antes de invocar trackAppLaunch

Para obtener más información sobre el ID de usuario de cliente, haz clic aquí.

IDFA y IDFV

AppsFlyer recopila automáticamente el IDFA (ID para los Anunciantes) y el IDFV (ID para los Vendedores) si se incluye AdSupport.framework en la aplicación.

9. Funciones Opcionales

Medición de desinstalaciones

Para desinstalar el rastreo, habilita la notificación remota push en tu aplicación. Consulta la Guía de Programación de Notificaciones Remotas de Apple para obtener más detalles.

Sigue las instrucciones de integración de SDK para iOS a fin de completar la configuración de la función de medición de desinstalaciones.

Registro de notificaciones push

Para habilitar el Rastreo de Inicios de Aplicación desde las notificaciones push, agrega el siguiente código al delegado de tu aplicación:

SwiftObjective-C
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
	AppsFlyerTracker.shared().handlePushNotification(userInfo)
}

El mensaje push debe tener un parámetro af con los parámetros de atribución de AppsFlyer.

Ejemplo de Mensaje:

{
  "aps":{
   "alert":"Push text",
   "sound":"default",
   "category":"REMINDER_CATEGORY"
  },
  "_p":123456,
  "payloadKey":"payloadValue",
  "af":{
   "pid":"swrve_int",
   "is_retargeting":"true",
   "c":"test_campaign"
  }
}

Atribución de promociones cruzadas

AppsFlyer te permite atribuir y registrar instalaciones originadas en una promoción cruzada de una de tus aplicaciones dentro de la aplicación actual que tiene el usuario. Las aplicaciones de promoción cruzada pueden ser un importante factor de crecimiento para generar instalaciones adicionales para tus aplicaciones.

Para conocer más detalles, consulta el artículo sobre atribución de promociones cruzadas aquí.

Atribución de invitaciones de usuarios

AppsFlyer te permite atribuir y registrar instalaciones originadas en las invitaciones de los usuarios dentro de tu aplicación. Permitir que tus usuarios existentes inviten a sus amigos y contactos como nuevos usuarios a tu aplicación puede ser un factor de crecimiento clave para tu aplicación.
 
Para conocer más detalles, lee el artículo sobre atribución de invitaciones de usuarios aquí.

Establecer el código de moneda

Puedes usar la siguiente API para establecer un código de moneda global, además de códigos de moneda específicos que se pueden usar como parte de cada evento in-app enviado a AppsFlyer. El código de moneda global se usa cuando AFEventParamCurrency no se envía como parte de un evento in-app.

USD es el valor predeterminado. Puedes encontrar códigos de moneda ISO aceptables aquí .

Usa la siguiente API para configurar el código de moneda:

public void currencyCode(String currencyCode);

Ejemplo de Uso:

SwiftObjective-C
AppsFlyerTracker.shared().currencyCode = "USD"

Validación de compras in-app

 Nota

Esta función es compatible con iOS7 y superior.

El SDK de AppsFlyer puede proporcionar verificación del servidor de compras in-app. Para establecer el rastreo de validación de recibos, debes llamar al método validateAndTrackInAppPurchase dentro de completeTransaction: callback de SKStoreKit. Esta llamada genera automáticamente un evento in-app de tipo 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;

 Nota

El parámetro de precio debería contener los ingresos totales asociados al evento de compra validado.


Esta llamada tiene dos bloques de callback: uno para "éxito" y otro para "falla" (por cualquier motivo, incluyendo falla de validación). Tras un éxito, se devuelve un diccionario con los datos de validación de compra (receipt validation).  

 Importante

Para fines de prueba, recomendamos establecer el indicador  useReceiptValidationSandbox en YES, ya que esto redirige las solicitudes a los servidores sandbox de Apple.

#ifdef DEBUG
[AppsFlyerTracker sharedTracker].useReceiptValidationSandbox = YES;
#endif

 

 Ejemplo

Objective-CSwift
[[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;
      }
  }];

 ¡Importante!

Cuando AppsFlyer valida una compra con los servidores de Apple, si la respuesta contiene una matriz in-app vacía, AppsFlyer devuelve {"status":"in_app_arr_empty"} a la devolución de llamada de error.

Si recibes esta indicación, debes restablecer el producto comprado en Apple enviando una solicitud de actualización de recibo. Para más información, consulta la documentación de Apple.

Después de actualizar el recibo, vuelve a invocar validateAndTrackInAppPurchase.

Consulta el código anterior para saber cómo proceder con este error.

Para obtener una lista de posibles valores de retorno para validar recibos, consulta la documentación de Apple  aquí.

Anonimizar

AppsFlyer te ofrece un método para anonimizar identificadores de usuarios específicos en las analíticas de AppsFlyer. Este método cumple con los últimos requisitos de privacidad y con las políticas de datos y privacidad de Facebook. El valor predeterminado es NO, lo que significa que no se efectuará la anonimización de forma predeterminada.

Usa esta API durante la Inicialización del SDK para anonimizar explícitamente las instalaciones, los eventos y las sesiones de un usuario:

SwiftObjective-C
AppsFlyerTracker.shared().deviceTrackingDisabled = true

El rastreo se puede reiniciar llamando a deviceTrackingDisabled nuevamente configurado como falso.

 Advertencia

Anonimizar a los usuarios afecta SEVERAMENTE tu información de atribución.
Usa esta opción SOLO para regiones donde la ley te impida recopilar información de tus usuarios.

Tiempo Personalizado Entre Sesiones

De manera predeterminada, deben pasar por lo menos 5 segundos entre 2 inicios de aplicaciones para que cuenten como 2 sesiones separadas (más información acerca del recuento de sesiones).
Sin embargo, puedes usar la siguiente API para establecer tu valor personalizado para el tiempo mínimo requerido entre sesiones:

SwiftObjective-C
AppsFlyerTracker.shared().minTimeBetweenSessions = <your_custom_time_in_seconds>
Ten en cuenta que si estableces un valor alto para el tiempo personalizado entre inicios, esto puede afectar mucho a las API que dependen de los datos de sesión, como los enlaces profundos.

Sesiones de Segundo Plano para Aplicaciones de Utilidad

No disponible en iOS. 
 

Extensiones de aplicaciones de iOS y WatchKit

La extensión de la aplicación requiere permisos para usar Internet:

  1. Ve al archivo info.plist de tu extensión de la aplicación
  2. En NSExtension /NSExtensionAttributes, establece el indicadorRequestsOpenAccessen YES.

Agrega el siguiente código a UIViewControlle viewDidLoad de la extensión de la aplicación:

SwiftObjective-C
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()
  }

Para recibirdatos de atribución en la extensión de la aplicación, sigue las instrucciones aquíe impleméntalas en el UIViewController de tu aplicación en lugar de implementarlas en AppDelegate.

Optar por la exclusión

Una vez invocada esta API, nuestro SDK ya no se comunicará con nuestros servidores y dejará de funcionar. Puedes hacerlo con la API isStopTracking. Una vez invocada esta API, nuestro SDK ya no se comunicará con nuestros servidores y dejará de funcionar.

Existen varios casos para que un usuario opte por la exclusión. Es muy recomendable que sigas las instrucciones exactas para la situación correspondiente a tu aplicación.

 Advertencia

Utilice esta API solo en casos en los que quiera ignorar por completo a este usuario de toda la atribución de instalación y registro de eventos. La utilización de esta API afecta SEVERAMENTE su mecanismo de atribución, recopilación de datos y establecimiento de encales profundos.

SwiftObjective-C
AppsFlyerTracker.shared().isStopTracking = true

 Importante

No llames a trackAppLaunch si isStopTracking está configurado como verdadero.

Recopilar Nombre del Dispositivo

El SDK de AppsFlyer te permite recopilar el Nombre del Dispositivo para tus análisis internos. Esta función está desactivada de forma predeterminada. Para activarla, usa la siguiente API:

SwiftObjective-C
AppsFlyerTracker.shared().shouldCollectDeviceName = false

 Importante

El Nombre del Dispositivo podría considerarse información personal en ciertas regiones. Solo recopila esta información si sabes que tienes permiso legal y has recibido el consentimiento explícito del usuario para hacerlo.

Configuración de datos personalizados adicionales

La API setAdditionalData es necesaria para la integración a nivel del SDK con varias plataformas de partners externos, incluidas Segment, Adobe y Urban Airship. Usa esta API solo si el artículo de integración de la plataforma indica específicamente que es necesaria la API setAdditionalData.
A continuación, se muestra un ejemplo de código para implementar setAdditionalData en iOS para Objective-C o Swift:

Objective-CSwift
NSDictionary* CustomDataMap = [[NSDictionary alloc] initWithObjectsAndKeys:@"value_of_param_1", @"custom_param_1", nil];
  
[[AppsFlyerTracker sharedTracker] setAdditionalData:CustomDataMap];

Resolución de URL encapsuladas de enlaces profundos

Si usas OneLink que sean compatibles con enlaces universales y los encapsula con un enlace universal de terceros, puedes usar la API setResolveDeepLinkURLs para notificar al SDK de AppsFlyer qué dominios click que invocan la aplicación debe resolver el SDK y obtener el OneLink resultante extraído de ellos. Esto te permitirá mantener las conexiones profundas y la atribución mientras encapsula el OneLink con un enlace universal de terceros.Asegúrate de llamar a esta API antes de la inicialización de SDK.

Objective-CSwift
[AppsFlyerTracker sharedTracker].resolveDeepLinkURLs = @[@"example.com",@"click.example.com"];

10. Probando Tu Integración

Para detalles sobre cómo probar tu integración, haz clic aquí.

Ahora puedes comenzar a medir los resultados de las fuentes de medios con las que trabajas.

11. Enviando la aplicación a la App Store

Puedes encontrar las instrucciones para enviar tu aplicación a la App Store aquí .

¿Fue útil este artículo?
Usuarios a los que les pareció útil: 10 de 18

Comentarios

0 comentarios

Inicie sesión para dejar un comentario.

Contenido de la página: