iOS獲取設(shè)備唯一標(biāo)識(shí)的各種方法遂填?IDFA铲觉、IDFV、UDID分別是什么含義吓坚?
iOS獲取設(shè)備ID總結(jié)
IDFA解釋
關(guān)于UUID的理解 :
英文名稱是:Universally Unique Identifier,翻譯過來就是通用唯一標(biāo)識(shí)符撵幽。
UUID是指在一臺(tái)機(jī)器上生成的數(shù)字,它保證對(duì)在同一時(shí)空中的所有機(jī)器都是唯一的礁击。通常平臺(tái)會(huì)提供生成的API盐杂。
是一個(gè)32位的十六進(jìn)制序列,使用小橫線來連接:8-4-4-4-12 哆窿。
代碼獲取的方式:
NSLog(@"uuid = %@",[NSUUID UUID].UUIDString);
但是通過運(yùn)行程序可以發(fā)現(xiàn)链烈,循環(huán)10次,每一次打印的值都是不一樣的挚躯,當(dāng)然循環(huán)的再多强衡,這個(gè)值永遠(yuǎn)不會(huì)出現(xiàn)兩個(gè)一樣的值。
所以從某種程序上來說码荔,UUID跟你的設(shè)備沒有什么關(guān)系了漩勤。
由于UUID的本身特性,它保證對(duì)在同一時(shí)空中的所有機(jī)器都是唯一的感挥。
所以,需要作為唯一標(biāo)識(shí)碼的話,你可以通過保存在keychain或者NSUserDefaults中.
關(guān)于UDID的理解 :
所謂UDID指的是設(shè)備的唯一設(shè)備識(shí)別符,移動(dòng)廣告商和游戲網(wǎng)絡(luò)運(yùn)營(yíng)商往往需要通過UDID用來識(shí)別玩家用戶越败,并對(duì)用戶活動(dòng)進(jìn)行跟蹤触幼。
UDID 在 iOS5.0 的時(shí)候已經(jīng)被拋棄使用了.
代碼實(shí)現(xiàn) : [[UIDevice cuurrent] uniqueIdenfier]
在很早之前,蘋果宣稱如果第三方應(yīng)用開發(fā)者繼續(xù)分享或者使用iPhone究飞、Mac置谦、AppleWatch的UDID的話,那么他們的應(yīng)用將會(huì)禁止上架亿傅。
為什么蘋果要在應(yīng)用中禁止使用呢媒峡?那是因?yàn)殡[私問題。比如我開發(fā)了5款A(yù)pp袱蜡,很多用戶都下載了這5款A(yù)pp并使用丝蹭。
如果我能輕易的獲取這些用戶的UDID,其實(shí)我能拼湊出用戶的很多信息坪蚁。由于UDID本身的隱私屬性奔穿,之前常常用來做第三方統(tǒng)計(jì)和其他的目的。
當(dāng)然現(xiàn)在也有人使用MAC地址來識(shí)別設(shè)備敏晤,因?yàn)镸AC地址也唯一的識(shí)別了一臺(tái)設(shè)備并且不會(huì)被修改贱田,不知道以后蘋果會(huì)對(duì)此如何操作。
UDID是放棄在代碼中獲取,目前主要用于配置真機(jī)調(diào)試證書.
因?yàn)殡[私的問題,蘋果就推出了一個(gè)identifierForVendor的屬性獲取UDID,但獲取的值只是個(gè)替代品.詳細(xì)往下看
以下是蘋果對(duì)于禁用UDID的聲明:
關(guān)于IDFV的理解 :
目前取代獲取UDID的方式:
[[[UIDevice currentDevice] identifierForVendor] UUIDString];
關(guān)于identifierForVendor . 蘋果官方文檔有說明.
Normally, the vendor is determined by data provided by the App Store.
If the app was not installed from the app store (such as enterprise apps and apps still in development), then a vendor identifier is calculated based on the app’s bundle ID.
The bundle ID is assumed to be in reverse-DNS format.
大概的意思是:
通常, vendor的值根據(jù)已經(jīng)上架到App Store的app決定.
但如果app并不是從AppStore中下載安裝,比如說是依然處于開發(fā)階段.
那么vendor這個(gè)值會(huì)根據(jù)app's bundle ID 來計(jì)算.
bundle ID是反向DNS格式嘴脾。如:com.example.app
參考網(wǎng)上一些博客講解理解:
此時(shí)打印出的字符串UUIDString這個(gè)東西不是真正的UDID男摧,而是一個(gè)有一點(diǎn)像的替代品。如同我上面所說译打,UDID是只和iOS設(shè)備有關(guān)的耗拓,而這個(gè)identifierForVendor是應(yīng)用和設(shè)備兩者都有關(guān)的:
A應(yīng)用安裝到張三這臺(tái)設(shè)備上,就會(huì)產(chǎn)生一個(gè)identifierForVendor(比如是:1234)奏司;
A應(yīng)用安裝到李四這臺(tái)設(shè)備上乔询,就會(huì)產(chǎn)生另一個(gè)identifierForVendor(比如是:5678);
B應(yīng)用安裝到張三這臺(tái)設(shè)備上韵洋,又是一個(gè)全新的identifierForVendor(比如是:9999)竿刁,
B應(yīng)用安裝到李四這臺(tái)設(shè)備上,還是一個(gè)全新的identifierForVendor(比如是:7777)搪缨。
但是無論A應(yīng)用安裝卸載多少次食拜,產(chǎn)生的是都是1234. 所以我們知道,這個(gè)identifierForVendor是一種應(yīng)用加設(shè)備綁定產(chǎn)生的標(biāo)識(shí)符副编,相當(dāng)于是:Z(identifierForVendor) = X(某應(yīng)用) + Y(某設(shè)備)负甸。
當(dāng)然,和真正的UDID的區(qū)別是顯而易見的:也就是說App的開發(fā)者沒有辦法去區(qū)分某一臺(tái)設(shè)備了,而是只能識(shí)別某個(gè)應(yīng)用在某臺(tái)設(shè)備上惑惶。
Vindor標(biāo)示符煮盼,適用于對(duì)內(nèi):例如分析用戶在應(yīng)用內(nèi)的行為等。
是給Vendor標(biāo)識(shí)用戶用的带污,每個(gè)設(shè)備在所屬同一個(gè)Vender的應(yīng)用里,都有相同的值香到。其中的Vender是指應(yīng)用提供商鱼冀,但準(zhǔn)確點(diǎn)說,是通過BundleID的DNS反轉(zhuǎn)的前兩部分進(jìn)行匹配悠就,如果相同就是同一個(gè)Vender千绪,例如對(duì)于com.somecompany.appone,com.somecompany.apptwo
這兩個(gè)BundleID來說,就屬于同一個(gè)Vender梗脾,共享同一個(gè)idfv的值荸型。和idfa不同的是,idfv的值是一定能取到的炸茧,所以非常適合于作為內(nèi)部用戶行為分析的主id瑞妇,來標(biāo)識(shí)用戶,替代OpenUDID梭冠。
注意:如果用戶將屬于此Vender的所有App卸載辕狰,則idfv的值會(huì)被重置,即再重裝此Vender的App控漠,idfv的值和之前不同蔓倍。
關(guān)于IDFA的理解 :
代碼實(shí)現(xiàn):
#import <AdSupport/AdSupport.h>
NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
在今年iOS10推出后,蘋果推出了“限制廣告追蹤”功能盐捷,設(shè)置的路徑和iOS9一致偶翅。
不過經(jīng)過實(shí)際的測(cè)試,在iOS10之前碉渡,即使用戶打開這個(gè)功能聚谁,商家一樣可以獲取IDFA,只不過與之前的不一樣了爆价,每次切換這個(gè)開關(guān)與點(diǎn)擊“還原廣告標(biāo)識(shí)符”的效果一樣垦巴。
而iOS10就不一樣了,當(dāng)用戶打開這個(gè)功能后铭段,商家只能獲取到一連串無意義的0
總結(jié) :
目前在項(xiàng)目中使用的比較多的也就數(shù)IDFV了,其他的幾個(gè)基本都被蘋果淘汰了.
同時(shí)關(guān)于UUID,因?yàn)楸WC對(duì)在同一時(shí)空中的所有機(jī)器都是唯一的,所以在程序安裝的時(shí)候生成唯一的UUID并且保存在keychain中,以這個(gè)唯一的UUID作為唯一標(biāo)識(shí)符,就可以用于判斷唯一設(shè)備.變相的作為UDID的用法
最后 : 參考別人的GitHub代碼IDFA