IOS和Android生成设备唯一ID

文章目录


对于移动开发者来说, 经常需要追踪用户使用了哪台设备登录. 但是随着手机系统越来越完善, 对安全性要求也越来越高. 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也可能会变化

猜你喜欢

转载自blog.csdn.net/wzj_whut/article/details/85226021
今日推荐