1. 程式人生 > >獲取iOS設備唯一標識

獲取iOS設備唯一標識

top vendor creates 方法 align hbm bnt after ebo

獲取iOS設備唯一標識

獲取iOS設備唯一標識
大綱
  • 思維導圖

  • 詳情

思維導圖
詳情

UDID

在之前的版本是可以被使用的,iOS5及以後,被蘋果禁止使用了(棄用了)。雖然,這個UDID用得很廣泛,但是,不得不說的是,它在慢慢的遠離開發者,不能在考慮使用UDID了。至於這個標示符是轉為私有方法,或者完全從以後的iOS版本中移除,還有待觀察。不過,這個UDID在部署企業級簽名程序時,非常方便。

獲取UDID的方法如下: NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];

示例:bb4d786633053a0b9c0da20d54ea7e38e8776da4

OpenUDID(github上一個開源的項目)

在iOS 5發布時,UDID被棄用了,這引起了廣大開發者需要尋找一個可以替代UDID,並且不受蘋果控制的方案。由此OpenUDID成為了當時使用最廣泛的開源UDID替代方案。OpenUDID在工程中實現起來非常簡單,並且還支持一系列的廣告提供商。

獲取UDID的方法如下: NSString *openUDID = [OpenUDID value];

OpenUDID原理是利用iOS系統中的UIPasteboard剪貼板類,它用 app-special pastboards 來存儲一160位的隨機字符串,存取的方式類似字典的key-value。 app-special pastboards 可持久存儲字符串,即使開關機、卸載應用,並能在app之間共享。Openudid的第一次訪問的時候用key去檢查剪貼板內是否存在對應的value(隨機數),如果不存在就生成一個並存儲在Pasteboard中,第二次訪問的時候就可以直接取到而不去生成新的隨機數。 但是iOS7之後,蘋果封堵了剪貼板通信的漏洞,iOS之前是所有的應用都可以共享同一個剪貼板存儲內容,現在只有在同一CFBundleIdentifier標識下的App才能共享內容,如com.koudai.a和com.koudai.b,它們的com.mycompany部分是一樣的,就能共享(請用真機測試,模擬器會有偏差)。

UUID

目前大部分應用存的是UUID,它是蘋果再iOS6後提供的一個獲取大隨機數的方法。UUID, 全球獨立標識(Globally Unique Identifier),據wiki說UUID隨機數算法得到的數重復概率為170億分之一,170億分之一什麽概念?可以告訴你買一註雙色球的中獎概率是1700萬分之一。

以下是幾種取到UUID的方法,它們各有區別:

CFUUID

從iOS2.0開始,CFUUID就已經出現了。它是CoreFoundatio包的一部分,因此API屬於C語言風格。CFUUIDCreate 方法用來創建CFUUIDRef,並且可以獲得一個相應的NSString。獲得的這個CFUUID值系統並沒有存儲。每次調用CFUUIDCreate,系統都會返回一個新的唯一標示符。如果你希望存儲這個標示符,那麽需要自己將其存儲到NSUserDefaults, Keychain, Pasteboard或其它地方。

獲取CFUUID方法如下: CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);NSString *cfuuidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));

示例:68753A44-4D6F-1226-9C60-0050E4C00067

NSUUID

NSUUID在iOS 6中才出現,這跟CFUUID幾乎完全一樣,只不過它是Objective-C接口。跟CFUUID一樣,這個值系統也不會存儲,每次調用的時候都會獲得一個新的唯一標示符。如果要存儲的話,你需要自己存儲。

獲取NSUUID方法如下:NSString *uuid = [[NSUUID UUID] UUIDString];

示例:68753A44-4D6F-1226-9C60-0050E4C00067

IDFA-identifierForIdentifier

這是iOS 6中另外一個新的方法,advertisingIdentifier是新框架AdSupport.framework的一部分。ASIdentifierManager單例提供了一個方法advertisingIdentifier,通過調用該方法會返回一個上面提到的NSUUID實例。

跟CFUUID和NSUUID不一樣,廣告標示符是由系統存儲著的。不過即使這是由系統存儲的,但是有幾種情況下,會重新生成廣告標示符。如果用戶完全重置系統((設置程序 -> 通用 -> 還原 -> 還原位置與隱私) ,這個廣告標示符會重新生成。另外如果用戶明確的還原廣告(設置程序-> 通用 -> 關於本機 -> 廣告 -> 還原廣告標示符) ,那麽廣告標示符也會重新生成。關於廣告標示符的還原,有一點需要註意:如果程序在後臺運行,此時用戶“還原廣告標示符”,然後再回到程序中,此時獲取廣告標示符並不會立即獲得還原後的標示符。必須要終止程序,然後再重新啟動程序,才能獲得還原後的廣告標示符。之所以會這樣,我猜測是由於ASIdentifierManager是一個單例。

針對廣告標示符用戶有一個可控的開關“限制廣告跟蹤”。Nick Arnott的文章中已經指出了。將這個開關打開,實際上什麽也沒有做,不過這是希望限制你訪問廣告標示符。這個開關是一個簡單的boolean標誌,當將廣告標示符發到任意的服務器端時,你最好判斷一下這個值,然後再做決定。

註意:Appstore禁止不使用廣告而采集IDFA的app上架。請參考

獲取IDFA方法如下:NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

示例:E2DFA89-496A-47FD-9941-DF1FC4E6484A

IDFV-identifierForVendor

這種叫法也是在iOS 6中新增的,不過獲取這個IDFV的新方法被添加在已有的UIDevice類中。跟advertisingIdentifier一樣,該方法返回的是一個NSUUID對象。

蘋果官方的文檔中對identifierForVendor有如下這樣的一段描述 : The value of this property is the same for apps that come from the same vendor running on the same device. A different value is returned for apps on the same device that come from different vendors, and for apps on different devices regardless of vendor.意思是根據vendor的值,如果vendor相同,則返回同一字符串;如果vendor不同,則返回不同的字符串。

vendor解釋:英文解釋為賣家,小販。根據xcode文檔解釋,正常情況下,會根據App Store提供的數據進行判斷。但是如果app不是通過app store進行安裝的(如企業應用或開發調試階段),那麽會根據bundle ID判斷。

獲取IDFA方法如下:NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

示例:E2DFA89-496A-47FD-9941-DF1FC4E6484A

註:天生的普通人

獲取iOS設備唯一標識