1. 程式人生 > >獲取裝置的唯一識別符號細解

獲取裝置的唯一識別符號細解

iOS中獲取裝置唯一識別符號的方法隨著ios版本的更新而變化,iOS 2.0版本以後UIDevice提供一個獲取裝置唯一識別符號的方法uniqueIdentifier,通過該方法我們可以獲取裝置的序列號,這個也是目前為止唯一可以確認唯一的標示符。好景不長,因為該唯一識別符號與手機一一對應,蘋果覺得可能會洩露使用者隱私,所以在 iOS 5.0之後該方法就被廢棄掉了;iOS 6.0系統新增了兩個用於替換uniqueIdentifier的介面,分別是:identifierForVendor,advertisingIdentifier,但這兩個介面會在應用重新安裝時改變數值,並不是唯一的標示符,所以開發者改為使用WiFi的mac地址來取代;iOS 7中蘋果又封殺mac地址,所以開發者再次改變思路使用KeyChain來儲存獲取到的UDID,這樣以後即使APP刪了再裝回來,也可以從KeyChain中讀取回來。

到現在為止,有四種獲取UUID的方法:

1.通過UIDevice類獲得NSUUID型別的identifierForVendor屬性:IDFV iOS 6.0以後

[UIDevice currentDevice].identifierForVendor.UUIDString;

2.通過ASIdentifierManager類獲得NSUUID型別的advertisingIdentifier屬性:IDFA iOS 6.0以後

[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

3.直接通過NSUUID類獲得 UUID iOS6以後才出有NSUUID

[[NSUUID UUID] UUIDString]

4.通過c語言的方法獲得  UUID iOS2.0以後

{

    CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);

    CFStringRef strRef = CFUUIDCreateString(kCFAllocatorDefault , uuidRef);

    NSString *uuidString = (__bridge NSString*)strRef;

    CFRelease(strRef);

    CFRelease(uuidRef);

    return uuidString;

筆者做了一個實驗:在同一過程中用以上四種方式獲取UUID列印結果如下

E0F5670C-3389-49A2-B6AA-FAA20776E518   identifierForVendor

428B4C84-8FF9-4B0E-975F-D6E242F13685    NSUUID

28CA1EDE-83B9-4839-8E2A-21A1EAC77C4C   c方法

3460682D-316F-451E-8BB3-DB4A856F8196     advertisingIdentifier

在同一個手機在工程中用以上四種方法獲取UUID時,四種方法獲取的UUID值是不同的,但四種方法獲得的UUID值都可以作為唯一標示使用,原因很簡單,當app第一次執行時便將這個值存在鑰匙串裡,只要每個裝置對應一個值就行,也就是保證每次發給伺服器的值是一樣的就ok,所以深層次的我們對裝置唯一識別符號的理解是:只要這是設個裝置唯一的值就ok,無論是怎麼獲取的。

另外,關於iOS系統裝置各個唯一標示的區別及詳細解釋見以下部落格

另外,獲取mac address作為唯一標示的方法,應該是在ios9之前才能用,筆者用一臺iphone6和iphone5系統版本皆為iOS11的裝置試過,兩臺裝置的mac address值相同,故綜上所述獲取iOS裝置的可行方法是本文對比的四種,頂多再加一種openUDID的方法(當然都需要鑰匙串配合完成)