有時候,我們需要記錄一下設備的唯一標識,比如標識這個設備是不是已經發過促銷券了或者是否下載試用過app等等。最簡單 的方法就是獲取設備的UDID#[UIDevice currentDevice] uniqueIdentifier]#,但是iOS6之后蘋果擔心泄露用戶信息就封掉了這個方法,后來也可以通過mac地址來標記唯一標識#[self macAddress]#,但是沒過多久也同樣被封掉了。那么現在該通過什么方式來獲取唯一標識呢?
DeviceCheck
iOS11之后可以通過DeviceChek(設備檢查)來記錄設備的標識,這個是Apple官方在iOS11新提供的一個API,可以用來獲取當前設備在某個服務器中的狀態。
DeviceCheck 允許開發者通過開發者自己的服務器與 Apple 服務器通訊,並為單個設備設置兩個 bit 的數據。
簡單說,你在設備上用 DeviceCheck API 生成一個 token,然后將這個 token 發給自己的服務器,再由自己的服務器與 Apple 的 API 進行通訊,來更新或者查詢該設備的值。這兩個 bit 的數據用來追蹤用戶比如是否已經領取獎勵這類信息。
DeviceCheck可以幫助軟件開發者們准確記錄 iPhone 的 4 種運行狀態。比如,某 iPhone 手機在某一個月里免費試使用了一應用軟件,這一期間內,“設備檢查(DeviceCheck)”將手機狀態記錄為“狀態 A ”。試用期之后,用戶停止該免費軟件的使用,“設備檢查(DeviceCheck)”會將此時的設備情況記錄為“狀態 B ”。在此之前,如果只是將這個標識卸載app的沙盒內,只要用戶對 iPhone 進行軟件刪除或初始化操作后,該狀態下的手機數據會被系統盡數刪除,當再次使用該軟件時,手機將顯示為初次使用的試用期狀態。所以開發是沒有辦法去真正記錄這個狀態的。而DeviceCheck是將這個標識放到了apple服務器,即使對手機進行刪除軟件,或初始化操作,設備檢查DeviceCheck程序都可以通過連接 Apple 服務器來檢查手機的各種狀態數據。所以可以很好的解決這個問題,從而避免手機陷入再次試用軟件的麻煩中。
但是,在二手的 iPhone 手機中卻再次產生問題。無論初次使用的是何種軟件,免費試用階段結束后、僅限新用戶享用的優惠條款將無法供手機的新主人再次使用。即使對 iPhone 進行初始化操作,手機也會默認保存各項數據,轉讓與出售並不會改變 iPhone 的使用狀態。
FCUUID
我們通過DeviceCheck可以很好的記錄下設備唯一標識符,但是這只能局限於iOS11之后,這明顯是不夠的。那么還有什么辦法標記嗎?可以通過FCUUID。
FCUUID是通過將特定的標識符保存在keychain(鑰匙串)來實現的,所以當用戶抹掉整個手機的內容時,這個唯一標識也會發生變動,但這也可以滿足大部分app的使用場景了。同時FCUUID可在同個開發者賬號下,同個App group間進行共享,即同一個appGroup下的不同app可以獲取到同一個標識符。另外FCUUID也能使用iCloud機制進行輔助,提供甄別的精度。
使用方法詳見github,下面是它提供的一些方法:
// 每次運行應用都會變 +(NSString *)uuid; //changes each time (no persistent), but allows to keep in memory more temporary uuids +(NSString *)uuidForKey:(id<NSCopying>)key; // 每次運行應用都會變 +(NSString *)uuidForSession; // 重新安裝的時候會變 +(NSString *)uuidForInstallation; // 卸載后重裝會變 +(NSString *)uuidForVendor; // 抹掉iPhone的時候才會變,適合做唯一標識 +(NSString *)uuidForDevice;
廣告標識符【慎用】
除了上面兩個方法外,也可以通過廣告標識符來實現標記設備。但是如果使用廣告標識符,則需要在上架審核的時候在相關廣告標識符的問題中如實回答,否則可能會導致app審核被拒。
作用域:所有App共享同一個標識符,即設備上所有的app獲取的廣告標識符為同一個。
[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
而且在使用中,也有兩個問題需要注意,一個是用戶可以在 通用設置->隱私->廣告->重置廣告id,這就導致了廣告標識符發生了變化,而第二個就是可能會有用戶在隱私設置里“限制廣告追蹤”,這就導致了廣告標識符被禁掉了,所以需要注意一下。