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

229 lines
7.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using UnityEngine;
public class DeviceIdHandle
{
public class DeviceIdInfo
{
public string adjust_adid;
public string oaid;
public string imei;
public string caid;
public string idfa;
public string idfv;
public string android_id;
public string channel;
public string package_name;
public int platform;
public string identity_key;
public string caid_device_info_str;
public DeviceIdInfo()
{
adjust_adid = "";
oaid = DeviceIdHandle.Instance.Oaid;
imei = DeviceIdHandle.Instance.Imei;
caid = "";
idfa = Instance.IDFA;
idfv = Instance.IDFV;
android_id = DeviceIdHandle.Instance.AndroidID;
channel = "";
package_name = Application.identifier;
#if UNITY_IOS && !UNITY_EDITOR
platform = 1;
#else
platform = 0;
#endif
identity_key = SystemInfo.deviceUniqueIdentifier;
}
}
private static DeviceIdHandle _instance;
private string oaid = "";
private string imei = "";
private string androidID = "";
public string Oaid => oaid;
public string Imei => imei;
public string AndroidID => androidID;
/// <summary>
/// iOS 获取用户标识
/// </summary>
public string IDFA;
/// <summary>
/// iOS 获取厂商标识
/// </summary>
public string IDFV;
public string CAID => PlayerPrefs.GetString("Player_CAID", string.Empty);
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)");
DeviceIdHandle.Instance.oaid = oaid;
}
else
{
Debug.LogError($"OAID 获取失败: {msg}");
}
}
}
class IMEICallbackProxy : AndroidJavaProxy
{
public IMEICallbackProxy() : base("com.example.oaidtest2.DemoHelper$ImeiCallback") { }
void onResult(string imei)
{
DeviceIdHandle.Instance.imei = imei;
}
}
class AndroidIDCallbackProxy : AndroidJavaProxy
{
public AndroidIDCallbackProxy() : base("com.example.oaidtest2.DemoHelper$AndroidIdCallback") { }
void onResult(string androidID)
{
DeviceIdHandle.Instance.androidID = androidID;
Debug.Log($"Android ID: {androidID}");
}
}
public static DeviceIdHandle Instance
{
get
{
if (_instance is null)
{
_instance = new DeviceIdHandle();
}
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;
}
}
public AndroidJavaClass bridgeClass;
public void Initialize()
{
#if UNITY_ANDROID && !UNITY_EDITOR
// Dev / QA_Dev 渠道不集成 DeviceHelper AAR,且服务端不消费相关字段,跳过调用
if (IsDeviceHelperSkippedChannel())
{
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");
var helperClass = new AndroidJavaClass("com.example.oaidtest2.DemoHelper");
var helper = helperClass.CallStatic<AndroidJavaObject>("getInstance", appContext);
helper.Call("getOAID", new OaidCallbackProxy());
// 调用 Android 的 GetIMEI 方法
helper.Call("getImei", new IMEICallbackProxy());
// 调用 Android 的 GetAndroidID 方法
helper.Call("getAndroidId", new AndroidIDCallbackProxy());
}
catch (System.Exception e)
{
Debug.LogError("GetDeviceId failed: " + e);
}
}
#else
Debug.Log("GetDeviceID: Initialized (editor or non-Android). Android call skipped.");
#endif
#if SDK_BYTEDANCE
try
{
bridgeClass = new AndroidJavaClass("com.bytedance.convertunitybridge.ConvertUnityBridge");
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
}
/// <summary>
/// 获取 CAID 设备信息 JSON(iOS 侧采集,返回所有参数的 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
}