[iOS 開發(fā)] 如何獲取設(shè)備唯一標(biāo)識(shí)?以及多個(gè)App間如何共享同一個(gè)設(shè)備唯一標(biāo)識(shí)?

更新2016.12.31:最近發(fā)現(xiàn)項(xiàng)目中用的OpenUDID 會(huì)導(dǎo)致應(yīng)用崩潰,已更換為 FCUUID,需要注意的是,原來 OpenUDID 記錄的設(shè)備 id (40位)是不能直接遷移到 FCUUID 的,盡管 FCUUID 提供了這樣的接口,因?yàn)?OpenUDID 保存的設(shè)備 id 并不是直接來自系統(tǒng)的 UUID,而是經(jīng)過OpenUDID 處理過的,所以不符合 FCUUID 中對(duì) UUID 校驗(yàn)的規(guī)則(32位或者36位)。因此如果你想繼續(xù)使用原來的設(shè)備 id,就需要自己使用存到 KeyChain 里面了。

最近公司項(xiàng)目有一個(gè)針對(duì)新用戶的需求,對(duì)新用戶的篩選條件是新賬號(hào)&&新設(shè)備?YES:NO。煩人的問題就是這個(gè)對(duì)于新設(shè)備的判斷了,相比輕松就能搞定的android開發(fā)者來說,iOS開發(fā)者真是有苦難言,誰(shuí)讓蘋果公司真是時(shí)刻不忘一切為了用戶啊——從2013年5月1日起,你再想直接拿用戶設(shè)備的UDID?沒門!
獲取設(shè)備唯一標(biāo)識(shí)符本來就不易,但是考慮到我司的兩款app有可能同時(shí)上新用戶活動(dòng),那就還得想辦法保證同一設(shè)備上兩款不同app獲取到的標(biāo)識(shí)是相同的,我滴個(gè)親娘啊……

那怎么辦呢?當(dāng)然百度啊!找來找去,找到兩個(gè)解決方案:OpenUDID框架和FCUUID框架。這兩個(gè)框架都是采用“一次性創(chuàng)建CFUUID+持久性存儲(chǔ)”的策略來實(shí)現(xiàn)山寨版的UDID的。(ps:這些造輪子的人真是牛x!感謝他們?yōu)槲覀儚V大碼農(nóng)提供便利!)

  • OpenUDID

問題一:現(xiàn)在還能用OpenUDID嗎?
OpenUDID的作者已經(jīng)在github上注明了[OpenUDID IS NOW DEPRECATED],時(shí)間是June 7 2013,并且作者還特別提醒我們?cè)谑褂弥昂煤米x一下這篇博客 UDID is dead, OpenUDID is deprecated, long live advertisingIdentifier!。究竟為甚么被廢棄了,我也是一頭霧水,我司兩款產(chǎn)品都一直在使用OpenUDID來作埋點(diǎn)統(tǒng)計(jì),而且我自己也用真機(jī)測(cè)試過了,并沒有發(fā)現(xiàn)什么未知異常。對(duì)此,github上也有人在2014年時(shí)提出了issue-Why deprecate OpenUDID ? #59,but...,沒有人給出合理的解釋。從github上的issue來看,使用者碰到的問題不少。知乎上一位使用OPenUDID的網(wǎng)友也聲稱遇到過不同設(shè)備的OpenUDID值相同的問題:不同設(shè)備的OpenUDID有可能重復(fù)嗎?

問題二:怎么用OpenUDID來實(shí)現(xiàn)我們的需求?
OpenUDID的原理是用UIPasteboard來保存CFUUID,在iOS7以前,所有應(yīng)用都可以訪問同一個(gè)剪切板上存儲(chǔ)的內(nèi)容,但是iOS7以后只允許使用相同team ID的apps才能共享同一個(gè)剪切板上的數(shù)據(jù)。OpenUDID采用+ pasteboardWithName: create:方法來獲取剪切板中的值,根據(jù)蘋果的官方文檔,可以得知,該方法返回的pasteboard可以用來在一個(gè)app內(nèi)部或者兩個(gè)擁有相同的team ID的app之間傳遞數(shù)據(jù)。
我用自己的個(gè)人證書創(chuàng)建了兩個(gè)不同的app,這時(shí)就能滿足兩個(gè)不同的app擁有相同的team ID的條件了,連上iPhone5s分別運(yùn)行,結(jié)果顯示的是一樣的值,說明OpenUDID是暫時(shí)可行的。

UIPasteboard官方文檔.png
  • FCUUID
    問題一:FCUUID框架能滿足需求嗎?
    該框架誕生于2015年10月左右,其實(shí)現(xiàn)原理就是CFUUID+KeyChain,跟OpenUDID是差不多的,只是存儲(chǔ)方式不同,需要注意的是,F(xiàn)CUUID框架依賴于框架UICKeyChainStore,。
    作者在github上明確說明了使用該框架的條件(如圖所示),其中一條是:如果你想在不同的app間共享keychain中的數(shù)據(jù),就需要保證這兩個(gè)app有相同的bundle seed。那么什么是bundle seed呢?打開鑰匙串,找到你的證書,bundle seed就是你證書名后面括號(hào)內(nèi)的的10位編碼。所以呢,有相同的bundle seed就意味著是同一個(gè)證書發(fā)布的應(yīng)用。
FCUUID.png
Bundle seed.png

問題二:如何開啟keychain sharing?
參考這篇文章iOS Keychain: Sharing data between apps(實(shí)際操作步驟不完全相同)。首先保證兩個(gè)app都是由同一證書創(chuàng)建的-->點(diǎn)擊capabilities-->打開keychain sharing-->Xcode會(huì)自動(dòng)幫你生成entitlements文件-->分別在兩個(gè)不同的項(xiàng)目中的keychain sharing中添加對(duì)方的bundle identifier-->顯示兩個(gè)勾選狀態(tài)-->大功告成。通過真機(jī)測(cè)試,證實(shí)該方案可行。

綜上,實(shí)際上獲取“山寨UDID”的關(guān)鍵在于存儲(chǔ)。而想要實(shí)現(xiàn)應(yīng)用間共享數(shù)據(jù)的最關(guān)鍵之處在于是否是同一證書下管理的app。


參考文獻(xiàn)

1.iOS唯一標(biāo)示符引導(dǎo):
http://www.cocoachina.com/ios/20130422/6040.html

2.iOS平臺(tái)UDID方案比較:
http://www.cocoachina.com/ios/20130715/6597.html

3.KeyChain保存和獲取應(yīng)用的UDID:
http://blog.csdn.net/teng_ontheway/article/details/50200491

4.iOS7時(shí)代我們用什么來追蹤和識(shí)別用戶:
http://www.cnblogs.com/BigPolarBear/p/3359526.html

5.iOS的UDID廢用以及UUID配合keychain的替換方案實(shí)現(xiàn):
http://blog.k-res.net/archives/1081.html

6.iOS設(shè)備唯一標(biāo)識(shí)探討:
http://www.lxweimin.com/p/b83b0240bd0e

相關(guān)開源框架
1.OpenUDID(簡(jiǎn)單易用,但在iOS7以后有局限性,只做參考):
https://github.com/ylechelle/OpenUDID

2.FCUUID(功能強(qiáng)大,但需設(shè)置iCloud / Key-value storage和KeyChain sharing):
https://github.com/fabiocaccamo/FCUUID

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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