iOS上如何唯一識別裝置
前言
網上用UDID+iOS一搜索就是一大堆;大都由於時間久遠,或是寫文章的人不怎麼仔細,所以我自己實操並總結了下。基礎的知識就不說了,大家先去搜序下了解下大概。
先說下結論
有沒有可以獲取手機唯一標識的可靠方法 ?
答案是 ~沒有,真的沒有,不要費力去找了。但是有些相對穩定的方法。
怎樣算是個可靠的讀取方法?
1,即使我抹掉這個手機內容,重置這個手機。這個識別號就是不變。
2,這個手機上的所有App讀取的識別號都是同一個。
讀取方法
1,【不可用】早期蘋果自己提供了方法 [UIDevice currentDevice] uniqueIdentifier]
但是,早就被蘋果廢了,為了安全。
2,【不可用】後來還有人用獲取MAC 地址的方法,[self macAddress]
但是,也被蘋果廢了;這個函式現在只會返回02:00:00:00:00:00。人家蘋果也不是吃素的,怎麼可能給你們留下口子。
3,【不穩定,不建議使用】再後來有人想出了個法子:
生成一個唯一的隨機數,寫在系統貼上板裡;其他App從中讀取。這個法子的好處就是不依賴硬體id號,不容易被蘋果堵住。
後來這個專案作者沒有繼續維護,他也沒有說明原因。這就是著名的OpenUDID。實際上這個方案在去年坑了我一把,因為使用了這個工具導致我的App啟動慢2秒鐘。(OpenUDID,讓我的App啟動慢了2秒 )
實際上,這個方案已經不太穩定了。原因有,在最新iOS系統上,貼上板上的內容只能在同一個開發者賬號下進行共享。這個其實問題不大,反正不行就不行唄。主要問題在於,貼上板上內容在什麼情況下會被清除是不可預知的?雖然開發文件上說是,只要同個開發者的所有App被刪除後就會被刪除。我測試結果是,即使全部刪除,大概率沒有被清除。倒是在某次測試中,突然發現讀不到值了。stackoverflow上也有人反饋,貼上板內容清除的時機不可知。結論就是,大家不要再用OpenUDID這個方案了。
4,【有一定適用範圍】蘋果提供的vendor間可共享裝置id號
//作用域:可以在同個vendor App間共享。比方,Bundle Identifier只要是 com.zhitian.*開頭的App就算是同個vendor。不需要同個開發者賬號下。 //穩定性:刪除所有vendor App後再重灌,id會變化。 [[UIDevice currentDevice] identifierForVendor]
5,【慎用】蘋果提供的廣告識別號
//作用域:所有App共享同一個id //穩定性:使用者可以在 通用設定->隱私->廣告->重置廣告id [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]
同時使用者也可以在隱私設定裡“限制廣告追蹤”。另外我也沒有實測過,蘋果對此稽核是否非常嚴格。
6,【有一定適用範圍】FCUUID提供的keychain方案,儲存在keychain中。
//https://github.com/fabiocaccamo/FCUUID //作用域:可在同個開發者賬號下,同個App group間進行共享 //穩定性:抹掉整個手機內容後,才會變化 NSLog(@"FCUUID : %@",[FCUUID uuidForDevice]);
實際上FCUUID是個所有方案的大綜合,裡面也提供對於第4,第5種方案的呼叫方法。
而且,FCUUID還使用iCloud機制進行輔助,提供甄別的精度。
如何挑選方案
到這裡大家應該可以理解我說,只有相對穩定的方案的意思了吧。其實可選用的方案也就方法4,5,6。如何挑選看自己需求。
我提供幾個思路:
需求1:實現使用者沒有登入的情況下,也能收藏帖子;如果使用者登入後,把之前收藏的帖子轉到他名下。
對應方案:其實用最簡單的方法4就可以了。
需求2:新裝使用者,給予一定貼補;
對應方案:方案6最為適用。如果發現一個使用者裝置號相同,或手機號相同,就認為是一個老使用者,沒有貼補和獎勵。這樣可以防止某些職業薅羊毛者,用一臺手機換不同卡號。當然他還是可以通過抹掉手機內容後再插新卡的方法,這就增加了他的時間成本。即使這樣我們還是沒辦法避免如圖情況:
需求3:甄別不同使用者+不同裝置,方便除錯和統計
對應方案:方案5就可以了。很少有人會去關閉這個選項。
下面要做的:
1,FCUUID是如何使用iCloud機制,又可以達到什麼目標?
2,iOS 11開始出現了DeviceCheck,瞭解其用法。
在分享和交流中成長,歡迎找我交流