Android版AppsFlyer的Unity简单接入

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

现在打开的AppsFlyer的官方帮助文档,Unity版本的接入指南已经没有了,只能找到Android版的和IOS版本的指南,就只能写一个简单的Android的接入,比较简单,仅供自己在下次使用的时候参考,只添加了上报事件的功能,它原来版本添加SDK里面的很多功能没有添加


一、Android的配置和代码

1.引入库

dependencies {
    compileOnly files('libs/CorePlayingNativeLib.aar')
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.appsflyer:af-android-sdk:6.1.4'
    implementation 'com.android.installreferrer:installreferrer:1.0'
    compile 'cn.hutool:hutool-all:5.5.7'
}

这些是阅读官网的时候发现要添加的库,第一行代码是公司自己的库,添加于本地的,这个库在这里只是提供一个获取当前的Activity的方法,不用太在意

1.代码

import java.util.Map;
import android.util.Log;
import java.util.HashMap;
import com.appsflyer.AppsFlyerLib;
import com.appsflyer.AppsFlyerConversionListener;
import com.coreplaying.coreplayingnativelib.CorePlayingNativeLib;


class AppsFlyerNativeLib {
    private static AppsFlyerNativeLib m_instance;
    private String TAG = "AppsFlyerNativeLib";

    public static AppsFlyerNativeLib getInstance()
    {
        if (m_instance == null)
            m_instance = new AppsFlyerNativeLib();
        return m_instance;
    }

    private String AF_DEV_KEY = "yourkey";
    private String currencyType = "USD";

    public void Init(String devKey,String currencyType){
        Log.d(TAG, "Init: devKey = " + devKey + "    currencyType = " + currencyType);
        if (devKey.isEmpty() == false)
            this.AF_DEV_KEY = devKey;
        if (currencyType.isEmpty() && currencyType != "")
            this.currencyType = currencyType;
        else
            this.currencyType = "USD";

        AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() {
            @Override
            public void onConversionDataSuccess(Map<String, Object> map) {
                for(String attrName:map.keySet())
                {
                    Log.d(TAG, "attribute: " + attrName + " = " + map.get(attrName));
                }
            }

            @Override
            public void onConversionDataFail(String s) {
                Log.d(TAG, "onConversionDataFail: " + s);
            }

            @Override
            public void onAppOpenAttribution(Map<String, String> map) {
                for (String attrName:map.keySet()){
                    Log.d(TAG, "onAppOpenAttribution: " + attrName + " = " + map.get(attrName));
                }
            }
            @Override
            public void onAttributionFailure(String s) {
                Log.d(TAG, "onAttributionFailure: " + s);
            }
        };

        AppsFlyerLib.getInstance().init(AF_DEV_KEY,conversionListener, CorePlayingNativeLib.GetUnityActivity());
        AppsFlyerLib.getInstance().start(CorePlayingNativeLib.GetUnityActivity());
    }


    public void SendEvent(String eventName,HashMap<String, Object> eventValues)
    {
        AppsFlyerLib.getInstance().logEvent(CorePlayingNativeLib.GetUnityActivity(),eventName,eventValues);
    }
}

这就是安卓端的代码,只有初始化和事件上报的内容

二、Unity端的代码

1.C#

public class AndroidAppsFlyerManager
{
    private AndroidJavaObject appsFlyerObject { get; set; }
    private string eventName { get; set; } = "eventId";
    private string initKey { get; set; } = "Init";
    private string currencyType { get; set; } = "currencyType";
    private string devKeyName { get; set; } = "devKey";


    public static AndroidAppsFlyerManager Instance
    {
        get
        {
            if (m_Instance == null)
                m_Instance = new AndroidAppsFlyerManager();
            return m_Instance;
        }
    }
    private bool isInit { get; set; } = false;
    private static AndroidAppsFlyerManager m_Instance;

    private AndroidAppsFlyerManager()
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        Debug.Log("AndroidAppsFlyerManager:AndroidAppsFlyerManager");
        var packageName = "com.coreplaying.appsflyernativelib.AppsFlyerNativeLib";

        AndroidJavaClass javaClass = new AndroidJavaClass(packageName);
        if (javaClass == null)
        {
            Debug.LogError("未能获得Android对象,无法调用Affsflyer上报数据");
            return;
        }
        appsFlyerObject = javaClass.CallStatic<AndroidJavaObject>("getInstance");
        
        if (appsFlyerObject == null)
        {
            Debug.LogError("未能获得Android对象,无法调用Affsflyer上报数据");
            return;
        }
        else
        {
            Debug.Log("AndroidAppsFlyerManager:AndroidAppsFlyerManager:成功");
        }
#endif
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="currencyType">货币类型</param>
    private void Init(string devKey,string currencyType)
    {
        if (this.appsFlyerObject == null)
            return;
        Debug.Log("AndroidAppsFlyerManager:Init");
        if (string.IsNullOrEmpty(currencyType))
            currencyType = "USD";

        appsFlyerObject.Call("Init", devKey, currencyType);
    }
    public void SendEvent(string jsonData)
    {
        if (this.appsFlyerObject == null)
            return;
        Debug.Log("Unity:AndroidAppsFlyerManager:SendEvent---->" + jsonData);
        var evtDic = this.JasonToDictionary(jsonData);
        if (evtDic.Count == 0)
        {
            Debug.LogError("AndroidAppsFlyerManager:SendEvent:数据有误无法转换--->" + jsonData);
            return;
        }
        if (evtDic[this.eventName] == this.initKey)
        {
            string currency = string.Empty;
            string devKey = string.Empty;
            if (evtDic.ContainsKey(currencyType))
                currency = evtDic[currencyType];
            if (evtDic.ContainsKey(devKeyName))
                devKey = evtDic[devKeyName];
            Init(devKey,currency);
            return;
        }
        appsFlyerObject.Call("SendEvent", evtDic[this.eventName], convertDictionaryToJavaMap(evtDic));
    }

    private Dictionary<string, string> JasonToDictionary(string jasonData)
    {
        if (string.IsNullOrEmpty(jasonData))
        {
            Debug.LogError("AppEventRequest:ProcessData---->jasonData = null");
            return new Dictionary<string, string>();
        }

        List<object> items = (List<object>)MiniJSON.Json.Deserialize(jasonData);
        if (items == null)
        {
            Debug.LogError("AppEventRequest:ProcessData---->items = null");
            return new Dictionary<string, string>();
        }

        var evtDic = new Dictionary<string, string>();
        for (int i = 0; i < items.Count; ++i)
        {
            var evtList = items[i] as List<object>;
            if (evtList == null)
            {
                Debug.LogError("AppEventRequest:ProcessData:evtList == null");
                return new Dictionary<string, string>();
            }
            evtDic.Add(evtList[0].ToString(), evtList[1].ToString());
        }
        return evtDic;
    }
    private static AndroidJavaObject convertDictionaryToJavaMap(Dictionary<string, string> dictionary)
    {
        AndroidJavaObject map = new AndroidJavaObject("java.util.HashMap");
        IntPtr putMethod = AndroidJNIHelper.GetMethodID(map.GetRawClass(), "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
        if (dictionary != null)
        {
            foreach (var entry in dictionary)
            {
                AndroidJNI.CallObjectMethod(map.GetRawObject(), putMethod, AndroidJNIHelper.CreateJNIArgArray(new object[] { entry.Key, entry.Value }));
            }
        }
        return map;
    }
}

初始化和上传事件的都是通过SendEvent(string json)上传的,参数为json字符串

原文地址:https://blog.csdn.net/qq_44769818/article/details/115345999

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了Unity游戏开发中外观模式是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍Unity中地面检测方案的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.普通射线在角色坐标(一般是脚底)...
这篇文章主要介绍了Unity游戏开发中如何消除不想要的黄色警告,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带...
这篇文章主要介绍了Unity中有多少种渲染队列,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章主要介绍Unity中如何实现Texture,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!了解Texture2D 如上图,Texture2D是一张
小编给大家分享一下Unity中DOTS要实现的特点有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
这篇文章给大家分享的是有关unity中如何实现UGUI遮罩流光特效的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面是核心shader:Sh...
这篇文章主要为大家展示了“Unity中如何实现3D坐标转换UGUI坐标”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下...
这篇文章主要介绍了Unity游戏开发中设计模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍了Unity中如何实现仿真丝袜渲染,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章给大家分享的是有关Unity插件OVRLipSync有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目需要接入对话口型动...
这篇文章主要介绍了Unity性能优化之DrawCall的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章给大家分享的是有关Unity给力插件之Final IK怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这插件有什么用:一般游...
这篇文章给大家分享的是有关Unity中如何内嵌网页插件UniWebView的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、常见Unity中内...
小编给大家分享一下Unity如何做流体物理的几个轮子,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
小编给大家分享一下Unity中Lod和Occlusion Culling的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收...
这篇文章将为大家详细讲解有关Unity中LineRenderer与TrailRenderer有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获...
这篇文章主要介绍了Unity中coroutine问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起...
这篇文章将为大家详细讲解有关unity中spine怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。骨骼动画首先我们来看到...
这篇文章主要为大家展示了“Unity Shader后处理中如何实现简单均值模糊”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学...