獲取iOS唯一標(biāo)識(shí)符

在2013年3月21日蘋果已經(jīng)通知開發(fā)者,從2013年5月1日起佛掖,訪問UIDID的應(yīng)用將不再能通過審核赏参,替代的方案是開發(fā)者應(yīng)該使用“在iOS 6中介紹的Vendor或Advertising標(biāo)示符”。

unique Identifier即將退出乏盐,蘋果給了我們Vendor和Advertising identifier兩個(gè)選擇汹忠,但應(yīng)該用哪一個(gè)淋硝?文檔并沒有給出確切答案,具體使用哪個(gè)完全由你根據(jù)自己app的目的來決定错维。下面我將列出iOS中目前支持的奖地,以及被廢棄的唯一標(biāo)示符方法,并對(duì)其做出相應(yīng)的解釋赋焕,希望可以幫你做出正確的確定参歹。

CFUUID

從iOS2.0開始,CFUUID就已經(jīng)出現(xiàn)了隆判。它是CoreFoundatio包的一部分犬庇,因此API屬于C語(yǔ)言風(fēng)格。CFUUIDCreate 方法用來創(chuàng)建CFUUIDRef侨嘀,并且可以獲得一個(gè)相應(yīng)的NSString臭挽,如下代碼:

CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);NSString *cfuuidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));

獲得的這個(gè)CFUUID值系統(tǒng)并沒有存儲(chǔ)。每次調(diào)用CFUUIDCreate咬腕,系統(tǒng)都會(huì)返回一個(gè)新的唯一標(biāo)示符欢峰。如果你希望存儲(chǔ)這個(gè)標(biāo)示符,那么需要自己將其存儲(chǔ)到NSUserDefaults, Keychain, Pasteboard或其它地方。

NSUUID

NSUUID在iOS 6中才出現(xiàn)纽帖,這跟CFUUID幾乎完全一樣宠漩,只不過它是Objective-C接口。+ (id)UUID 是一個(gè)類方法懊直,調(diào)用該方法可以獲得一個(gè)UUID扒吁。通過下面的代碼可以獲得一個(gè)UUID字符串:

NSString *uuid = [[NSUUID UUID] UUIDString];

跟CFUUID一樣,這個(gè)值系統(tǒng)也不會(huì)存儲(chǔ)室囊,每次調(diào)用的時(shí)候都會(huì)獲得一個(gè)新的唯一標(biāo)示符雕崩。如果要存儲(chǔ)的話,你需要自己存儲(chǔ)融撞。在我讀取NSUUID時(shí)盼铁,注意到獲取到的這個(gè)值跟CFUUID完全一樣(不過也可能不一樣):

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

廣告標(biāo)示符(IDFA-identifierForIdentifier)

這是iOS 6中另外一個(gè)新的方法,advertisingIdentifier是新框架AdSupport.framework的一部分尝偎。ASIdentifierManager單例提供了一個(gè)方法advertisingIdentifier捉貌,通過調(diào)用該方法會(huì)返回一個(gè)上面提到的NSUUID實(shí)例。

NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

跟CFUUID和NSUUID不一樣冬念,廣告標(biāo)示符是由系統(tǒng)存儲(chǔ)著的。不過即使這是由系統(tǒng)存儲(chǔ)的牧挣,但是有幾種情況下急前,會(huì)重新生成廣告標(biāo)示符。如果用戶完全重置系統(tǒng)((設(shè)置程序 -> 通用 -> 還原 -> 還原位置與隱私) 瀑构,這個(gè)廣告標(biāo)示符會(huì)重新生成裆针。另外如果用戶明確的還原廣告(設(shè)置程序-> 通用 -> 關(guān)于本機(jī) -> 廣告 -> 還原廣告標(biāo)示符) ,那么廣告標(biāo)示符也會(huì)重新生成寺晌。關(guān)于廣告標(biāo)示符的還原世吨,有一點(diǎn)需要注意:如果程序在后臺(tái)運(yùn)行,此時(shí)用戶“還原廣告標(biāo)示符”呻征,然后再回到程序中耘婚,此時(shí)獲取廣告標(biāo)示符并不會(huì)立即獲得還原后的標(biāo)示符。必須要終止程序陆赋,然后再重新啟動(dòng)程序沐祷,才能獲得還原后的廣告標(biāo)示符。之所以會(huì)這樣攒岛,我猜測(cè)是由于ASIdentifierManager是一個(gè)單例赖临。

針對(duì)廣告標(biāo)示符用戶有一個(gè)可控的開關(guān)“限制廣告跟蹤”。Nick Arnott的文章中已經(jīng)指出了灾锯。將這個(gè)開關(guān)打開兢榨,實(shí)際上什么也沒有做,不過這是希望限制你訪問廣告標(biāo)示符。這個(gè)開關(guān)是一個(gè)簡(jiǎn)單的boolean標(biāo)志吵聪,當(dāng)將廣告標(biāo)示符發(fā)到任意的服務(wù)器端時(shí)凌那,你最好判斷一下這個(gè)值,然后再做決定暖璧。

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

Vindor標(biāo)示符 (IDFV-identifierForVendor)

這種叫法也是在iOS 6中新增的案怯,不過獲取這個(gè)IDFV的新方法被添加在已有的UIDevice類中。跟advertisingIdentifier一樣澎办,該方法返回的是一個(gè)NSUUID對(duì)象嘲碱。

NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

蘋果官方的文檔中對(duì)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.

如果滿足這樣的條件,那么獲取到的這個(gè)屬性值就不會(huì)變:相同的一個(gè)程序里面-相同的vindor-相同的設(shè)備局蚀。如果是這樣的情況麦锯,那么這個(gè)值是不會(huì)相同的:相同的程序-相同的設(shè)備-不同的vindor,或者是相同的程序-不同的設(shè)備-無論是否相同的vindor琅绅。

看完上面的內(nèi)容扶欣,我有這樣的一個(gè)疑問“vendor是什么”。我首先想到的是蘋果開發(fā)者賬號(hào)千扶。但事實(shí)證明這是錯(cuò)誤的料祠。接著我想可能是有一個(gè)AppIdentifierPrefix東西,跟鑰匙串訪問一樣澎羞,可以在多個(gè)程序間共享髓绽。同樣,這個(gè)想法也是的妆绞。最后證明顺呕,vendor非常簡(jiǎn)單:一個(gè)Vendor是CFBundleIdentifier(反轉(zhuǎn)DNS格式)的前兩部分。例如括饶,com.doubleencore.app1 和 com.doubleencore.app2 得到的identifierForVendor是相同的株茶,因?yàn)樗鼈兊腃FBundleIdentifier 前兩部分是相同的。不過這樣獲得的identifierForVendor則完全不同:com.massivelyoverrated 或 net.doubleencore图焰。

在這里启盛,還需要注意的一點(diǎn)就是:如果用戶卸載了同一個(gè)vendor對(duì)應(yīng)的所有程序,然后在重新安裝同一個(gè)vendor提供的程序技羔,此時(shí)identifierForVendor會(huì)被重置驰徊。

示例: 599F9C00-92DC-4B5C-9464-7971F01F8370

UDID

在之前的版本中是可用的,但是在iOS5以及之后的版本中堕阔,以及被棄用了棍厂。雖然,這個(gè)UDID用得很廣泛超陆,但是牺弹,不得不說的是浦马,它在慢慢的遠(yuǎn)離開發(fā)者,不能在考慮使用UDID了张漂。至于這個(gè)標(biāo)示符是轉(zhuǎn)為私有方法晶默,或者完全從以后的iOS版本中移除,還有待觀察航攒。不過磺陡,這個(gè)UDID在部署企業(yè)級(jí)簽名程序時(shí),非常方便漠畜。獲取UDID的方法如下:

NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];

示例: bb4d786633053a0b9c0da20d54ea7e38e8776da4

OpenUDID

在iOS 5發(fā)布時(shí)币他,uniqueIdentifier被棄用了,這引起了廣大開發(fā)者需要尋找一個(gè)可以替代UDID憔狞,并且不受蘋果控制的方案蝴悉。由此OpenUDID成為了當(dāng)時(shí)使用最廣泛的開源UDID替代方案衰琐。OpenUDID在工程中實(shí)現(xiàn)起來非常簡(jiǎn)單祭示,并且還支持一系列的廣告提供商。

NSString *openUDID = [OpenUDID value];

OpenUDID利用了一個(gè)非常巧妙的方法在不同程序間存儲(chǔ)標(biāo)示符 — 在粘貼板中用了一個(gè)特殊的名稱來存儲(chǔ)標(biāo)示符缴阎。通過這種方法簇抵,別的程序(同樣使用了OpenUDID)知道去什么地方獲取已經(jīng)生成的標(biāo)示符(而不用再生成一個(gè)新的)庆杜。

之前已經(jīng)提到過,在將來碟摆,蘋果將開始強(qiáng)制使用advertisingIdentifier 或identifierForVendor欣福。如果這一天到來的話,即使OpenUDID看起來是非常不錯(cuò)的選擇焦履,但是你可能不得不過渡到蘋果推出的方法。

示例: 0d943976b24c85900c764dd9f75ce054dc5986ff

總結(jié)

希望上面的信息能夠幫助你在程序使用選擇正確的唯一標(biāo)示符雏逾。在這里嘉裤,我創(chuàng)建了一個(gè)小的唯一標(biāo)示符測(cè)試程序,你可以運(yùn)行該程序栖博,并查看一下顯示的內(nèi)容(包括上面提到的所有標(biāo)示符)屑宠。另外,下面有兩個(gè)表仇让,表中描述了兩個(gè)內(nèi)容:在iOS中的可用性典奉,以及什么時(shí)候可以獲得重置的標(biāo)示符。

* 程序必須重啟才能看到改變的效果丧叽。

** 刪除了所有相同vendor提供的程序卫玖,才能看到改變的值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末踊淳,一起剝皮案震驚了整個(gè)濱河市假瞬,隨后出現(xiàn)的幾起案子陕靠,更是在濱河造成了極大的恐慌,老刑警劉巖脱茉,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剪芥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡琴许,警方通過查閱死者的電腦和手機(jī)税肪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榜田,“玉大人益兄,你說我怎么就攤上這事〈浚” “怎么了偏塞?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)邦鲫。 經(jīng)常有香客問我灸叼,道長(zhǎng),這世上最難降的妖魔是什么庆捺? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任古今,我火速辦了婚禮,結(jié)果婚禮上滔以,老公的妹妹穿的比我還像新娘捉腥。我一直安慰自己,他們只是感情好你画,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布抵碟。 她就那樣靜靜地躺著,像睡著了一般坏匪。 火紅的嫁衣襯著肌膚如雪拟逮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天适滓,我揣著相機(jī)與錄音敦迄,去河邊找鬼。 笑死凭迹,一個(gè)胖子當(dāng)著我的面吹牛罚屋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嗅绸,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼脾猛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了鱼鸠?” 一聲冷哼從身側(cè)響起尖滚,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤喉刘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后漆弄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體睦裳,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年撼唾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了廉邑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡倒谷,死狀恐怖蛛蒙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情渤愁,我是刑警寧澤牵祟,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站抖格,受9級(jí)特大地震影響诺苹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雹拄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一收奔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滓玖,春花似錦坪哄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至禁悠,卻和暖如春念祭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绷蹲。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顾孽,地道東北人祝钢。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像若厚,于是被迫代替她去往敵國(guó)和親拦英。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容