/**
* Unity Plugins Version 2.2.10
*
* android version 2.2.9
* iOS version 2.7.3
* window version 1.0.0
*/
using System.Text;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
#if UNITY_ANDROID || UNITY_IPHONE || UNITY_IOS
using com.xsj.Crasheye.U3D;
#endif
#if UNITY_ANDROID
using com.xsj.Crasheye.U3D.Android;
#endif
#if UNITY_IPHONE || UNITY_IOS
using com.xsj.Crasheye.U3D.IOS;
#endif
public class Crasheye : MonoBehaviour
{
public delegate void FnOnCrashCallback(bool bCaptureSucceed, string cpszCrashReportFile);
public string YourAppKeyForAndroid = "YourAppKeyForAndroid";
public string YourChannelIdForAndroid = "YourChannelIdForAndroid";
public string YourAppKeyForIOS = "YourAppKeyForIOS";
public string YourChannelIdForIOS = "YourChannelIdForIOS";
public string YourAppKeyForPC = "YourAppKeyForPC";
public string YourChannelIdForPC = "YourChannelIdForPC";
#if UNITY_ANDROID || UNITY_IPHONE || UNITY_IOS
public static CrasheyeLib crasheyeLib = null;
#endif
#if UNITY_ANDROID || UNITY_IPHONE || UNITY_IOS || UNITY_STANDALONE_WIN
private static string YourChannelId = "NA";
#endif
public static void AddCustomLog(string collectFile)
{
#if UNITY_STANDALONE_WIN && !UNITY_EDITOR
DumpForPC.AddCustomLog(collectFile);
#endif
}
public static void AddCustomLogDirectory(string CollectLogDirectory)
{
#if UNITY_STANDALONE_WIN && !UNITY_EDITOR
DumpForPC.AddCustomLogDirectory(CollectLogDirectory);
#endif
}
void Start()
{
DontDestroyOnLoad(gameObject);
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
SetChannelID(YourChannelIdForAndroid);
StartInitCrasheye(YourAppKeyForAndroid);
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
SetChannelID(YourChannelIdForIOS);
StartInitCrasheye(YourAppKeyForIOS);
#endif
}
else if (Application.platform == RuntimePlatform.WindowsPlayer)
{
#if UNITY_STANDALONE_WIN
SetChannelID(YourAppKeyForPC);
StartInitCrasheye(YourAppKeyForPC);
#endif
}
}
///
/// SetURL
///
///
public static void SetURL(string url)
{
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
CrasheyeForAndroid.SetURL(url);
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
CrasheyeForIOS.SetURL(url);
#endif
}
else if (Application.platform == RuntimePlatform.WindowsPlayer)
{
#if UNITY_STANDALONE_WIN
DumpForPC.SetURL(url);
#endif
}
}
///
/// 设置Dump是否强制上报(忽略玩家在DumpReport界面上的选择)
///
///
/// isForceUpload 是否设置Dump强制上报
public static void SetForceUpload(bool isForceUpload)
{
Debug.Log("SetForceUpload");
#if UNITY_STANDALONE_WIN
DumpForPC.SetForceUpload(isForceUpload);
#endif
}
///
/// 启动Crasheye
///
///
public static void StartInitCrasheye(string Your_AppKey)
{
RegisterLogCallback();
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
CrasheyeForAndroid.Init(Your_AppKey, YourChannelId);
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
CrasheyeForIOS.Init(Your_AppKey, YourChannelId);
#endif
}
else if (Application.platform == RuntimePlatform.WindowsPlayer)
{
#if UNITY_STANDALONE_WIN
DumpForPC.Init(Your_AppKey, YourChannelId);
#endif
}
//bool result = Crasheye.PushLogTrace("Crasheye Demo Push Log");
//Debug.Log("PushLogTrace:" + result);
}
///
/// 注册脚本捕获
///
public static void RegisterLogCallback()
{
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
crasheyeLib = new LibForAndroid();
CrasheyeForAndroid.setInternalExtraData();
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
crasheyeLib = new LibForiOS();
#endif
}
else if (Application.platform == RuntimePlatform.WindowsPlayer)
{
#if UNITY_STANDALONE_WIN
Debug.Log("RegisterLogCallback");
AppDomain.CurrentDomain.UnhandledException += DumpForPC.OnHandleUnresolvedException;
SetRegisterLogFunction(DumpForPC.OnHandleLogCallback);
Application.logMessageReceived += RegisterLogFunction;
#endif
}
#if UNITY_ANDROID || UNITY_IPHONE || UNITY_IOS
if (crasheyeLib == null)
{
return;
}
System.AppDomain.CurrentDomain.UnhandledException += new System.UnhandledExceptionEventHandler(crasheyeLib.OnHandleUnresolvedException);
SetRegisterLogFunction(crasheyeLib.OnHandleLogCallback);
#if UNITY_5
Application.logMessageReceived += RegisterLogFunction;
#else
Application.RegisterLogCallback(RegisterLogFunction);
#endif
#endif
}
private static void RegisterLogFunction(string logString, string stackTrace, LogType type)
{
#if (UNITY_IPHONE || UNITY_IOS) && !UNITY_EDITOR
if (Application.platform == RuntimePlatform.IPhonePlayer)
{
CrasheyeForIOS.SaveLogger(logString);
}
if (CrasheyeForIOS.GetLoggingLines() > 0 &&
Application.platform == RuntimePlatform.IPhonePlayer &&
(type == LogType.Assert || type == LogType.Exception)
)
{
CrasheyeForIOS.addLog(CrasheyeForIOS.GetLogger());
}
#endif
if (m_RegisterLog != null)
{
m_RegisterLog(logString, stackTrace, type);
}
#if (UNITY_IPHONE || UNITY_IOS) && !UNITY_EDITOR
if (CrasheyeForIOS.GetLoggingLines() > 0 &&
Application.platform == RuntimePlatform.IPhonePlayer &&
(type == LogType.Assert || type == LogType.Exception)
)
{
CrasheyeForIOS.removeLog();
}
#endif
}
public delegate void RegisterLog(string logString, string stackTrace, LogType type);
private static RegisterLog m_RegisterLog = null;
///
/// 设置用户的脚本回调的函数
///
///
public static void SetRegisterLogFunction(RegisterLog registerLogCBFun)
{
Debug.Log("SetRegisterLogFunction");
m_RegisterLog += registerLogCBFun;
}
///
/// 发送脚本异常
///
/// Excepiton Info
public static void SendScriptException(Exception ex)
{
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
crasheyeLib.LibSendScriptException(ex.Message, ex.StackTrace);
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
crasheyeLib.LibSendScriptException(ex.Message, ex.StackTrace);
#endif
}
}
///
/// 上报脚本异常
///
/// 错误的标题
/// 错误堆栈信息
/// 语言
public static void SendScriptException(string errorTitle, string stacktrace, string language)
{
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
crasheyeLib.LibSendScriptException(errorTitle, stacktrace, language);
#endif
}
else if(Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
crasheyeLib.LibSendScriptException(errorTitle, stacktrace);
#endif
} else if (Application.platform == RuntimePlatform.WindowsPlayer)
{
#if UNITY_STANDALONE_WIN
DumpForPC.SendScriptException(errorTitle, stacktrace, language);
#endif
}
}
///
/// 设置渠道号
///
///
public static void SetChannelID(string yourChannelID)
{
if (String.IsNullOrEmpty(yourChannelID))
{
Debug.LogError("set channel id value is null or empty!");
return;
}
if (yourChannelID.Equals("YourChannelIdForAndroid") || yourChannelID.Equals("YourChannelIdForIOS"))
{
return;
}
#if UNITY_ANDROID || UNITY_IPHONE || UNITY_IOS || UNITY_STANDALONE_WIN
YourChannelId = yourChannelID;
#endif
}
///
/// 设置是否只在wifi下上报报告文件
///
///
public static void SetFlushOnlyOverWiFi(bool enabled)
{
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
CrasheyeForAndroid.SetFlushOnlyOverWiFi(enabled);
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
CrasheyeForIOS.SetFlushOnlyOverWiFi(enabled);
#endif
}
}
///
/// 设置该版本是否为测试版本
///
/// 是否为测试版本
public static void SetIsBetaVersion(bool isBeta)
{
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
CrasheyeForAndroid.SetIsBetaVersion(isBeta);
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
CrasheyeForIOS.SetBeta(isBeta);
#endif
}
else if (Application.platform == RuntimePlatform.WindowsPlayer)
{
#if UNITY_STANDALONE_WIN && !UNITY_EDITOR
DumpForPC.SetBeta();
#endif
}
}
///
/// 设置版本号信息
///
/// App版本号
public static void SetAppVersion(string yourAppVersion)
{
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
CrasheyeForAndroid.SetAppVersion(yourAppVersion);
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
CrasheyeForIOS.SetAppVersion(yourAppVersion);
#endif
}
else if (Application.platform == RuntimePlatform.WindowsPlayer)
{
#if UNITY_STANDALONE_WIN
DumpForPC.SetAppVersion(yourAppVersion);
#endif
}
}
///
/// 设置用户信息
///
/// 用户标识
public static void SetUserIdentifier(string userIdentifier)
{
if(string.IsNullOrEmpty(userIdentifier))
{
return;
}
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
CrasheyeForAndroid.SetUserIdentifier(userIdentifier);
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
CrasheyeForIOS.SetUserIdentifier(userIdentifier);
#endif
}
else if (Application.platform == RuntimePlatform.WindowsPlayer)
{
#if UNITY_STANDALONE_WIN
DumpForPC.SetUserIdentifier_UTF8(userIdentifier);
#endif
}
}
///
/// 如果启动了C#堆栈回溯可能会导致某些机型出现宕机
///
public static void EnableCSharpStackTrace()
{
#if UNITY_ANDROID
CrasheyeForAndroid.EnableCSharpStackTrace();
#endif
}
///
/// 添加自定义数据
///
/// Key.
/// Value.
public static void AddExtraData(string key, string value)
{
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
CrasheyeForAndroid.AddExtraData(key, value);
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
CrasheyeForIOS.AddExtraData(key, value);
#endif
}
else if (Application.platform == RuntimePlatform.WindowsPlayer)
{
#if UNITY_STANDALONE_WIN
DumpForPC.AddExtraData(key,value);
#endif
}
}
public static void AddExtraDataUTF8(string key, string value)
{
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
CrasheyeForAndroid.AddExtraData(key, value);
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
CrasheyeForIOS.AddExtraData(key, value);
#endif
}
else if (Application.platform == RuntimePlatform.WindowsPlayer)
{
#if UNITY_STANDALONE_WIN
DumpForPC.AddExtraDataUTF8(key, value);
#endif
}
}
///
/// 获取自定义数据
///
/// Key
///
public static string GetExtraData(string key)
{
string extraData = "";
if (string.IsNullOrEmpty(key))
{
return extraData;
}
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
extraData = CrasheyeForAndroid.GetExtraData(key);
#endif
}
else
{
#if UNITY_IPHONE || UNITY_IOS
extraData = CrasheyeForIOS.GetExtraData(key);
#endif
}
return extraData;
}
///
/// 移除自定义值
///
/// Key
public static void RemoveExtraData(string key)
{
if (string.IsNullOrEmpty(key))
{
return;
}
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
CrasheyeForAndroid.RemoveExtraData(key);
#endif
}
else if(Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
CrasheyeForIOS.RemoveExtraData(key);
#endif
}
}
///
/// 清除自定义数据
///
public static void CleanExtraData()
{
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
CrasheyeForAndroid.CleanExtraData();
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
CrasheyeForIOS.ClearExtraData();
#endif
}
}
///
/// 设置打点数据接口
///
/// Breadcrumb.
public static void SetBreadCrumbType(Int32 type)
{
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
// TODO
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
// TODO
#endif
}
else if (Application.platform == RuntimePlatform.WindowsPlayer)
{
#if UNITY_STANDALONE_WIN
DumpForPC.SetBreadCrumbType(type);
#endif
}
}
///
/// 打点数据
///
/// Breadcrumb.
public static void LeaveBreadcrumb(string breadcrumb)
{
if (string.IsNullOrEmpty(breadcrumb))
{
return;
}
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
CrasheyeForAndroid.LeaveBreadcrumb(breadcrumb);
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
CrasheyeForIOS.LeaveBreadcrumb(breadcrumb);
#endif
} else if (Application.platform == RuntimePlatform.WindowsPlayer)
{
#if UNITY_STANDALONE_WIN
DumpForPC.leaveBreadcrumb(breadcrumb);
#endif
}
}
///
/// 指定获取应用程序log日志的行数
///
/// 需要获取log行数
public static void SetLogging(int lines)
{
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
CrasheyeForAndroid.SetLogging(lines);
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
CrasheyeForIOS.SetLogging(lines);
#endif
}
}
///
/// 获取应用程序log日志关键字过滤
///
/// 需要过滤关键字
public static void SetLogging(string filter)
{
if (string.IsNullOrEmpty(filter))
{
return;
}
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
CrasheyeForAndroid.SetLogging(filter);
#endif
}
}
///
/// 获取应用程序log日志(过滤条件:关键字过滤+行数)
///
/// 需要获取的行数
/// 需要过滤的关键字
public static void SetLogging(int lines, string filter)
{
if (string.IsNullOrEmpty(filter))
{
return;
}
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
CrasheyeForAndroid.SetLogging(lines, filter);
#endif
}
else if(Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
CrasheyeForIOS.SetLogging(lines, filter);
#endif
}
}
///
/// 获取sdk版本号
///
///
public static string GetAppVersion()
{
if (Application.platform == RuntimePlatform.Android)
{
#if UNITY_ANDROID
return CrasheyeForAndroid.GetAppVersion();
#endif
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IPHONE || UNITY_IOS
return CrasheyeForIOS.GetAppVersion();
#endif
}
return "NA";
}
public static bool SetBackgroundUpload(bool isBackgroundUpload)
{
#if UNITY_STANDALONE_WIN
return DumpForPC.SetBackgroundUpload(isBackgroundUpload);
#endif
return false;
}
public static bool SetCrashCallback(FnOnCrashCallback pCallback)
{
#if UNITY_STANDALONE_WIN
return DumpForPC.SetOnMiniDumpCreateCallBack((bCaptureSucceed, cpszCrashReportFile)=>{
string szCrashReportFile = Marshal.PtrToStringUni(cpszCrashReportFile);
pCallback?.Invoke(bCaptureSucceed, szCrashReportFile);
});
#endif
return false;
}
public static bool PushLogTrace(string cpszMessage)
{
#if UNITY_STANDALONE_WIN
return DumpForPC.PushLogTrace(cpszMessage);
#endif
return false;
}
}