Устранение неполадок

Подмена iOS

  • Плагин Unity для AppsFlyer использует события жизненного цикла iOS для работы SDK.
  • Плагин использует UnityAppController для вызова событий жизненного цикла.
  • Иногда другие плагины (Firebase, Facebook и пр.) используют тот же UnityAppController, что приводит к возникновению конфликтов в событиях жизненного цикла.
  • Эти события включают didBecomeActive, didEnterBackground, didReceiveRemoteNotification, continueUserActivity и openURL.
  • При возникновении конфликта нельзя вызывать эти методы.
  • Плагин AppsFlyer Unity предлагает в качестве решения подмену (Swizzling).
  • Дата начала v6.0.7 есть опция автоматического включения подмены.

Есть 3 способа включения подмены:

Использование info.plist

  • Чтобы включить подмену, в файле info.plist необходимо установить логическое значение K/V AppsFlyerShouldSwizzle на 1 (true).
  • При этом будет автоматически включена подмена и разрешены конфликты с другими плагинами.
  • Проверьте вызов кода AppsFlyer+AppController на нативной стороне.
  • Превратите в комментарий IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController) в AppsFlyerAppController.mm.

Использование скрипта c#

  1. Создайте новый скрипт c#. (мы вызвали наш AFUpdatePlist.cs)
  2. Перенесите скрипт в папку редактора (Активы > Редактор > AFUpdatePlist.cs)
  3. Код в скрипте должен выглядеть так:
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. Проверьте вызов кода AppsFlyer+AppController на нативной стороне.
  2. Превратите в комментарий IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController) в AppsFlyerAppController.mm.

Использование макропроцессора

  • Добавьте флаг preprocessor macro ​AFSDK_SHOULD_SWIZZLE=1 , чтобы создать настройки проекта.

alt text


Обновление info.plist

В этом примере мы обновим info.plist для отправки постбэков SKAN в AppsFlyer, но скрипт можно настроить для обновления любого ключа в info.plist.

  1. Создайте новый скрипт c#. (мы вызвали наш AFUpdatePlist.cs)
  2. Перенесите скрипт в папку редактора (Активы > Редактор > AFUpdatePlist.cs)
  3. Код в скрипте должен выглядеть так:
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");
        }

    }
}