天天看點

關于iOS擷取手機唯一辨別符iOS手機辨別符的曆程:擷取手機的唯一辨別:

從網上找到了一些關于手機唯一标示符的相關資料,整理了出來,希望有用!

iOS手機辨別符的曆程:

在 iOS 5 中, 可以擷取到系統的 UDID(Unique Device Identifier) ,後來被 Apple 禁止掉了。

在 iOS 6 中,大家開始使用 MAC 位址 MAC(Medium/Media Access Control) ,後來又被 Apple 禁止掉了。

同樣的,OpenUDID 也不能用了:

  • OpenUDID doesn’t work on iOS 7 。
  • UDID is dead, OpenUDID is deprecated, long live advertisingIdentifier!

在 iOS 7 中,Apple 推薦使用廣告辨別符 advertisingIdentifier 來擷取系統的唯一辨別符。但是,使用者如果重置了系統,廣告辨別符會重新生成。這就達不到 “唯一辨別符” 的作用。

于是,在 iOS 7 中,程式員們發明了 “鑰匙串儲存” 方法,将這個唯一辨別符儲存在鑰匙串中,安裝了 App 後讀取這個辨別符即可。參見這裡:ios 利用鑰匙串儲存密碼和擷取密碼 和 Simple iPhone Keychain Access 。

更詳細的操作,可以參考這篇:如何使用KeyChain儲存和擷取UDID 。

擷取手機的唯一辨別:

下面的内容轉自: 網易杭州 QA Team

在iOS系統中,擷取裝置唯一辨別的方法有很多:

一.UDID(Unique Device Identifier)

二.UUID(Universally Unique Identifier)

三.MAC Address

四.OPEN UDID

五.廣告标示符(IDFA-identifierForIdentifier)

六.Vendor标示符 (IDFV-identifierForVendor)

七.推送token+bundle_id

下面依次介紹:

UDID的全稱是Unique Device Identifier,它就是蘋果IOS裝置的唯一識别碼,它由40個字元的字母和數字組成(越獄的裝置通過某些工具可以改變裝置的UDID)。

移動網絡可利用UDID來識别移動裝置,但是,從IOS5.0(2011年8月份)開始,蘋果宣布将不再支援用uniqueIdentifier方法擷取裝置的UDID,iOS5以下是可以用的。

在2013年3月21日蘋果已經通知開發者:從2013年5月1日起,通路UIDIDs的程式将不再被稽核通過,替代的方案是開發者應該使用“在iOS 6中介紹的Vendor或Advertising标示符”。是以UDID是絕對不能用啦。

UUID

是Universally Unique Identifier的縮寫,中文意思是通用唯一識别碼。它是讓分布式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。這樣,每個人都可以建立不與其它人沖突的 UUID。在此情況下,就不需考慮資料庫建立時的名稱重複問題。蘋果公司建議使用UUID為應用生成唯一辨別字元串。

iOS中擷取UUID的代碼如下:

-(NSString*) uuid {  
    CFUUIDRef puuid = CFUUIDCreate( nil );  
    CFStringRef uuidString = CFUUIDCreateString( nil, puuid );  
    NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString);  
    CFRelease(puuid);  
    CFRelease(uuidString);  
    return [result autorelease];  
}
      

開發者可以在應用第一次啟動時調用一 次,然後将該串存儲起來,以便以後替代UDID來使用。但是,如果使用者删除該應用再次安裝時,又會生成新的字元串,是以不能保證唯一識别該裝置。這就需要各路高手想出各種解決方案。是以,之前很多應用就采用MAC Address。但是現在如果使用者更新到iOS7(及其以後的蘋果系統)後,他們機子的MAC Address就是一樣的,沒辦法做區分,隻能棄用此方法,重新使用UUID來辨別。如果使用UUID,就要考慮應用被删除後再重新安裝時的處理。

一個解決的辦法是:UUID一般隻生成一次,儲存在iOS系統裡面,如果應用删除了,重裝應用之後它的UUID還是一樣的,除非系統重置 。但是不能保證在以後的系統更新後還能用(如果系統儲存了該資訊就能用)。

MAC位址

英文原文:In iOS 7 and later, if you ask for the MAC address of an iOS device, the system returns the value 02:00:00:00:00:00. If you need to identify the device, use the identifierForVendor property of UIDevice instead. (Apps that need an identifier for their own advertising purposes should consider using the advertisingIdentifier property of ASIdentifierManager instead.)

翻譯:從iOS7及更高版本往後,如果你向ios裝置請求擷取mac位址,系統将傳回一個固定值“02:00:00:00:00:00”,如果你需要識别裝置的 唯一性,請使用UIDevice的identifierForVendor屬性。(因廣告目的而需要識别裝置的應用,請考慮使用 ASIdentifierManager的advertisingIdentifier屬性作為替代)

這個MAC位址是指什麼?有什麼用?

MAC(Medium/Media Access Control)位址,用來表示網際網路上每一個站點的辨別符,采用十六進制數表示,共六個位元組(48位)。其中,前三個位元組是由IEEE的注冊管理機構 RA負責給不同廠家配置設定的代碼(高位24位),也稱為“編制上唯一的辨別符” (Organizationally Unique Identifier),後三個位元組(低位24位)由各廠家自行指派給生産的擴充卡接口,稱為擴充辨別符(唯一性)。

MAC位址在網絡上用來區分裝置的唯一性,接入網絡的裝置都有一個MAC位址,他們肯定都是不同的,是唯一的。一部iPhone上可能有多個MAC位址,包括WIFI的、SIM的等,但是iTouch和iPad上就有一個WIFI的,是以隻需擷取WIFI的MAC位址就好了,也就是en0的位址。

形象的說,MAC位址就如同我們身份證上的身份證号碼,具有全球唯一性。這樣就可以非常好的辨別裝置唯一性,類似與蘋果裝置的UDID号,通常的用途有:

1)用于一些統計與分析目的,利用使用者的操作習慣和資料更好的規劃産品;

2)作為使用者ID來唯一識别使用者,可以用遊客身份使用app又能在伺服器端儲存相應的資訊,省去使用者名、密碼等注冊過程。

那麼,如何使用Mac位址生成裝置的唯一辨別呢?主要分三種:

  1. 直接使用“MAC Address”
  2. 使用“MD5(MAC Address)”
  3. 使用“MD5(Mac Address+bundle_id)”獲得“機器+應用”的唯一辨別(bundle_id 是應用的唯一辨別)

iOS7之前,因為Mac位址是唯一的, 一般app開發者會采取第3種方式來識别安裝對應app的裝置。為什麼會使用它?在iOS5之前,都是使用UDID的,後來被禁用。蘋果推薦使用UUID 但是也有諸多問題,進而使用MAC位址。而MAC位址跟UDID一樣,存在隐私問題,現在蘋果新釋出的iOS7上,如果請求Mac位址都會傳回一個固定 值,那麼Mac Address+bundle_id這個值大家的裝置都變成一緻的啦,跟UDID一樣相當于被禁用。

OPEN UDID:

沒有用到MAC位址,同時能保證同一台裝置上的不同應用使用同一個OpenUDID,隻要使用者裝置上有一個使用了OpenUDID的應用存在時,其他後續安裝的應用如果擷取OpenUDID,都将會獲得第一個應用生成的那個。但是根據貢獻者的代碼和方法,和一些開發者的經驗,如果把使用了OpenUDID方案的應用全部都删除,再重新擷取OpenUDID,此時的OpenUDID就跟以前的不一樣。可見,這種方法還是不保險。

廣告标示符

是iOS 6中另外一個新的方法,提供了一個方法advertisingIdentifier,通過調用該方法會傳回一個NSUUID執行個體,最後可以獲得一個UUID,由系統存儲着的。不過即使這是由系統存儲的,但是有幾種情況下,會重新生成廣告标示符。

如果使用者完全重置系統((設定程式 -> 通用 -> 還原 -> 還原位置與隐私) ,這個廣告标示符會重新生成。

另外如果使用者明确的還原廣告(設定程式-> 通用 -> 關于本機 -> 廣告 -> 還原廣告标示符) ,那麼廣告标示符也會重新生成。

關于廣告标示符的還原,有一點需要注意:如果程式在背景運作,此時使用者“還原廣告标示符”,然後再回到程式中,此時擷取廣 告标示符并不會立即獲得還原後的标示符。必須要終止程式,然後再重新啟動程式,才能獲得還原後的廣告标示符。

Vendor标示符

也是在iOS 6中新增的,跟advertisingIdentifier一樣,該方法傳回的是一個 NSUUID對象,可以獲得一個UUID。如果滿足條件“相同的一個程式裡面-相同的vendor-相同的裝置”,那麼擷取到的這個屬性值就不會變。如果是“相同的程式-相同的裝置-不同的vendor,或者是相同的程式-不同的裝置-無論是否相同的vendor”這樣的情況,那麼這個值是不會相同的。

推送token+bundle_id的方法:

  1. 應用中增加推送用來擷取token
  2. 擷取應用bundle_id
  3. 根據token+bundle_id進行散列運算

apple push token保證裝置唯一,但必須有網絡情況下才能工作,該方法不依賴于裝置本身,但依賴于apple push,而蘋果push有時候會抽風的。