原生iOS解决方案
设备唯一标识方案
概述
随着Android版本的迭代更新,谷歌对于用户敏感数据的保护也越来越重视。在传统的Android应用开发的过程中,通常会采用IMEI和WIFI的MAC地址来组成UUID,但是这种作法随着版本Android版本的迭代已经不再适用:
- IMEI : 在用户拒绝对权限READ_PHONE_STATE授权时,IMEI是获取不到的。
- MAC : 在Android 6.0后,个别设备在没有打开WiFi的情况下,MAC地址是无法获取的。
因此,传统获取UUID的作法有可能是不完整的。为了保证最终能够获取到一个完整的UUID,本方案纳入以下两个标识符作为备选补偿:
- AndroidId : 在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串即AndroidId
- PseudoId : 通过读取设备的ROM版本号、厂商名、CPU型号和其他硬件信息来组合出一串15位的号码。
不过,目前京东主站采用的方案如下:
- 系统版本 < Android 10 : UUID 字段为IMEI-MAC地址。(默认有IMEI获取权限,无权限则为 -MAC)
- 系统版本 >= Android 10 :
a. APP本地缓存了UUID:UUID字段将使用缓存的值,即 IMEI-MAC 或 -MAC 。 b. APP本地未缓存UUID:UUID 字段将填充 Android ID 字段。
使用
添加依赖包
工程根目录的 build.gradle:
//在整个项目的 build.gradle 文件配置仓库
allprojects {
repositories {
maven { url 'http://artifactory.jd.com/libs-releases-local/' }
maven { url "http://artifactory.jd.com/libs-snapshots-local/" }
}
}
需要使用 uuid 包的 module 的 build.gradle:
dependencies {
compile 'com.jingdong.wireless.jdsdk:okuuid:1.0.2'
}
注意:如果存在与主站打通数据的需求,即UUID需要和主站保持一致,那么就采用以下方式引入:
dependencies {
compile 'com.jingdong.wireless.jdsdk:okuuid-jdmall:1.0.0'
}
获取UUID
方法1.:UUID.readDeviceUUIDBySync(Context context)
示例:
String uuid = UUID.readDeviceUUIDBySync(JdSdk.getInstance().getApplicationContext());
调用UUID.readDeviceUUIDBySync(Context context)
方法获取UUID时,会尝试去获取IMEI。在用户未授权的情况下,该方法也不会造成崩溃,会通过降级方案获取一个完整的UUID字符串。通过该方法获取UUID的默认组合为IMEI-MAC。
方法2:UUID.readDeviceUUIDBySync(Request request)
示例:
Request request = new Request.Builder()
.setContext(JdSdk.getInstance().getApplicationContext())
.setWithoutPermission(true)
.build();
String uuid = UUID.readDeviceUUIDBySync(request);
调用UUID.readDeviceUUIDBySync(Request request)
方法获取UUID时,可以根据自身需求对UUID的获取进行定制。在上面的示例中,构建了一个会Request对象并设置了setWithoutPermission(true)
,那么在生成UUID时就不会去尝试去获取IMEI。在设置setWithoutPermission(true)
的情况下,该方法获取UUID的默认组合为AndroId-MAC。
其他
git仓库地址: http://git.jd.com/android-sdk/uuid.git
开发人员: wanggang85 hanyu10
联系电话: 13488781527 15350716634
邮箱: wanggang10@jd.com hanyu10@jd.com