文章目录
- IOS系统
- Android系统
对于移动开发者来说, 经常需要追踪用户使用了哪台设备登录. 但是随着手机系统越来越完善, 对安全性要求也越来越高. IOS已经无法获取IMEI, 网络MAC地址信息, Android获取IMEI需要用户权限, MAC地址未来也可能获取不到.因此需要使用其它手机来给设备生成一个ID.
IOS系统
NSString* deviceId = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
卸载重装APP之后, 这个值会变化. 因此首次生成ID之后, 需要存储到Keychain中, 以后不再重新生成. 当然, 用户恢复出厂设置之后, 还是会消失的.
示例代码
https://github.com/wzjwhut/IosDeviceIdAndKeychain
Android系统
如果开发者一定要用户开启权限的话, 也可以直接使用IMEI. 折中的办法也是自己生成一个ID.
private String generateDeviceId(){
MessageDigest digest;
try {
char[] chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
digest = MessageDigest.getInstance("MD5");
digest.update((getBaseContext().getPackageName() + Build.MANUFACTURER +
Build.BRAND + Build.DEVICE + Build.SERIAL +
Settings.Secure.getString(getBaseContext().getContentResolver(),
Settings.Secure.ANDROID_ID)).getBytes("UTF-8"));
byte[] bin = digest.digest();
StringBuilder stringBuf = new StringBuilder(bin.length<<1);
for (int i = 0; i < bin.length; i++) {
stringBuf.append(chars[(bin[i]>>4)&0x0f]);
stringBuf.append(chars[bin[i]&0x0f]);
}
String deviceId = stringBuf.toString();
Log.i("deviceId", deviceId);
return deviceId;
} catch (Exception e) {
}
return "";
}
这里使用了多个系统属性来生成一个ID, 减少重复的可能性, 如果用户恢复出厂设备, 这个ID也可能会变化