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  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 | |||
|  |     } | |||
|  | } |