578 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			578 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C#
		
	
	
	
 | 
						||
//  Created by ZhuCong on 1/1/14.
 | 
						||
//  Copyright 2014 Umeng.com . All rights reserved.
 | 
						||
//
 | 
						||
//#undef UNITY_EDITOR
 | 
						||
 | 
						||
using UnityEngine;
 | 
						||
using System;
 | 
						||
using System.Runtime.InteropServices;
 | 
						||
using System.Collections;
 | 
						||
using System.Collections.Generic;
 | 
						||
using System.Text;
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
namespace Umeng
 | 
						||
{
 | 
						||
 | 
						||
    public partial class Analytics
 | 
						||
    {
 | 
						||
 | 
						||
 | 
						||
 | 
						||
#if UNITY_ANDROID
 | 
						||
		static bool hasInit = false;
 | 
						||
        protected static AndroidJavaClass UMConfigure = new AndroidJavaClass("com.umeng.commonsdk.UMConfigure");
 | 
						||
        //protected static  AndroidJavaClass Agent = new AndroidJavaClass("com.umeng.analytics.game.UMGameAgent");
 | 
						||
        protected static  AndroidJavaClass Agent = new AndroidJavaClass("com.umeng.analytics.MobclickAgent");
 | 
						||
        protected static  AndroidJavaObject Context = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
 | 
						||
 | 
						||
#endif
 | 
						||
 | 
						||
        private const string Version = "3.2";
 | 
						||
	    public enum DeviceType
 | 
						||
	    {
 | 
						||
		    Phone = 0,
 | 
						||
		    Box = 1
 | 
						||
	    }
 | 
						||
 | 
						||
 | 
						||
		
 | 
						||
		
 | 
						||
 | 
						||
 | 
						||
		
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
	
 | 
						||
        //iOS Android Universal API
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        // 
 | 
						||
        /// <summary>
 | 
						||
        /// 开始友盟统计 默认发送策略为启动时发送
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="appKey">友盟appKey</param>
 | 
						||
        /// <param name="channelId">渠道名称</param>
 | 
						||
        ///
 | 
						||
        ///
 | 
						||
        public static void StartWithAppKeyAndChannelId(string appKey, string channelId)
 | 
						||
        {
 | 
						||
#if UNITY_EDITOR
 | 
						||
            //Debug.LogWarning("友盟统计在iOS/Android 真机上才会向友盟后台服务器发送事件 请在真机上测试");
 | 
						||
 | 
						||
#elif UNITY_IPHONE
 | 
						||
 | 
						||
       
 | 
						||
	        UMCommonSetAppkeyAndChannel(appKey,channelId);
 | 
						||
            //iOS 必须设置 android 无此API
 | 
						||
	        _SetScenarioType();
 | 
						||
 | 
						||
 | 
						||
#elif UNITY_ANDROID
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
	        UMCommonSetAppkeyAndChannel(appKey,channelId);
 | 
						||
            //2次init 第一次UMConfigureinit在UMCommonSetAppkeyAndChannel方法内,第二次在这里UMGameAgent.init()
 | 
						||
            Agent.CallStatic("init",Context);
 | 
						||
 | 
						||
 | 
						||
			if(!hasInit)
 | 
						||
			{
 | 
						||
				//Debug.LogWarning("onResume");
 | 
						||
				onResume();
 | 
						||
 | 
						||
				AddUmengAndroidLifeCycleCallBack();
 | 
						||
				hasInit = true;
 | 
						||
			}
 | 
						||
 | 
						||
 | 
						||
#endif
 | 
						||
        }
 | 
						||
 | 
						||
        private static void UMCommonSetAppkeyAndChannel(string appkey, string channelId,DeviceType deviceType=DeviceType.Phone,string pushSecret=null)
 | 
						||
	    {
 | 
						||
 | 
						||
#if UNITY_EDITOR
 | 
						||
 | 
						||
 | 
						||
#elif UNITY_IPHONE
 | 
						||
 | 
						||
 | 
						||
			_SetWrapperTypeAndVersion("Unity", Version);
 | 
						||
			_UMCommonSetAppkeyAndChannel(appkey, channelId);
 | 
						||
 | 
						||
#elif UNITY_ANDROID
 | 
						||
           
 | 
						||
		    UMConfigure.CallStatic("setWraperType","Unity",Version);
 | 
						||
		    UMConfigure.CallStatic("init",Context,appkey,channelId,(int)deviceType,pushSecret);
 | 
						||
#endif
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 设置是否打印sdk的信息,默认不开启
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="value">设置为true,Umeng SDK 会输出日志信息,记得release产品时要设置回false.</param>
 | 
						||
        /// 
 | 
						||
        public static void SetLogEnabled(bool value)
 | 
						||
        {
 | 
						||
#if UNITY_EDITOR
 | 
						||
        //Debug.Log("SetLogEnabled");  
 | 
						||
#elif UNITY_IPHONE
 | 
						||
        _SetLogEnabled(value);
 | 
						||
#elif UNITY_ANDROID
 | 
						||
            
 | 
						||
 | 
						||
	        UMConfigure.CallStatic("setLogEnabled",value);
 | 
						||
#endif
 | 
						||
        }
 | 
						||
 | 
						||
        //使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID
 | 
						||
        //eventId、attributes中key和value都不能使用空格和特殊字符,且长度不能超过255个字符(否则将截取前255个字符)
 | 
						||
        //id, ts, du是保留字段,不能作为eventId及key的名称
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 基本事件
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="eventId">友盟后台设定的事件Id</param>
 | 
						||
        public static void Event(string eventId)
 | 
						||
        {
 | 
						||
#if UNITY_EDITOR
 | 
						||
        //Debug.Log("Event");  
 | 
						||
#elif UNITY_IPHONE
 | 
						||
        _Event(eventId);
 | 
						||
#elif UNITY_ANDROID
 | 
						||
            Agent.CallStatic("onEvent", Context, eventId);
 | 
						||
#endif
 | 
						||
        }
 | 
						||
        //不同的标签会分别进行统计,方便同一事件的不同标签的对比,为nil或空字符串时后台会生成和eventId同名的标签.
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 基本事件
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="eventId">友盟后台设定的事件Id</param>
 | 
						||
        /// <param name="label">分类标签</param>
 | 
						||
 | 
						||
        public static void Event(string eventId, string label)
 | 
						||
        {
 | 
						||
#if UNITY_EDITOR 
 | 
						||
        //Debug.Log("Event");  
 | 
						||
#elif UNITY_IPHONE
 | 
						||
        _EventWithLabel(eventId, label);
 | 
						||
#elif UNITY_ANDROID
 | 
						||
            Agent.CallStatic("onEvent", Context, eventId, label);
 | 
						||
#endif
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 属性事件
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="eventId">友盟后台设定的事件Id</param>
 | 
						||
        /// <param name="attributes"> 属性中的Key-Vaule Pair不能超过10个</param>
 | 
						||
        public static void Event(string eventId, Dictionary<string, string> attributes)
 | 
						||
        {
 | 
						||
#if UNITY_EDITOR
 | 
						||
        	//Debug.Log("Event");        
 | 
						||
#elif UNITY_IPHONE
 | 
						||
			_EventWithAttributes(eventId, DictionaryToJson(attributes));
 | 
						||
#elif UNITY_ANDROID
 | 
						||
            Agent.CallStatic("onEvent", Context, eventId, ToJavaHashMap(attributes));
 | 
						||
#endif
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
	    /// <summary>
 | 
						||
	    /// 页面时长统计,记录某个页面被打开多长时间
 | 
						||
	    /// </summary>
 | 
						||
	    /// <param name="pageName">被统计view名称</param>
 | 
						||
	    /// 
 | 
						||
        public static void PageBegin(string pageName)
 | 
						||
        {
 | 
						||
#if UNITY_EDITOR
 | 
						||
		    //Debug.Log("PageBegin");
 | 
						||
#elif UNITY_IPHONE
 | 
						||
            _BeginLogPageView(pageName);
 | 
						||
#elif UNITY_ANDROID
 | 
						||
            Agent.CallStatic("onPageStart", pageName);
 | 
						||
#endif
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 页面时长统计,记录某个页面被打开多长时间
 | 
						||
        /// 与PageBegin配对使用
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="pageName">被统计view名称</param>
 | 
						||
        /// 
 | 
						||
        public static void PageEnd(string pageName)
 | 
						||
        {
 | 
						||
#if UNITY_EDITOR
 | 
						||
		    //Debug.Log("PageEnd"); 
 | 
						||
#elif UNITY_IPHONE
 | 
						||
            _EndLogPageView(pageName);
 | 
						||
#elif UNITY_ANDROID
 | 
						||
            Agent.CallStatic("onPageEnd", pageName);
 | 
						||
#endif
 | 
						||
        }
 | 
						||
 | 
						||
		/// <summary>
 | 
						||
		/// 自定义事件 — 计算事件数
 | 
						||
		/// </summary>
 | 
						||
		public static void Event(string eventId, Dictionary<string, string> attributes, int value)
 | 
						||
		{
 | 
						||
			try
 | 
						||
			{
 | 
						||
				if (attributes == null)
 | 
						||
					attributes = new System.Collections.Generic.Dictionary<string, string>();
 | 
						||
				if (attributes.ContainsKey("__ct__"))
 | 
						||
				{
 | 
						||
					attributes["__ct__"] = value.ToString();
 | 
						||
					Event(eventId, attributes);
 | 
						||
				}
 | 
						||
				else
 | 
						||
				{
 | 
						||
					attributes.Add("__ct__", value.ToString());
 | 
						||
					Event(eventId, attributes);
 | 
						||
					attributes.Remove("__ct__");
 | 
						||
				}
 | 
						||
 | 
						||
			}
 | 
						||
			catch (Exception)
 | 
						||
			{
 | 
						||
			}
 | 
						||
		}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
		public static string GetTestDeviceInfo()
 | 
						||
		{
 | 
						||
#if UNITY_EDITOR
 | 
						||
			//Unity Editor 模式下 返回null 请在iOS/Anroid真机上测试
 | 
						||
			//Debug.Log("GetDeviceInfo return null");
 | 
						||
			return null;
 | 
						||
#elif UNITY_IPHONE
 | 
						||
			return _GetDeviceID();
 | 
						||
#elif UNITY_ANDROID
 | 
						||
 | 
						||
            Debug.Log("GetDeviceInfo return ");
 | 
						||
            return UMConfigure.CallStatic<String[]>("getTestDeviceInfo", Context)[0]; 
 | 
						||
 | 
						||
#else
 | 
						||
			return null;
 | 
						||
 | 
						||
#endif
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
		//设置是否对日志信息进行加密, 默认false(不加密).
 | 
						||
		//value 设置为true, SDK会将日志信息做加密处理
 | 
						||
		
 | 
						||
		public static void  SetLogEncryptEnabled(bool value)
 | 
						||
		{
 | 
						||
			#if UNITY_EDITOR
 | 
						||
			//Debug.Log("SetLogEncryptEnabled");
 | 
						||
			#elif UNITY_IPHONE
 | 
						||
			_SetEncryptEnabled(value);
 | 
						||
			#elif UNITY_ANDROID
 | 
						||
			UMConfigure.CallStatic("setEncryptEnabled",value);
 | 
						||
			#endif
 | 
						||
 | 
						||
 | 
						||
		}
 | 
						||
		
 | 
						||
		
 | 
						||
		public static void SetLatency(int value)
 | 
						||
		{
 | 
						||
			#if UNITY_EDITOR
 | 
						||
			//Debug.Log("SetLatency");
 | 
						||
			#elif UNITY_IPHONE
 | 
						||
			//_SetLatency(value);
 | 
						||
			#elif UNITY_ANDROID
 | 
						||
			Agent.CallStatic("setLatencyWindow", (long)value);
 | 
						||
			#endif
 | 
						||
 | 
						||
		}
 | 
						||
		
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        //Android Only
 | 
						||
 | 
						||
#if  UNITY_ANDROID
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        //设置Session时长
 | 
						||
        public static void SetContinueSessionMillis(long milliseconds)
 | 
						||
        {
 | 
						||
#if UNITY_EDITOR
 | 
						||
            //Debug.Log("setContinueSessionMillis"); 
 | 
						||
#else
 | 
						||
            Agent.CallStatic("setSessionContinueMillis", milliseconds);
 | 
						||
#endif
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
		/*
 | 
						||
			android6.0中采集mac方式变更,新增接口 public static void setCheckDevice(boolean enable) 该接口默认参数是true,即采集mac地址,
 | 
						||
			但如果开发者需要在googleplay发布,考虑到审核风险,可以调用该接口,参数设置为 false 就不会采集mac地址。
 | 
						||
 | 
						||
		*/
 | 
						||
		public static void SetCheckDevice(bool value)
 | 
						||
		{
 | 
						||
#if UNITY_EDITOR
 | 
						||
		
 | 
						||
#else
 | 
						||
			Agent.CallStatic("setCheckDevice", value);
 | 
						||
#endif
 | 
						||
 | 
						||
		}
 | 
						||
		
 | 
						||
 | 
						||
 | 
						||
 | 
						||
		
 | 
						||
		
 | 
						||
 | 
						||
		
 | 
						||
 | 
						||
#endif
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        //iOS Only
 | 
						||
#if UNITY_IPHONE
 | 
						||
 | 
						||
 | 
						||
 | 
						||
    /// <summary>
 | 
						||
    /// 页面时长统计,记录某个view被打开多长时间,与调用PageBegin,PageEnd计时等价
 | 
						||
    /// </summary>
 | 
						||
    /// <param name="pageName">被统计view名称</param>
 | 
						||
    /// <param name="seconds">时长单位为秒</param>
 | 
						||
    /// 
 | 
						||
    public static void LogPageViewWithSeconds(string pageName, int seconds)
 | 
						||
    {
 | 
						||
#if UNITY_EDITOR
 | 
						||
        //Debug.Log("LogPageViewWithSeconds"); 
 | 
						||
#else
 | 
						||
        _LogPageViewWithSeconds(pageName, seconds);
 | 
						||
#endif
 | 
						||
    }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
    /// <summary>
 | 
						||
    /// 判断设备是否越狱,判断方法根据 apt和Cydia.app的path来判断
 | 
						||
    /// </summary>
 | 
						||
    /// <returns>是否越狱</returns>
 | 
						||
    public static bool IsJailBroken()
 | 
						||
    {
 | 
						||
#if UNITY_EDITOR
 | 
						||
        //always return false in UNITY_EDITOR mode
 | 
						||
        //Debug.Log("IsJailBroken always return false in UNITY_EDITOR mode");
 | 
						||
        return false;
 | 
						||
#else
 | 
						||
        return _IsJailBroken();
 | 
						||
#endif
 | 
						||
    }
 | 
						||
 | 
						||
    /// <summary>
 | 
						||
    /// 判断你的App是否被破解
 | 
						||
    /// </summary>
 | 
						||
    /// <returns>是否破解</returns>
 | 
						||
    public static bool IsPirated()
 | 
						||
    {
 | 
						||
#if UNITY_EDITOR
 | 
						||
        //always return false in UNITY_EDITOR mode
 | 
						||
        //Debug.Log("IsPirated always return false in UNITY_EDITOR mode");
 | 
						||
        return false;
 | 
						||
#else
 | 
						||
        return _IsPirated();
 | 
						||
#endif
 | 
						||
    }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
#endif
 | 
						||
 | 
						||
 | 
						||
 | 
						||
		
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        #region Wrapper
 | 
						||
 | 
						||
 | 
						||
	    private static void AddUmengAndroidLifeCycleCallBack()
 | 
						||
        {
 | 
						||
            GameObject go = new GameObject();
 | 
						||
            go.AddComponent<UmengAndroidLifeCycleCallBack>();
 | 
						||
            go.name = "UmengManager";
 | 
						||
        }
 | 
						||
 | 
						||
#if UNITY_ANDROID
 | 
						||
 | 
						||
        public static void onResume()
 | 
						||
        {
 | 
						||
#if UNITY_EDITOR
 | 
						||
 | 
						||
#else
 | 
						||
            Agent.CallStatic("onResume", Context);
 | 
						||
#endif
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        public  static void onPause()
 | 
						||
        {
 | 
						||
#if UNITY_EDITOR
 | 
						||
 | 
						||
#else
 | 
						||
            Agent.CallStatic("onPause", Context);
 | 
						||
#endif
 | 
						||
        }
 | 
						||
 | 
						||
	    public static void onKillProcess()
 | 
						||
	    {
 | 
						||
#if UNITY_EDITOR
 | 
						||
 | 
						||
#else
 | 
						||
		    Agent.CallStatic("onKillProcess", Context);
 | 
						||
 | 
						||
#endif
 | 
						||
	    }
 | 
						||
 | 
						||
	  
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
#endif
 | 
						||
 | 
						||
 | 
						||
#if UNITY_IPHONE && !UNITY_EDITOR
 | 
						||
 | 
						||
 | 
						||
 | 
						||
     
 | 
						||
 | 
						||
 | 
						||
        static string DictionaryToJson(Dictionary<string, string> dict)
 | 
						||
        {
 | 
						||
 | 
						||
            var builder = new StringBuilder("{");
 | 
						||
            foreach (KeyValuePair<string, string> kv in dict)
 | 
						||
            {
 | 
						||
                builder.AppendFormat("\"{0}\":\"{1}\",", kv.Key, kv.Value);
 | 
						||
            }
 | 
						||
            builder[builder.Length - 1] = '}';
 | 
						||
            return builder.ToString();
 | 
						||
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
	    [DllImport("__Internal")]
 | 
						||
	    private static extern void _SetWrapperTypeAndVersion(string wrapperType,string wrapperVersion);
 | 
						||
		    
 | 
						||
		[DllImport("__Internal")]
 | 
						||
		private static extern void _SetLogEnabled(bool value);
 | 
						||
	    
 | 
						||
	    [DllImport("__Internal")]
 | 
						||
	    private static extern void _SetScenarioType();
 | 
						||
	    
 | 
						||
	    [DllImport("__Internal")]
 | 
						||
	    private static extern void _UMCommonSetAppkeyAndChannel(string appkey, string channelId);
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
    [DllImport("__Internal")]
 | 
						||
    private static extern void _Event(string eventId);
 | 
						||
 | 
						||
 | 
						||
 | 
						||
    [DllImport("__Internal")]
 | 
						||
    private static extern void _EventWithLabel(string eventId, string label);
 | 
						||
 | 
						||
 | 
						||
 | 
						||
    [DllImport("__Internal")]
 | 
						||
    private static extern void _EventWithAttributes(string eventId, string jsonstring);
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
    [DllImport("__Internal")]
 | 
						||
    private static extern void _LogPageViewWithSeconds(string pageName, int seconds);
 | 
						||
 | 
						||
    [DllImport("__Internal")]
 | 
						||
    private static extern void _BeginLogPageView(string pageName);
 | 
						||
 | 
						||
    [DllImport("__Internal")]
 | 
						||
    private static extern void _EndLogPageView(string pageName);
 | 
						||
 | 
						||
    [DllImport("__Internal")]
 | 
						||
    private static extern bool _IsJailBroken();
 | 
						||
	
 | 
						||
    [DllImport("__Internal")]
 | 
						||
    private static extern bool _IsPirated();
 | 
						||
	
 | 
						||
 | 
						||
	[DllImport("__Internal")]
 | 
						||
	private static extern string _GetDeviceID();
 | 
						||
 | 
						||
 | 
						||
		
 | 
						||
	[DllImport("__Internal")]
 | 
						||
	private static extern  void _SetEncryptEnabled(bool value);
 | 
						||
		
 | 
						||
 | 
						||
 | 
						||
				
 | 
						||
#endif
 | 
						||
        #endregion
 | 
						||
    }
 | 
						||
}
 |