Pemecahan Masalah

iOS Swizzling

  • Plugin Unity AppsFlyer menggunakan event siklus hidup iOS agar SDK dapat berfungsi.
  • Plugin menggunakan UnityAppController untuk event siklus hidup yang akan dipanggil.
  • Terkadang plugin lain (Firebase, Facebook, dll) menggunakan UnityAppController yang sama, yang menimbulkan konflik dalam peristiwa siklus hidup.
  • Peristiwa ini termasuk didBecomeActive, didEnterBackground, didReceiveRemoteNotification, continueUserActivity, dan openURL.
  • Ketika terjadi konflik, metode ini tidak boleh digunakan.
  • Solusi yang disediakan oleh AppsFlyer Unity Plugin adalah Swizzling.
  • Mulai dari v6.0.7 ada opsi untuk mengaktifkan swizzling secara otomatis.

Untuk mengaktifkan Swizzling, Anda memiliki 3 opsi:

Menggunakan info .plist

  • Untuk mengaktifkan swizzling, di file info.plist, sebuah boolean K/V dipanggil AppsFlyerShouldSwizzle harus diatur ke 1 (true).
  • Ini secara otomatis akan mengaktifkan swizzling dan menyelesaikan konflik dengan plugin lain.
  • Validasi bahwa kode di AppsFlyer+AppController dipanggil di sisi asli.
  • Komentari IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController) di AppsFlyerAppController.mm.

Menggunakan Skrip c#

  1. Buat skrip c# baru. (kami menyebut milik kami AFUpdatePlist.cs)
  2. Tempatkan skrip di folder editor (Assets > Editor > AFUpdatePlist.cs)
  3. Kode dalam skrip akan terlihat seperti ini:
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. Validasi bahwa kode di AppsFlyer+AppController dipanggil di sisi asli.
  2. Komentari IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController) di AppsFlyerAppController.mm.

Menggunakan makroprosesor

  • Tambahkan flag makro preprosesor ​AFSDK_SHOULD_SWIZZLE=1 ke pengaturan build proyek.

alt text


Memperbarui info.plist

Dalam contoh ini, kami akan memperbarui info.plist untuk mengirim postback SKAN ke AppsFlyer, tetapi skrip dapat disesuaikan untuk memperbarui kunci apa pun di info.plist

  1. Buat skrip c# baru. (kami menyebut milik kami AFUpdatePlist.cs)
  2. Tempatkan skrip di folder editor (Assets > Editor > AFUpdatePlist.cs)
  3. Kode dalam skrip akan terlihat seperti ini:
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");
        }

    }
}