蘋果在iOS6中禁用了[UIDevice uniqueIdentifier],在iOS7中又把mac地址的獲取給堵上了。沒辦法,畢竟人家是老大,說不讓你用,你也沒辦法。
在這邊總結一下現有的一部分UDID獲取方法(有蘋果推薦的,也有第三方的),目的在於拋磚,沒有切實的說明哪種方法好用。用哪種方法,完全由大家自己根據需要來決定。
iOS2~iOS7目前已有的技術方案
| 方案 | 提供方 | 實現方法 | 用途及使用情況 |
| 傳統UDID | 蘋果API | UIDevice的實例方法uniqueIdentifier直接可獲取 | ● 獲取設備的唯一識別碼 ● 在iOS5及之前的版本中,基本上使用該方法來獲取UDID。 |
| MAC+MD5 | UNIX系統調用 | 使用UNIX API獲取設備的MAC地址,再使用MD5加密算法生成一個字符串 | ● 由於蘋果在iOS6后停用了UDID方案,所以大部分應用都開始使用這種方案來生成設備的唯一識別碼 |
| CFUUID/NSUUID | 蘋果API | 通過唯一標識設備的一個值(通常是以太網硬件地址)和一個時間值來生成一個唯一標識串 | ● 蘋果建議基於CFUUID來生成一個UDID,然后將其存在程序中使用 |
| IDFV | 蘋果API | UIDevice的實例方法identifierForVendor | ● 用於標識供應商 |
| ADID | 蘋果API | ASIdentifierManager的實例方法advertisingIdentifier | ● 用於廣告服務 |
| OpenUDID | 第三方開源代碼 | 以CFUUID為基礎生成一個串,並同時存儲於系統剪切板和程序的沙盒(NSUserDefault)中,應用程序從這兩個地方之一獲取UDID | ● 在蘋果宣布禁用傳統UDID方案后,這是目前使用較為廣泛的開源方案,包括友盟在內的很多開發商都使用這一方案。 |
| SecureUDID | 第三方開源代碼 | 以CFUUID為基礎生成一個串,並同時存儲於程序剪切板中,程序可以從該剪切板中獲取UDID | ●在蘋果宣布禁用傳統UDID方案后,部分應用也采用了該方案(目前github上數據顯示該方案下載量僅次於OpenUDID,具體使用情況未知) |
系統支持情況
蘋果在iOS6以后,已禁用了UIDevice的uniqueIdentifier方法,所以傳統的UDID方法在iOS6以后已不能使用;而從iOS7開始,獲取MAC地址的方法統一返回02:00:00:00:00:00,所以使用MAC+MD5方法已無意義。
|
方案
|
iOS 2
|
iOS 3
|
iOS 4
|
iOS 5
|
iOS 6
|
iOS 7
|
|
UDID
|
√
|
√
|
√
|
√
|
×
|
×
|
|
MAC+MD5
|
√
|
√
|
√
|
√
|
√
|
×
|
|
CFUUID
|
√
|
√
|
√
|
√
|
√
|
√
|
|
NSUUID
|
×
|
×
|
×
|
×
|
√
|
√
|
|
IDFV
|
×
|
×
|
×
|
×
|
√
|
√
|
|
Ad ID
|
×
|
×
|
×
|
×
|
√
|
√
|
|
OpenUDID
|
?
|
√
|
√
|
√
|
√
|
√
|
|
SecureUDID
|
?
|
√
|
√
|
√
|
√
|
√
|
持久化情況
|
啟動程序
|
從后台返回
|
重置廣告標識
|
重新安裝程序
|
系統重啟
|
系統還原設置
|
升級系統
|
重裝系統
|
|
|
傳統UDID
|
√
|
√
|
√
|
√
|
√
|
√
|
√
|
√
|
|
MAC+MD5
|
√
|
√
|
√
|
√
|
√
|
√
|
√
|
√
|
|
CFUUID/NSUUID
|
×
|
×
|
×
|
×
|
×
|
×
|
×
|
×
|
|
IDFV
|
√
|
√
|
√
|
×
|
√
|
×
|
?√
|
?×
|
|
ADID
|
√
|
√
|
×
|
√
|
√
|
×
|
?√
|
?×
|
|
OpenUDID
|
√
|
√
|
√
|
√
|
√
|
×
|
?√
|
?×
|
|
SecureUDID
|
√
|
√
|
√
|
×
|
√
|
×
|
?√
|
?×
|
注:
優缺點
|
|
優點
|
缺點
|
|
CFUUID/NSUUID
|
|
● 刪除程序再安裝時,會生成新的UDID |
|
IDFV
|
● 對於運行於同一設備上的同一供應商的所有程序,該值都是相同的。 |
● 對於同一設備上不同供應商的程序,該值是不同的 ● 所謂同一供應商是由CFBundleIdentifier中的反轉DNS前兩部分來確定,如com.test1和com.test2即認為不是同一供應商 ● 用戶如果刪除同一供應商的所有程序,再安裝該供應商的程序時,該值會改變。 ● 該值在程序運行於后台時,或用戶在重啟系統后第一次解鎖設備可能返回nil值。 |
|
ADID
|
● 該值由系統持久化 ● 即使用戶限制廣告跟蹤,也可以使用該值來統計用戶數量、安全等方面的操作 ● 該值對於所有的供應商都是一樣的 |
● 只能用於廣告服務的程序訪問一個唯一標識 ● 如果用戶還原所有系統設置或還原廣告標識符時,可能重置該值。 ● 該值在程序運行於后台時,或用戶在重啟系統后第一次解鎖設備可能返回nil值。 |
|
OpenUDID
|
● 同一台設備上使用OpenUDID的所有程序其獲取到的UDID都是相同的 ● 沒有用到取MAC地址等可能被蘋果禁用的API |
● 在系統恢復設置或刷機的情況下會丟失 ● 非蘋果原生API |
|
SecureUDID
|
●對於運行於同一設備上的同一供應商的所有程序,該值都是相同的(供應商自己控制)。這樣防止因一個程序外泄UDID,而導致設備的UDID外泄 ● 與硬件設備無關 |
● 不能確保不同設備上的UDID不同 ● 用戶可以選擇阻止SecureUDID收集UDID信息 ● 如果用戶備份A設備系統並將其恢復到B設備,則B設備將得到A設備的UDID ● 刪除程序並清空剪切板可能會導致丟失 ● 非蘋果原生的API |
注:優缺點是個人判斷,還請各位看官指正
參考文獻
● http://www.doubleencore.com/2013/04/unique-identifiers/
● Apple開發文檔
http://www.cocoachina.com/bbs/read.php?tid=144524
