推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

IMEI 弃用!收下这份保姆级的 OAID 集成教程

   2023-07-31 网络整理佚名1820
核心提示:补充设备标识体系补充设备标识体系主要分为四层结构:因此你还需要根据实际场景需要设计证书更新机制,比如在应用中内置一个默认证书,并应用开到期时提前从后台服务器更新证书。时需要去厂商后台校验和计算获得json),基于应用签名的方案,对我们会友好些。补充设备标识符本质上是厂商提供的能力,因此只有真机支持,模拟器是不支持的。

2. 补充设备识别系统

辅助设备标识系统主要分为四层:

3. 准备工作

根据MSA的要求,在下载SDK和集成文档之前,您需要注册一个企业帐号。 此步骤中,您只需按照指引提交相关信息和材料即可。 一般1至2个工作日即可批准。

从v1.0.26开始,SDK引入了证书验证机制。 每个APP都需要申请一个证书文件(包名.cert.pem),只有包名与证书匹配的APP才能正常获取补充设备ID。 默认证书的有效期为1年,证书过期也会影响辅助设备ID的获取。 因此,还需要根据实际场景设计证书更新机制,例如在应用程序中构建默认证书,在应用程序过期时提前从后台服务器更新证书。 申请证书需要向中国发送申请邮件并附上form.csv,例如:

企业账号注册并通过审核后,就可以从官网下载相关资料(因为MSA禁止第三方非法分发SDK,所以还是要自己下载)。

4. 集成与封装

.kt

interface IOAIDApi {


fun init(debug: Boolean)


@AnyThread
fun fetchDeviceIds(callback: (OAIDResult) -> Unit)
}

OAID.kt

internal class OAID private constructor(
context: Context
) : IOAIDApi {

// ApplicationContext
private val context: Context = context.applicationContext


@Volatile
private var isCertInit: Boolean = false


private var isCertValid: Boolean = false


private var certExpDate: Date? = null


private var debug: Boolean = false

companion object {

@Volatile
private var _oaid: IOAID? = null

@AnyThread
fun oaid(context: Context): IOAID {
if (null == _oaid) {
synchronized(IOAID::class.java) {
if (null == _oaid) {
_oaid = OAIDImpl(context)
}
}
}
return _oaid!!
}
}

override fun init(debug: Boolean) {
System.loadLibrary("msaoaidsec")

this.debug = debug
}

override fun fetchDeviceIds(callback: (OAIDResult) -> Unit) {
// 1. 验证与初始化证书
checkCertValidity()

// 2.1 提供空信息的 ID 提供器
val unsupportedIdSupplier = IdSupplierImpl()

// 2.2 统一的回调接收器
val listener = IIdentifierListener { supplier: IdSupplier? ->
supplier?.let {
// 回调
callback(
OAIDResult(
supplier.isSupported, supplier.isLimited, supplier.oaid, supplier.vaid, supplier.aaid
)
)
}
}

if (!isCertValid) {
// 证书无效,直接回调空信息
listener.onSupport(unsupportedIdSupplier)
return
}

// 3. 调用 SDK 接口获取 OAID
val code = try {
MdidSdkHelper.InitSdk(context, debug, listener)
} catch (error: Error) {
error.printStackTrace()
-1
}
// 4. 处理异常情况
when (code) {
InfoCode.INIT_ERROR_CERT_ERROR, // 证书未初始化或证书无效,SDK 内部不会回调 onSupport
InfoCode.INIT_ERROR_DEVICE_NOSUPPORT, // 不支持的设备, SDK 内部不会回调 onSupport
InfoCode.INIT_ERROR_LOAD_CONFIGFILE, // 加载配置文件出错, SDK 内部不会回调 onSupport
InfoCode.INIT_ERROR_MANUFACTURER_NOSUPPORT, // 不支持的设备厂商, SDK 内部不会回调 onSupport
InfoCode.INIT_ERROR_SDK_CALL_ERROR // SDK 调用出错, SDK 内部不会回调 onSupport
-> {
// 异常情况,直接回调空信息
listener.onSupport(unsupportedIdSupplier)
}
InfoCode.INIT_INFO_RESULT_DELAY, // 获取接口是异步的,SDK 内部会回调 onSupport
InfoCode.INIT_INFO_RESULT_OK // 获取接口是同步的,SDK 内部会回调 onSupport
-> {
// do nothing
}
else -> {
// do nothing
}
}
}


private fun checkCertValidity() {


fun loadPemFromAssetFile(): String {
return try {
// 证书文件名
val certFileName = context.packageName + ".cert.pem"
val inputStream = context.assets.open(certFileName)
val bufferReader = BufferedReader(InputStreamReader(inputStream))
val builder = StringBuilder()
var line: String?
while (bufferReader.readLine().also { line = it } != null) {
builder.append(line)
builder.append('\n')
}
builder.toString()
} catch (e: IOException) {
""
}
}


fun getCertExpDate(certStr: String): Date? {
return try {
// 证书实体
val cert = CertificateFactory.getInstance("X.509").generateCertificate(certStr.byteInputStream()) as X509Certificate
// 验证证书有效性,如果证书过期会抛出异常
cert.checkValidity()
cert.notAfter
} catch (ex: Exception) {
// 证书无效
null
}
}

// DCL
if (isCertInit) {
// 初始化只需要进行一次,返回上一次的结果
return
}
synchronized(IOAID::class) {
if (isCertInit) {
return
}
isCertInit = true
// 证书文件名
val certStr = loadPemFromAssetFile()
// 证书过期时间
certExpDate = getCertExpDate(certStr)
// TODO 如果你的应用场景对证书有效性要求非常高,可以在这个时机提前下载更新证书
// 初始化证书,证书只需要初始化一次
isCertValid = MdidSdkHelper.InitCert(context, certStr)
}
}
}

5. 其他细节

SDK 需要互联网连接吗?

大多数厂家在调用接口时都会需要联网。 比如获取VAID和AAID时,需要到厂家后台查看计算

VAID的定义是设备+开发者维度的ID。 同一设备、同一开发者上的所有应用程序都具有相同的 VAID,而在其他情况下,VAID 不同。 不同的手机厂商判断是否是同一开发商的方式也不同。 有的直接通过AppId判断,比如vivo; 有的通过应用签名信息来判断,比如oppo。 基于AppID的方案需要我们在配置文件中填写应用商店中分配的AppId(并配置为/.json)。 基于应用签名的方案对我们来说会更加友好。

补充设备标识符本质上是制造商提供的功能,因此仅真实设备支持,模拟器不支持。 有关支持的真实设备列表,请参阅 SDK 文档:

—— 图片截图来自 MSA 官方文档

可以通过代码解析,也可以将证书内容复制到在线解析,例如:

对于不了解数字证书的同学,可以回顾一下我们之前的讨论:《加密、摘要、签名、证书,讲解一遍!》

参考

最近创建了一个交流群,希望大家可以一起讨论技术,找到志同道合的朋友,有需要的可以扫描二维码进群!

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON