IOS和Android生成裝置唯一ID
阿新 • • 發佈:2019-01-01
文章目錄
對於移動開發者來說, 經常需要追蹤使用者使用了哪臺裝置登入. 但是隨著手機系統越來越完善, 對安全性要求也越來越高. 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也可能會變化