1. 程式人生 > >IOS和Android生成裝置唯一ID

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也可能會變化