logo
0
0
WeChat Login
refactor(runtime)!: rename namespace to GameFrameX.SystemInfo.Runtime

GameFrameX Logo

BlankDeviceUniqueIdentifier

Version License Documentation

独立游戏前后端一体化解决方案 · 独立游戏开发者的圆梦大使

📖 文档🚀 快速开始


🌐 语言: English | 简体中文 | 繁體中文 | 日本語 | 한국어


轻量级 Unity3D 设备唯一标识符获取插件,支持 Android 和 iOS 平台。提供统一的 C# API 访问 OAID、IDFA、IMEI 和稳定的硬件指纹,Android 端零原生依赖。

核心特性

  • Android 纯 C# 实现 — 通过 AndroidJavaClass / AndroidJavaObject(JNI)直接调用系统 API 和厂商 SDK,无需 Java 代码、JAR 文件或 Gradle 配置。
  • 跨平台 — Android、iOS、Unity Editor 统一支持。不支持的平台 API 会自动降级为 SystemInfo.deviceUniqueIdentifier
  • 多厂商 OAID — 通过反射支持 MSA SDK、华为、小米、OPPO、vivo、三星等主流厂商的 OAID 获取。
  • iOS IDFA 与 SSKeychain — 通过 ASIdentifierManager 获取 IDFA 并支持 ATT 授权;设备 ID 持久化到 Keychain,应用重装后依然有效。
  • 零强制权限 — 无需任何权限即可运行。声明可选权限可提升标识符唯一性。
  • 内置缓存 — 所有 API 首次调用后通过 PlayerPrefs 缓存结果,避免重复查询系统接口。

功能

API说明返回值
DeviceGetOaid获取设备 OAID(Android 独有)OAID 原始值(去 -,最长 32 位)
DeviceGetIdfa获取设备 IDFA(iOS 独有)IDFA 原始值(去 -,最长 32 位)
DeviceGetImei获取设备 IMEIIMEI 原始值(去 -,最长 32 位)
DeviceUniqueIdentifier获取设备唯一机器码MD5 哈希值(32 位十六进制字符串)

所有 API 均通过 PlayerPrefs 缓存结果,首次获取后不再重复调用系统接口。

平台实现

平台DeviceGetOaidDeviceGetIdfaDeviceGetImeiDeviceUniqueIdentifier
AndroidJNI 反射获取(MSA / 华为 / 小米 / OPPO / vivo / 三星)SystemInfo.deviceUniqueIdentifier(降级)JNI 调用 TelephonyManagerIMEI + 硬件信息 + Android ID + WLAN MAC + BT MAC 的 MD5
iOSSystemInfo.deviceUniqueIdentifier(降级)ASIdentifierManager.advertisingIdentifiernative __DeviceGetIMEI() (IDFV)native DeviceUniqueId() (SSKeychain)
Editor / 其他SystemInfo.deviceUniqueIdentifierSystemInfo.deviceUniqueIdentifierSystemInfo.deviceUniqueIdentifierSystemInfo.deviceUniqueIdentifier

权限(可选)

本插件不强制要求任何权限,无权限时降级运行不会崩溃。插件不自带 AndroidManifest.xml,以下权限需由使用方项目在自己的 AndroidManifest.xml 中按需声明。

Android

权限提升 DeviceUniqueIdentifier 唯一性提升 DeviceGetImei 唯一性
READ_PHONE_STATEIMEI 参与哈希计算可获取真实 IMEI
ACCESS_WIFI_STATEWLAN MAC 参与哈希计算-
BLUETOOTH蓝牙 MAC 参与哈希计算-
<!-- 在使用方项目的 AndroidManifest.xml 中按需添加 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />

iOS

配置用途
NSUserTrackingUsageDescriptionIDFA 需要的 ATT 授权描述
<!-- 在使用方项目的 Info.plist 中添加 -->
<key>NSUserTrackingUsageDescription</key>
<string>您的广告标识符将用于提供更好的服务</string>

使用示例

using GameFrameX.SystemInfo.Runtime;

// 获取设备 OAID(Android 独有,iOS/Editor 降级为 SystemInfo.deviceUniqueIdentifier)
string oaid = BlankDeviceUniqueIdentifier.DeviceGetOaid;

// 获取设备 IDFA(iOS 独有,Android/Editor 降级为 SystemInfo.deviceUniqueIdentifier)
string idfa = BlankDeviceUniqueIdentifier.DeviceGetIdfa;

// 获取设备 IMEI
string imei = BlankDeviceUniqueIdentifier.DeviceGetImei;

// 获取设备唯一标识符
string deviceId = BlankDeviceUniqueIdentifier.DeviceUniqueIdentifier;

iOS IDFA 注意事项

IDFA 需要用户授权 ATT(App Tracking Transparency)。使用前需在 Info.plist 中添加:

<key>NSUserTrackingUsageDescription</key>
<string>您的广告标识符将用于提供更好的服务</string>

并在调用 DeviceGetIdfa 前请求授权:

#if UNITY_IOS || UNITY_IPHONE
// iOS 14+ 需要先请求 ATT 授权
if (UnityEngine.iOS.Device.systemVersion.CompareTo("14") >= 0)
{
    UnityEngine.iOS.Device.RequestUserAuthorization(UnityEngine.iOS.UserTracking.Authorization);
}
#endif
string idfa = BlankDeviceUniqueIdentifier.DeviceGetIdfa;

未授权时 DeviceGetIdfa 返回空串,不会崩溃。

目录结构

Plugins/
  iOS/
    BlankDeviceUniqueIdentifier/
      AHDeviceUniqueIdentifier.h               # iOS native 头文件
      AHDeviceUniqueIdentifier.mm              # iOS native 实现
      SSKeychain.h                              # SSKeychain 钥匙串工具
      SSKeychain.m
Runtime/
  BlankDeviceUniqueIdentifier.cs               # C# 统一接口(Android 通过 JNI 直接调用系统 API,无需 Java/JAR)

Android 端通过 AndroidJavaClass / AndroidJavaObject 直接调用系统 API 和厂商 SDK,无需编译和引入任何 Java 代码或 JAR 文件。

开源协议

本项目基于 Apache License 2.0 开源。

Copyright 2023 ALianBlank (alianblank@outlook.com)

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.