Solução de problemas

iOS Swizzling

  • O plug-in Unity da AppsFlyer usa os eventos do ciclo de vida do iOS para que o SDK funcione.
  • Os plug-ins usam UnityAppController para que os eventos do ciclo de vida sejam invocados.
  • Às vezes, outros plugins (Firebase, Facebook, etc) usam o mesmo UnityAppController, o que cria conflitos nos eventos do ciclo de vida.
  • Esses eventos incluem didBecomeActive, didEnterBackground, didReceiveRemoteNotification, continueUserActivity e openURL.
  • Quando ocorre um conflito, esses métodos não podem ser invocados.
  • A solução fornecida pelo plug-in Unity da AppsFlyer é o Swizzling.
  • A partir de v6.0.7 há uma opção para ativar o Swizzling automaticamente.

Para habilitar o Swizzling, você tem 3 opções:

Usando informações .plist

  • Para ativar o Swizzling, no arquivo info.plist, um K/V booleano chamado AppsFlyerShouldSwizzle deve ser definido como 1 (verdadeiro).
  • Isso ativará automaticamente o Swizzling e resolverá conflitos com outros plugins.
  • Valide se o código no AppsFlyer+AppController é chamado no lado nativo.
  • Comente IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController) em AppsFlyerAppController.mm.

Usando o script ac#

  1. Crie um novo script c#. (chamamos o nosso de AFUpdatePlist.cs)
  2. Coloque o script em uma pasta do editor (Assets > Editor > AFUpdatePlist.cs)
  3. O código no script deve ficar assim:
using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

public class MyBuildPostprocessor {
    
    [PostProcessBuildAttribute]
    public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) {
        
        if (target == BuildTarget.iOS)
        {
            string plistPath = pathToBuiltProject + "/Info.plist";
            PlistDocument plist = new PlistDocument();
            plist.ReadFromString(File.ReadAllText(plistPath));
            
            PlistElementDict rootDict = plist.root;
            rootDict.SetBoolean("AppsFlyerShouldSwizzle", true);
            
            File.WriteAllText(plistPath, plist.WriteToString());
            
            Debug.Log("Info.plist updated with AppsFlyerShouldSwizzle");
        }
        
    }
}
  1. Valide se o código no AppsFlyer+AppController é chamado no lado nativo.
  2. Comente IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController) em AppsFlyerAppController.mm.

Usando macroprocessador

  • Adicione o sinalizador de macro do pré-processador ​AFSDK_SHOULD_SWIZZLE=1 para as configurações de construção do projeto.

alt text


Atualizando o info.plist

Neste exemplo, atualizaremos o info.plist para enviar postbacks SKAN para a AppsFlyer, mas o script pode ser ajustado para atualizar qualquer chave no info.plist

  1. Crie um novo script c#. (chamamos o nosso de AFUpdatePlist.cs)
  2. Coloque o script em uma pasta do editor (Assets > Editor > AFUpdatePlist.cs)
  3. O código no script deve ficar assim:
using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

public class MyBuildPostprocessor
{

    [PostProcessBuildAttribute]
    public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject)
    {

        if (target == BuildTarget.iOS)
        {
            string plistPath = pathToBuiltProject + "/Info.plist";
            PlistDocument plist = new PlistDocument();
            plist.ReadFromString(File.ReadAllText(plistPath));

            PlistElementDict rootDict = plist.root;
            rootDict.SetString("NSAdvertisingAttributionReportEndpoint", "https://appsflyer-skadnetwork.com/");
    
            /*** To add more keys :
            ** rootDict.SetString("<your key>", "<your value>");
            ***/

            File.WriteAllText(plistPath, plist.WriteToString());

            Debug.Log("Info.plist updated with NSAdvertisingAttributionReportEndpoint");
        }

    }
}