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