Integrar o SDK

Saiba como inicializar e iniciar o SDK do iOS.

Antes de começar

  • Antes de integrar, você deve Instalar o SDK.
  • Este documento contém exemplos de implementações. Certifique-se de substituir o seguinte:
    • <YOUR_DEV_KEY>: A chave do desenvolvedor da AppsFlyer.
    • <APPLE_APP_ID>: o ID do aplicativo da Apple (sem o prefixo id ).
    • Placeholders adicionais, quando necessário.

Inicializando o SDK do iOS

Etapa 1: importar dependências
Importar AppsFlyerLib:

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

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@end
import UIKit
import AppsFlyerLib

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

Etapa 2: inicializar o SDK
In didFinishLaunchingWithOptions configure seu ID do aplicativo Apple e a chave do desenvolvedor da 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>"

Iniciando o SDK do iOS

In applicationDidBecomeActive, call start:

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

Add SceneDelegate support

OPCIONAL
Faça o seguinte somente se você usar SceneDelegates:

In didFinishLaunchingWithOptions, adicione um observador UIApplicationDidBecomeActiveNotification e configure-o para executar 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 o SDK foi iniciado com sucesso e notificou os servidores da AppsFlyer, chame start com um manipulador de conclusão. Você pode aplicar a lógica para lidar com o sucesso ou a falha da inicialização do 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
            }
        })

Exemplo 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()
    }
// ...
}

Link do Github

Definindo o ID de usuário cliente

OPCIONAL
O ID de usuário cliente (CUID) é um identificador de usuário exclusivo criado fora do SDK pelo proprietário do aplicativo. Se disponibilizado para o SDK, ele pode ser associado a instalações e outros eventos in-app. Esses eventos marcados com CUID podem ter referência cruzada com dados do usuário de outros dispositivos e aplicativos.

Set the CUID

Para definir o CUID:

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

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 chamar o método start . Isso ocorre porque start envia o evento de instalação para a AppsFlyer. Se o CUID for configurado após a chamada start, ele não será associado ao evento de instalação.

- (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

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

Suporte para iOS 14

A seguir estão os guias sobre como configurar o suporte para os recursos do iOS 14+.

Enabling App Tracking Transparency (ATT) support

A partir do iOS 14.5, o acesso ao IDFA é regido pela estrutura ATT.
A ativação da compatibilidade ATT no SDK lida com a coleta de IDFA em dispositivos com iOS 14.5+ instalado.

🚧

Atenção

Somente chame waitForATTUserAuthorization se você pretende chamar requestTrackingAuthorization em algum lugar do seu aplicativo.

Etapa 1: Configurar waitForATTUserAuthorization
Ao Inicializar o SDK, antes de chamar start In applicationDidBecomeActive, call waitForATTUserAuthorization:

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

Link do Github

Configurado timeoutInterval de tal forma que os usuários do aplicativo têm tempo suficiente para ver e interagir com o prompt ATT. Alguns exemplos:

  • Se o prompt da ATT é indicado na inicialização do aplicativo — um intervalo de 60 segundos deve ser suficiente
  • Se o prompt ATT for exibido após um tutorial que leva aproximadamente 2 minutos para ser concluído, um intervalo de 120 segundos deve ser suficiente.

Etapa 2: Chamar requestTrackingAuthorization
Somente chame requestTrackingAuthorization onde você deseja exibir o prompt:

- (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")
        }
      }
    }
}

Link do Github

📘

Observação

  • Você precisa importar a estrutura AppTrackingTransparency para chamar requestTrackingAuthorization.
  • De acordo com a documentação da Apple:
    • requestTrackingAuthorization é chamado apenas se o aplicativo estiver no estado UIApplicationStateActive .
    • requestTrackingAuthorization não pode ser invocado a partir das Extensões de Aplicativo.

Customizing the ATT consent dialog

A caixa de diálogo de consentimento da ATT pode ser personalizada modificando o Xcode do seu projeto info.plist:

Para obter instruções detalhadas, consulte a documentação da Apple.

Attributing App Clips

A atribuição do Apple App Clips foi introduzida no SDK do iOS V6.0.8. Consulte nosso guia de integração do App Clips para obter instruções detalhadas.

Sending SKAN postback copies to AppsFlyer

iOS 15
Configure seu aplicativo para enviar cópias de postback para a AppsFlyer.

Para registrar o endpoint da AppsFlyer:

  1. Adicione o NSAdvertisingAttributionReportEndpoint para o info.plist.
  2. Defina o valor da chave como https://appsflyer-skadnetwork.com/.

De acordo com a Apple, você pode definir apenas um ponto final. Cópias de postbacks recebidos estão disponíveis no relatório de cópia de postbacks.

Ativação do modo de depuração

Você pode habilitar os logs de depuração definindo isDebug como true:

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

📘

Observação

Para ver logs de depuração completos, certifique-se de definir isDebug antes de invocar outros métodos do SDK.

Veja o exemplo.

🚧

Aviso

Para evitar o vazamento de informações confidenciais, verifique se os registros de depuração estão desativados antes de distribuir o aplicativo.

Testando a integração

Para obter instruções detalhadas de teste de integração, consulte o guia de teste de integração do SDK do iOS.