Integra el SDK de AppsFlyer en tu aplicación iOS, registra instalaciones, actualizaciones y eventos in-app. Evalúa el engagement de los usuarios.
Versión del SDK: 5.0.0 (Notas de lanzamiento)
1. Resumen
Mediante el SDK de AppsFlyer, puedes registrar instalaciones, actualizaciones, sesiones y eventos in-app adicionales. Al usar los eventos in-app, puedes registrar eventos como compras in-app y niveles de juego. Utiliza esta información para evaluar el retorno de la inversión (ROI) y los niveles de interacción (engagement) de los usuarios. El SDK de iOS es compatible con todos los dispositivos iOS (iPhone, iPod, iPad) con iOS versión 6.0 y superior.
Nota
El SDK de AppsFlyer cumple con todas las normas de 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
- A fin de implementar la integración básica del SDK, es decir, solo la atribución de instalaciones, es obligatorio completar los procedimientos que figuran en las secciones 2 y 3 de este documento.
- Te recomendamos que leas la sección sobre registro de eventos in-app para ayudar a la implementación.
- El resto de las características descritas son opcionales y su implementación dependerá de la lógica comercial de tu aplicación. Por ejemplo, el registrar ingresos u obtener datos de conversión al momento del primer inicio puede resultar fundamental para el flujo de tu aplicación.
2. Inicio rápido
2.1 Descarga y agrega el SDK de AppsFlyer a xcode
- Asegúrate de haber descargado e instalado la última versión de CocoaPods.
- Agrega la siguiente fila a tu
Podfile
:pod 'AppsFlyerFramework'
- ejecuta
la instalación pod
- Asegúrate de usar el archivo
.xcworkspace
para abrir tu proyecto en Xcode, en lugar del archivo.xcodeproj
, de aquí en adelante.
- Asegúrate de haber instalado la última versión de Carthage.
- Agrega la siguiente línea a tu Cartfile:
- binary "https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerFramework/master/AppsFlyerTracker.json"
Nota
Este método es compatible solamente con iOS 8 y versiones posteriores.
- Descargue el SDK para iOS como marco estático
Para verificar la integridad de la descarga del marco estático del SDK, haga clic aquí. - Descomprime el archivo AppsFlyerLib.framework.zip que acabas de descargar
- Arrastra la AppsFlyerLib.framework y colócala en tu proyecto de Xcode
- Asegúrese de que esté marcada la opción Copiar elementos si es necesario.
- Agregue AdSupport.framework y iAd.framework a su proyecto y configúrelo como Opcional
Nota
- Este enfoque solo se recomienda si deseas dar soporte a iOS 7 en tu aplicación.
- Al importar la biblioteca estática a un proyecto Swift, se debe agregar el archivo
AppsFlyerTrackher.h
como archivo de encabezado puente para su proyecto.
- Descargue el SDK para iOS como biblioteca estática
Para verificar la integridad de la descarga de la biblioteca estática del SDK, haga clic aquí. - Descomprime el archivo que descargaste
- Arrastra y suelta AppsFlyerTracker.h y libAppsFlyerLib.a en tu proyecto de Xcode
- Asegúrese de que esté marcada la opción Copiar elementos si es necesario.
- Agregue AdSupport.framework y iAd.framework a su proyecto y configúrelo como Opcional
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 Configura el delegado de aplicación para la integración
En AppDelegate.swift, haz lo siguiente:
- importa AppsFlyerLib
- Agrega
AppsFlyerTrackerDelegate
a la declaración de clase.
Importa AppsFlyerLib
class AppDelegate: UIResponder, UIApplicationDelegate, AppsFlyerTrackerDelegate {
// your code here
}
En AppDelegate.h, haz lo siguiente:
- Importa
AppsFlyerLib/AppsFlyerTracker.h
- Agrega
AppsFlyerTrackerDelegate
a la declaración de interfaz.
#import <AppsFlyerLib/AppsFlyerTracker.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate, AppsFlyerTrackerDelegate>
En AppDelegate.m, importa AppsFlyerLib/AppsFlyerTracker.h
#import <AppsFlyerLib/AppsFlyerTracker.h>
3. Inicialización del SDK
Inicializa el SDK en el método didFinishLaunchingWithOptions
con tu ID de aplicación de iTunes Connect y tu clave de desarrollador de AppsFlyer. Además, agrega los métodos de API para manejar los datos de conversión y los enlaces profundos.
Ten en cuenta que aquí debes configurar el ID de aplicación únicamente con dígitos, sin el prefijo "id".
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
}
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
}
- (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;
}
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
:
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.... }
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. Registrar 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
AppsFlyerTracker.shared().trackEvent(AFEventPurchase,
withValues: [
AFEventParamRevenue: "1200",
AFEventParamContent: "shoes",
AFEventParamContentId: "123"
]);
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
AppsFlyerTracker.shared().trackEvent(AFEventPurchase,
withValues: [
AFEventParamRevenue: @1200,
AFEventParamCurrency : @"JPY"
]);
[[AppsFlyerTracker sharedTracker] 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.
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
}
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
}
-(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. Registrar los 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
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"
}];
¡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.
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"
}];
Nota
Observe lo siguiente en el código anterior:
- El valor de ingresos está precedido por un signo de menos
- 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:
let appsflyerId = AppsFlyerTracker.shared().getAppsFlyerUID()
NSString *appsflyerId = [AppsFlyerTracker sharedTracker].getAppsFlyerUID;
Establecer ID de Usuario de Cliente
Al establecer tu propio ID de cliente, podrás establecer referencias cruzadas entre tu propio ID exclusivo, el ID exclusivo de AppsFlyer y los ID de los otros dispositivos. El ID está disponible en los reportes de raw data (datos sin procesar) de AppsFlyer y en las API de postback para hacer establecer referencias cruzadas con tus ID internos.
Para configurar tu ID de usuario de cliente:
AppsFlyerTracker.shared().customerUserID = "my user id"
[AppsFlyerTracker sharedTracker].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:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
AppsFlyerTracker.shared().handlePushNotification(userInfo)
}
-(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
[[AppsFlyerTracker sharedTracker] 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 la promoción cruzada
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
Definición de código de moneda
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:
AppsFlyerTracker.shared().currencyCode = "USD"
[AppsFlyerTracker sharedTracker].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
[[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>
})
¡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:
AppsFlyerTracker.shared().deviceTrackingDisabled = true
[AppsFlyerTracker sharedTracker].deviceTrackingDisabled = YES;
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:
AppsFlyerTracker.shared().minTimeBetweenSessions = <your_custom_time_in_seconds>
[AppsFlyerTracker sharedTracker].minTimeBetweenSessions = <your_custom_time_in_seconds>;
Sesiones de segundo plano para aplicaciones de utilidad
Extensiones de aplicaciones de iOS y WatchKit
La extensión de la aplicación requiere permisos para usar Internet:
- Ve al archivo info.plist de tu extensión de la aplicación
- En
NSExtension
/NSExtensionAttributes,
establece el indicadorRequestsOpenAccess
en YES.
Agrega el siguiente código a UIViewControlle viewDidLoad
de la extensión de la aplicación:
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];
}
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.
AppsFlyerTracker.shared().isStopTracking = true
[AppsFlyerTracker sharedTracker].isStopTracking = true;
Importante
No llames a trackAppLaunch
si isStopTracking
está configurado como verdadero
.
Retrasar la inicialización del SDK para customerUserID
Es posible retrasar la inicialización del SDK hasta que se configure el customerUserID. Esto asegura que el SDK no comience a funcionar hasta que se proporcione el customerUserID (ID de usuario del cliente). Cuando retrasas la inicialización del SDK, se descartan todos los eventos in-app y cualquier otra llamada a las API del SDK, hasta que se proporcione y registre el customerUserID.
Puedes agregar lógica a la API de iOS applicationDidBecomeActive para retrasar la inicialización del SDK hasta que se configure el ID de usuario del cliente. A continuación se dan algunos ejemplos:
- (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
}
}
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:
AppsFlyerTracker.shared().shouldCollectDeviceName = false
[AppsFlyerTracker sharedTracker].shouldCollectDeviceName = NO;
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:
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
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.
[AppsFlyerTracker sharedTracker].resolveDeepLinkURLs = @[@"example.com",@"click.example.com"];
AppsFlyerTracker.shared().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í .
Comentarios
Inicie sesión para dejar un comentario.