NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/HotUpdate/Device/DeviceIdHandle.cs

229 lines
7.2 KiB
C#
Raw Normal View History

2025-11-18 19:41:00 +08:00
using System;
using System.Collections;
2025-11-03 15:37:16 +08:00
using System.Collections.Generic;
2025-11-17 12:40:48 +08:00
using System.Runtime.ConstrainedExecution;
2026-05-20 16:36:30 +08:00
using System.Runtime.InteropServices;
2025-11-03 15:37:16 +08:00
using UnityEngine;
2025-11-17 13:04:57 +08:00
public class DeviceIdHandle
2025-11-03 15:37:16 +08:00
{
2025-11-18 16:43:21 +08:00
public class DeviceIdInfo
{
public string adjust_adid;
public string oaid;
public string imei;
public string caid;
public string idfa;
public string idfv;
2025-11-26 12:16:57 +08:00
public string android_id;
2025-11-18 16:43:21 +08:00
public string channel;
2026-03-19 12:18:58 +08:00
public string package_name;
2026-04-16 18:58:40 +08:00
public int platform;
2026-05-20 16:36:30 +08:00
public string identity_key;
public string caid_device_info_str;
2025-11-18 16:43:21 +08:00
public DeviceIdInfo()
{
adjust_adid = "";
oaid = DeviceIdHandle.Instance.Oaid;
imei = DeviceIdHandle.Instance.Imei;
caid = "";
2026-04-01 19:52:44 +08:00
idfa = Instance.IDFA;
idfv = Instance.IDFV;
2025-11-26 12:16:57 +08:00
android_id = DeviceIdHandle.Instance.AndroidID;
2025-11-18 16:43:21 +08:00
channel = "";
2026-03-19 12:18:58 +08:00
package_name = Application.identifier;
2026-04-16 18:58:40 +08:00
#if UNITY_IOS && !UNITY_EDITOR
platform = 1;
#else
platform = 0;
#endif
2026-05-20 16:36:30 +08:00
identity_key = SystemInfo.deviceUniqueIdentifier;
2025-11-18 16:43:21 +08:00
}
}
2025-11-03 15:37:16 +08:00
private static DeviceIdHandle _instance;
2025-11-17 12:40:48 +08:00
private string oaid = "";
private string imei = "";
2025-11-26 12:09:05 +08:00
private string androidID = "";
2025-11-17 12:40:48 +08:00
public string Oaid => oaid;
public string Imei => imei;
2025-11-26 12:09:05 +08:00
public string AndroidID => androidID;
2025-11-17 12:40:48 +08:00
2026-04-01 19:52:44 +08:00
/// <summary>
/// iOS 获取用户标识
/// </summary>
public string IDFA;
/// <summary>
/// iOS 获取厂商标识
/// </summary>
public string IDFV;
public string CAID => PlayerPrefs.GetString("Player_CAID", string.Empty);
2025-11-14 20:03:39 +08:00
class OaidCallbackProxy : AndroidJavaProxy
{
public OaidCallbackProxy() : base("com.example.oaidtest2.DemoHelper$OaidCallback") { }
void onResult(int code, string msg, string oaid, long durationMs)
{
if (code == 0)
{
Debug.Log($"OAID: {oaid} (耗时: {durationMs}ms)");
2025-11-17 12:40:48 +08:00
DeviceIdHandle.Instance.oaid = oaid;
2025-11-14 20:03:39 +08:00
}
else
{
Debug.LogError($"OAID 获取失败: {msg}");
}
}
}
2025-11-17 12:40:48 +08:00
class IMEICallbackProxy : AndroidJavaProxy
{
public IMEICallbackProxy() : base("com.example.oaidtest2.DemoHelper$ImeiCallback") { }
void onResult(string imei)
{
DeviceIdHandle.Instance.imei = imei;
}
}
2025-11-26 12:09:05 +08:00
class AndroidIDCallbackProxy : AndroidJavaProxy
{
public AndroidIDCallbackProxy() : base("com.example.oaidtest2.DemoHelper$AndroidIdCallback") { }
void onResult(string androidID)
{
DeviceIdHandle.Instance.androidID = androidID;
Debug.Log($"Android ID: {androidID}");
}
}
2025-11-03 15:37:16 +08:00
public static DeviceIdHandle Instance
{
get
{
if (_instance is null)
{
2025-11-17 13:04:57 +08:00
_instance = new DeviceIdHandle();
2025-11-03 15:37:16 +08:00
}
return _instance;
}
}
/// <summary>
/// 判断当前渠道是否不需要通过 DeviceHelper 获取设备 ID
/// Dev / QA_Dev 渠道服务端不消费 oaid/imei/android_id且包内未集成 DeviceHelper AAR跳过调用
/// </summary>
private static bool IsDeviceHelperSkippedChannel()
{
// 通过反射访问 AOT 的 PackDataInst避免直接引用 AOT 命名空间导致编译错误
try
{
var type = System.Type.GetType("PhxhSDK.AOT.VersionUpdate.PackDataInst, PhxhSDK");
if (type == null) return false;
var instProp = type.GetProperty("Inst", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
if (instProp == null) return false;
var inst = instProp.GetValue(null);
if (inst == null) return false;
var localInfoProp = inst.GetType().GetProperty("localInfo");
if (localInfoProp == null) return false;
var localInfo = localInfoProp.GetValue(inst);
if (localInfo == null) return false;
var wsProp = localInfo.GetType().GetField("workSpace");
if (wsProp == null) return false;
var ws = wsProp.GetValue(localInfo) as string ?? "";
return ws == "Dev" || ws == "QA_Dev";
}
catch
{
return false;
}
}
2026-03-26 18:14:59 +08:00
public AndroidJavaClass bridgeClass;
2025-11-17 12:40:48 +08:00
public void Initialize()
2025-11-12 19:29:37 +08:00
{
2026-04-01 19:52:44 +08:00
2025-11-12 19:29:37 +08:00
#if UNITY_ANDROID && !UNITY_EDITOR
// Dev / QA_Dev 渠道不集成 DeviceHelper AAR且服务端不消费相关字段跳过调用
if (IsDeviceHelperSkippedChannel())
2025-11-12 19:29:37 +08:00
{
Debug.Log("[DeviceIdHandle] 当前渠道不需要 DeviceHelper跳过 OAID/IMEI/AndroidID 获取。");
}
else
{
//获取当前 Android Activity 并调用插件初始化接口
try
{
var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
var appContext = activity.Call<AndroidJavaObject>("getApplicationContext");
2025-11-17 12:40:48 +08:00
var helperClass = new AndroidJavaClass("com.example.oaidtest2.DemoHelper");
var helper = helperClass.CallStatic<AndroidJavaObject>("getInstance", appContext);
2025-11-12 19:29:37 +08:00
helper.Call("getOAID", new OaidCallbackProxy());
2025-11-12 19:29:37 +08:00
// 调用 Android 的 GetIMEI 方法
helper.Call("getImei", new IMEICallbackProxy());
2025-11-26 12:09:05 +08:00
// 调用 Android 的 GetAndroidID 方法
helper.Call("getAndroidId", new AndroidIDCallbackProxy());
}
catch (System.Exception e)
{
Debug.LogError("GetDeviceId failed: " + e);
}
2025-11-12 19:29:37 +08:00
}
#else
2025-11-17 12:40:48 +08:00
Debug.Log("GetDeviceID: Initialized (editor or non-Android). Android call skipped.");
2025-11-12 19:29:37 +08:00
#endif
2025-11-18 19:41:00 +08:00
#if SDK_BYTEDANCE
try
{
2026-03-26 18:14:59 +08:00
bridgeClass = new AndroidJavaClass("com.bytedance.convertunitybridge.ConvertUnityBridge");
2025-11-18 19:41:00 +08:00
var up = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
var activity = up.GetStatic<AndroidJavaObject>("currentActivity");
if (activity == null) return;
bridgeClass.CallStatic("init", activity, true);
}
catch (Exception e)
{
Debug.LogError("BYTEDANCE SDK init Error! " + e);
}
#endif
2025-11-03 15:37:16 +08:00
}
2026-05-20 16:36:30 +08:00
/// <summary>
/// 获取 CAID 设备信息 JSONiOS 侧采集,返回所有参数的 JSON 字符串)
/// </summary>
public string GetCAIDDeviceInfoJSON()
{
#if UNITY_IOS && !UNITY_EDITOR
IntPtr ptr = GetCAIDDeviceInfoJSONNative();
if (ptr == IntPtr.Zero)
return string.Empty;
string result = Marshal.PtrToStringAuto(ptr);
Marshal.FreeCoTaskMem(ptr);
return result ?? string.Empty;
#else
// 非 iOS 平台返回空 JSON可用于编辑器调试
return string.Empty;
#endif
}
#if UNITY_IOS && !UNITY_EDITOR
[DllImport("__Internal", EntryPoint = "GetCAIDDeviceInfoJSON")]
private static extern IntPtr GetCAIDDeviceInfoJSONNative();
#endif
2025-11-03 15:37:16 +08:00
}