2016-06-10(獲取iOS設(shè)備唯一標(biāo)識(shí)的幾種方法)

IOS系統(tǒng)中者蠕,獲取設(shè)備唯一標(biāo)識(shí)的方法有很多:

一.UDID(Unique Device Identifier)

UDID的全稱是Unique Device Identifier筒狠,顧名思義胞皱,它就是蘋果IOS設(shè)備的唯一識(shí)別碼,它由40個(gè)字符的字母和數(shù)字組成捐名。每臺(tái)iOS設(shè)備的UDID是唯一且永遠(yuǎn)不會(huì)改變。但是Unique Device Identifier 最早就被蘋果封殺了,使用會(huì)被拒絕田晚。

iOS 2.0版本以后UIDevice提供一個(gè)獲取設(shè)備唯一標(biāo)識(shí)符的方法uniqueIdentifier,通過(guò)該方法我們可以獲取設(shè)備的序列號(hào)国葬,這個(gè)也是目前為止唯一可以確認(rèn)唯一的標(biāo)示符贤徒。好景不長(zhǎng)芹壕,因?yàn)樵撐ㄒ粯?biāo)識(shí)符與手機(jī)一一對(duì)應(yīng),蘋果覺得可能會(huì)泄露用戶隱私接奈,所以在 iOS 5.0之后該方法就被廢棄掉了踢涌;iOS 6.0系統(tǒng)新增了兩個(gè)用于替換uniqueIdentifier的接口,分別是:identifierForVendor序宦,advertisingIdentifier睁壁,但這兩個(gè)接口會(huì)在應(yīng)用重新安裝時(shí)改變數(shù)值,并不是唯一的標(biāo)示符互捌,所以開發(fā)者改為使用WiFi的mac地址來(lái)取代潘明;iOS 7中蘋果又封殺mac地址。所以說(shuō)秕噪,現(xiàn)在想通過(guò)代碼獲取是不可能的了钳降,如果你想看看你設(shè)備的UDID,可以通過(guò)iTunes來(lái)查看腌巾。

而且我們需要注意的一點(diǎn)是,對(duì)于已越獄了的設(shè)備,UDID并不是唯一的.使用Cydia插件UDIDFaker,可以為每一個(gè)應(yīng)用分配不同的UDID.

所以UDID作為標(biāo)識(shí)唯一設(shè)備的用途已經(jīng)不大了

那么有沒有另外的辦法來(lái)獲取用戶設(shè)備的唯一標(biāo)識(shí)符呢遂填?答案是有的,當(dāng)然這樣的標(biāo)識(shí)符不是蘋果隱藏的UDID了澈蝙,使用OpenUDID開源代碼吓坚,這個(gè)代碼通過(guò)一些特殊的算法,創(chuàng)建了每一個(gè)設(shè)備的唯一標(biāo)識(shí)符碉克,你可以拿過(guò)來(lái)用來(lái)識(shí)別設(shè)備了凌唬。

二.MAC Address

原來(lái)可用,后來(lái)也被蘋果封了漏麦,怕用作盜刷信用卡之用途

三.OPEN UDID

第三方最出名的莫過(guò)于此了客税,但是iOS7這貨也無(wú)法使用了,由于iOS7對(duì)剪貼板(OpenUDID保存到剪貼版中)的限制,導(dǎo)致同一個(gè)設(shè)備上應(yīng)用間撕贞,無(wú)法再共享一個(gè)OpenUDID更耻。

OpenUDID原理:安裝第一個(gè)OpenUDID開發(fā)的游戲App1,生成OpenUDID捏膨,安裝第二款OpenUDID的App2秧均,會(huì)從剪貼板中獲取出之前生成的UDID,App1号涯、App2都是使用的同一個(gè)UDID目胡,但是如果刪除所有OpenUDID的游戲后,重新安裝App1链快,這時(shí)生成的UDID就已經(jīng)重置了誉己,和之前的已然不同,玩家的賬號(hào)信息已丟失域蜗,要被投訴了……

當(dāng)將設(shè)備上所有使用了OpenUDID方案的應(yīng)用程序刪除巨双,且設(shè)備關(guān)機(jī)重啟噪猾,xcode徹底清除并重啟,重裝應(yīng)用程序去獲取OpenUDID筑累,此時(shí)OpenUDID變化袱蜡,與之前不一樣了,

四.UUID(Universally Unique Identifier)

UUID是Universally Unique Identifier的縮寫,中文意思是通用唯一識(shí)別碼.

利用UUID獲取設(shè)備唯一識(shí)別碼有以下三種方式:

1慢宗,利用 NSUserDefaults 存取坪蚁。

這種方法可以保證用戶不刪除軟件情況下的獲取同一個(gè)數(shù)據(jù)。因?yàn)镹SUserDefaults 數(shù)據(jù)時(shí)保存在 沙盒里面的婆廊,會(huì)隨著軟件刪除而被清空迅细。UUID不好的地方就是用戶刪除了你開發(fā)的程序以后,基本上你就不可能獲取之前的數(shù)據(jù)了淘邻。

UUID是基于iOS設(shè)備上面某個(gè)單個(gè)的應(yīng)用程序茵典,只要用戶沒有完全刪除應(yīng)用程序,則這個(gè)UUID在用戶使用該應(yīng)用程序的時(shí)候一直保持不變宾舅。如果用戶刪除了這個(gè)應(yīng)用程序统阿,然后再重新安裝,那么這個(gè)UUID已經(jīng)發(fā)生了改變筹我。

2扶平,通過(guò)調(diào)用[[UIDevice currentDevice]identifierForVendor];方法可以獲取UUID。

此方法是官方6.0系統(tǒng)后推出的蔬蕊,指定唯一標(biāo)示符號(hào)结澄;不同軟件,不同機(jī)器岸夯,運(yùn)行的時(shí)候值都是不一樣的麻献;也就是說(shuō)可以滿足標(biāo)識(shí)唯一性。

但是有一個(gè)問題需要注意猜扮,大部分正版的手機(jī)在軟件卸載了勉吻、然后重新安裝的情況下還是會(huì)保持和原先保存同一個(gè)值。但是對(duì)于有些越獄或者美版的手機(jī) 在卸載后仍然會(huì)重新獲取數(shù)據(jù)旅赢。

3齿桃,Keychain方案

KeyChian 是保存在沙盒之外的存儲(chǔ)數(shù)據(jù),相當(dāng)于Dictionary, 所有應(yīng)用都可以獲取和保存煮盼,因此當(dāng)一個(gè)軟件卸載之后完全不影響里面的數(shù)據(jù)短纵,這樣當(dāng)軟件重新安裝之后,理所當(dāng)然的可以獲取里面的原數(shù)據(jù)僵控。

這里我用的還是別人封裝過(guò)的一些代碼SFHFKeychainUtils(可以在網(wǎng)上任意下載):

//保存數(shù)據(jù)

BOOL s = [SFHFKeychainUtils storeUsername:name andPassword:pswd forServiceName:server updateExisting:NO error:nil];

//獲取密碼

NSString * psw = [SFHFKeychainUtils getPasswordForUsername:name andServiceName:server error:nil];

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

蘋果推薦的就是使用IDFA香到、IDFV了,官方推薦那必然妥妥的了

idfa: 適用于對(duì)外:例如廣告推廣,換量等跨應(yīng)用的用戶追蹤等

idfv: 適用于對(duì)內(nèi):例如分析用戶在應(yīng)用內(nèi)的行為等

idfa:主要用于廣告养渴,可能會(huì)獲取不到,iOS用戶也可以 設(shè)置|隱私|廣告追蹤 里重置此id的值泛烙,雖然玩家一般不會(huì)重置理卑,但是上述理由已經(jīng)不足以把idfa作為賬號(hào)了

idfv:

顧名思義,是給Vendor標(biāo)識(shí)用戶用的蔽氨,每個(gè)設(shè)備在所屬同一個(gè)Vender的應(yīng)用里藐唠,都有相同的值。其中的Vender是指應(yīng)用提供商鹉究,但準(zhǔn)確點(diǎn)說(shuō)宇立,是通過(guò)BundleID的DNS反轉(zhuǎn)的前兩部分進(jìn)行匹配,如果相同就是同一個(gè)Vender自赔,例如對(duì)于com.somecompany.appone,com.somecompany.apptwo 這兩個(gè)BundleID來(lái)說(shuō)妈嘹,就屬于同一個(gè)Vender,共享同一個(gè)idfv的值绍妨。和idfa不同的是润脸,idfv的值是一定能取到的,所以非常適合于作為內(nèi)部用戶行為分析的主id他去,來(lái)標(biāo)識(shí)用戶毙驯,替代OpenUDID。

這里寫圖片描述

最終方案:

idfv + keychain

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

Vendor是CFBundleIdentifier(反轉(zhuǎn)DNS格式)的前兩部分灾测。來(lái)自同一個(gè)運(yùn)營(yíng)商的應(yīng)用運(yùn)行在同一個(gè)設(shè)備上爆价,此屬性的值是相同的;不同的運(yùn)營(yíng)商應(yīng)用運(yùn)行在同一個(gè)設(shè)備上值不同媳搪。

經(jīng)測(cè)試铭段,只要設(shè)備上有一個(gè)tencent的app,重新安裝后的identifierForVendor值不變蛾号,如果tencent的app全部刪除稠项,重新安裝后的identifierForVendor值改變。

但是很不幸鲜结,上面所有這些表示設(shè)備唯一號(hào)的標(biāo)識(shí)展运,在IOS7中要么被禁止使用,要么重新安裝程序后兩次獲取的標(biāo)識(shí)符不一樣精刷。

由于IOS系統(tǒng)存儲(chǔ)的數(shù)據(jù)都是在sandBox里面拗胜,一旦刪除App,sandBox也不復(fù)存在怒允。好在有一個(gè)例外埂软,那就是keychain(鑰匙串)。

通常情況下,IOS系統(tǒng)用NSUserDefaults存儲(chǔ)數(shù)據(jù)信息勘畔,但是對(duì)于一些私密信息所灸,比如密碼、證書等等炫七,就需要使用更為安全的keychain了爬立。

keychain里保存的信息不會(huì)因App被刪除而丟失。所以万哪,可以利用這個(gè)keychain這個(gè)特點(diǎn)來(lái)保存設(shè)備唯一標(biāo)識(shí)侠驯。

那么,如何在應(yīng)用里使用使用keyChain呢奕巍,我們需要導(dǎo)入Security.framework 吟策,keychain的操作接口聲明在頭文件SecItem.h里。

直接使用SecItem.h里方法操作keychain的止,需要寫的代碼較為復(fù)雜檩坚,我們可以使用已經(jīng)封裝好了的工具類KeychainItemWrapper來(lái)對(duì)keychain進(jìn)行操作。

KeychainItemWrapper是apple官方例子“GenericKeychain”里一個(gè)訪問keychain常用操作的封裝類诅福,在官網(wǎng)上下載了GenericKeychain項(xiàng)目后效床,

只需要把“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷貝到我們項(xiàng)目,并導(dǎo)入Security.framework 权谁。KeychainItemWrapper的用法:

/** 初始化一個(gè)保存用戶帳號(hào)的KeychainItemWrapper */

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number"

accessGroup:@"YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier"];

//保存數(shù)據(jù)

[wrapper setObject:@"<帳號(hào)>" forKey:(id)kSecAttrAccount];

[wrapper setObject:@"<帳號(hào)密碼>" forKey:(id)kSecValueData];

//從keychain里取出帳號(hào)密碼

NSString *password = [wrapper objectForKey:(id)kSecValueData];

//清空設(shè)置

[wrapper resetKeychainItem];

其中方法“- (void)setObject:(id)inObject forKey:(id)key;”里參數(shù)“forKey”的值應(yīng)該是Security.framework 里頭文件“SecItem.h”里定義好的key剩檀,用其他字符串做key程序會(huì)出錯(cuò)!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旺芽,一起剝皮案震驚了整個(gè)濱河市沪猴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌采章,老刑警劉巖运嗜,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異悯舟,居然都是意外死亡担租,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門抵怎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奋救,“玉大人,你說(shuō)我怎么就攤上這事反惕〕⑺遥” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵姿染,是天一觀的道長(zhǎng)背亥。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么狡汉? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任娄徊,我火速辦了婚禮,結(jié)果婚禮上盾戴,老公的妹妹穿的比我還像新娘嵌莉。我一直安慰自己,他們只是感情好捻脖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著中鼠,像睡著了一般可婶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上援雇,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天矛渴,我揣著相機(jī)與錄音,去河邊找鬼惫搏。 笑死具温,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的筐赔。 我是一名探鬼主播铣猩,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼茴丰!你這毒婦竟也來(lái)了达皿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贿肩,失蹤者是張志新(化名)和其女友劉穎峦椰,沒想到半個(gè)月后躬存,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體度硝,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宛篇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年察署,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屎暇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掸屡。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡圈澈,死狀恐怖痘昌,靈堂內(nèi)的尸體忽然破棺而出茂嗓,到底是詐尸還是另有隱情鹦蠕,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布在抛,位于F島的核電站钟病,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肠阱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一票唆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屹徘,春花似錦走趋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鉴吹,卻和暖如春姨伟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豆励。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工夺荒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人良蒸。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓技扼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嫩痰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剿吻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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