iOS Swizzling

  • Le plugin AppsFlyer Unity utilise les événements du cycle de vie iOS pour que le SDK fonctionne.
  • Le plugin utilise UnityAppController pour invoquer les événements du cycle de vie.
  • Parfois, d'autres plugins (Firebase, Facebook, etc.) utilisent le même UnityAppController, ce qui crée des conflits dans les événements du cycle de vie.
  • Ces événements comprennent didBecomeActive, didEnterBackground, didReceiveRemoteNotification, continueUserActivity et openURL.
  • Lorsqu'un conflit survient, ces méthodes ne peuvent pas être invoquées.
  • La solution fournie par le plugin AppsFlyer Unity est le swizzling.
  • À compter de v6.0.7 , une option permet d'activer le swizzling automatiquement.

Pour activer le swizzling, vous avez 3 options :

Utilisation d'info .plist

  • Pour activer le swizzling, dans le fichier info.plist, un booléen K/V appelé AppsFlyerShouldSwizzle doit être défini sur 1 (true).
  • Cela permettra d'activer automatiquement le swizzling et de résoudre les conflits avec d'autres plugins.
  • Assurez-vous que le code dans AppsFlyer+AppController est appelé du côté natif.
  • Commentaire IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController) dans AppsFlyerAppController.mm.

Utilisation d'un script c#

  1. Créez un nouveau script c#. (nous avons appelé le nôtre AFUpdatePlist.cs)
  2. Placez le script dans un dossier de l'éditeur (Ressources > Éditeur > AFUpdatePlist.cs)
  3. Le code du script devrait ressembler à ceci :
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. Assurez-vous que le code dans AppsFlyer+AppController est appelé du côté natif.
  2. Commentaire IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController) dans AppsFlyerAppController.mm.

Utilisation d'un macroprocesseur

alt text


Mise à jour de l'info.plist

Dans cet exemple, nous allons mettre à jour info.plist pour envoyer les postbacks SKAN vers AppsFlyer, mais le script peut être ajusté pour mettre à jour n'importe quelle clé dans info.plist

  1. Créez un nouveau script c#. (nous avons appelé le nôtre AFUpdatePlist.cs)
  2. Placez le script dans un dossier de l'éditeur (Ressources > Éditeur > AFUpdatePlist.cs)
  3. Le code du script devrait ressembler à ceci :
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");
        }

    }
}