Resolución de Problemas

iOS Swizzling

  • El plugin de AppsFlyer para Unity utiliza los eventos del ciclo de vida de iOS para que el SDK funcione.
  • Los plugins utilizan UnityAppController para invocar los eventos del ciclo de vida.
  • En ocasiones otros plugins (Firebase, Facebook, ect) utilizan el mismo UnityAppController, lo que crea conflictos en los eventos del ciclo de vida.
  • Estos eventos incluyen didBecomeActive, didEnterBackground, didReceiveRemoteNotification, continueUserActivity y openURL.
  • Cuando ocurre un conflicto, estos métodos no pueden ser invocados.
  • La solución proporcionada por el plugin de AppsFlyer para Unity es Swizzling.
  • Comenzando desde v6.0.7 hay una opción para habilitar el swizzling automáticamente.

Para habilitar el Swizzling, tienes 3 opciones:

Usando info .plist

  • Para habilitar el swizzling, en el archivo info.plist, un booleano K/V llamado AppsFlyerShouldSwizzle debe establecerse en 1 (true).
  • Esto automáticamente habilitará el swizzling y resolverá los conflictos con otros plugins.
  • Valida que el código en AppsFlyer+AppController se llame en el lado nativo.
  • Convierte en comentario IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController) en AppsFlyerAppController.mm.

Usando un script de c#

  1. Crea un nuevo script de c# (al nuestro le dimos el nombre AFUpdatePlist.cs).
  2. Coloca el script en una carpeta del editor (Assets > Editor > AFUpdatePlist.cs)
  3. El código en el script debería verse así:
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. Valida que el código en AppsFlyer+AppController se llame en el lado nativo.
  2. Convierte en comentario IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController) en AppsFlyerAppController.mm.

Usando un macroprocesador

  • Agrega el indicador de macro del preprocesador ​AFSDK_SHOULD_SWIZZLE=1 a los ajustes de construcción del proyecto.

alt text


Actualización de info.plist

En este ejemplo, actualizaremos el info.plist para enviar postbacks de SKAN a AppsFlyer, pero el script se puede ajustar para actualizar cualquier clave en el info.plist.

  1. Crea un nuevo script de c# (al nuestro le dimos el nombre AFUpdatePlist.cs).
  2. Coloca el script en una carpeta del editor (Assets > Editor > AFUpdatePlist.cs)
  3. El código en el script debería verse así:
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");
        }

    }
}