概览
许多应用需要识别设备:将试用或许可绑定到设备、限制每个账户的设备数量,或在用户重新安装应用后再次找到该设备。KlugDeviceId 直接从操作系统读取稳定的标识符。
在 Android 上,卸载并重新安装应用后标识符保持不变,因此是不受重新安装影响的锚点。在 iOS 上,当同一开发者的所有应用都被移除时,系统标识符会被重置;若要在 iOS 和 macOS 上获得不受重新安装影响的锚点,请使用 KlugKeychain。
KlugDeviceId 每天都在我们的应用中使用,这就是我们的概念验证。
特性
- 自成一体:一个 ANE,无需添加核心库或依赖 ANE
- 一次调用即可在 Android 和 iOS 上返回设备标识符
- Android 8.0 及更高版本:只要使用相同的密钥签名,卸载并重新安装应用后保持不变
- 无需权限
- 在没有可用标识符时返回空字符串,绝不报错
支持的平台
Android arm64 · armv7
iOS arm64
在其他平台上,isSupported 返回 false,因此同一份代码可以保留在跨平台应用中。
入门
将扩展添加到您的应用描述文件中:
<extensions>
<extensionID>com.klug.deviceid</extensionID>
</extensions>
代码示例
三个完整流程。这些 getter 立即返回,无需权限,也绝不抛出异常:在没有可用标识符时它们返回空字符串。完整文档 →
1 · 读取一次并随登录一同发送
import com.klug.deviceid.DeviceId; import flash.events.Event; import flash.net.*; // read once at start and keep it: ANDROID_ID on Android, identifierForVendor on iOS var deviceId:String = DeviceId.getInstance().uniqueId; function login( user:String, password:String ):void { var vars:URLVariables = new URLVariables(); vars.user = user; vars.password = password; vars.device = deviceId; // your server binds the licence or the push token to it var req:URLRequest = new URLRequest( "https://your.server/login" ); req.method = URLRequestMethod.POST; req.data = vars; var loader:URLLoader = new URLLoader(); loader.addEventListener( Event.COMPLETE, onLoginResult ); loader.load( req ); }
2 · 在重新安装后保留试用 (Android)
var dev:DeviceId = DeviceId.getInstance(); // Android: ANDROID_ID stays the same after uninstall and reinstall; only a // factory reset changes it. From Android 8 it is specific to your signing key. var anchor:String = dev.androidId; if ( anchor != "" ) checkTrial( anchor ); // your server: has this device used the trial before? else checkTrialOnIOS(); // iOS: androidId is always "" and identifierForVendor is // reset on uninstall, use KlugKeychain as the anchor there
3 · 跨平台代码与空值
import flash.utils.setTimeout; function readDeviceId():void { var dev:DeviceId = DeviceId.getInstance(); if ( !dev.isSupported ) { useOwnDesktopId(); // desktop: isSupported is false, every getter returns "" return; } var id:String = dev.uniqueId; if ( id == "" ) setTimeout( readDeviceId, 1000 ); // iOS can briefly have no value: ask again else onDeviceId( id ); }
API 概览
| DeviceId.getInstance() | 返回唯一实例。 |
| isSupported | 在 Android 和 iOS 上为 True。 |
| uniqueId | 当前运行平台的设备标识符:Android 上为 ANDROID_ID,iOS 上为 identifierForVendor;不可用时为空字符串。 |
| androidId | 仅限 Android 的设备标识符,卸载并重新安装后保持不变;在 iOS 和其他平台上为空字符串。 |
购买 KlugDeviceId
一个 AIR 应用的年度许可,含 12 个月内的所有更新。付款后,您将通过电子邮件收到扩展、ActionScript 库和文档,通常在一个工作日内。许可与条款
税费在结账时由 Link (Stripe) 计算。您需要在结账时输入 AIR 应用的应用 ID。
要求
| AIR SDK | 51.x (HARMAN) |
| iOS | iOS 17 或更高版本 |
| Android | Android 6.0 (API 23) 或更高版本 |
| 权限 | 无 |