ios裝置唯一標識獲取策略

2021-08-27 14:26:05 字數 3743 閱讀 3198

翻譯:從ios7及更高版本往後,如果你向ios裝置請求獲取mac位址,系統將返回乙個固定值「02:00:00:00:00:00」,如果你需要識別裝置的 唯一性,請使用uidevice的identifierforvendor屬性。(因廣告目的而需要識別裝置的應用,請考慮使用 asidentifiermanager的advertisingidentifier屬性作為替代)

這個mac位址是指什麼?有什麼用?

mac(medium/media access control)位址,用來表示網際網路上每乙個站點的識別符號,採用十六進製制數表示,共六個位元組(48位)。其中,前三個位元組是由ieee的註冊管理機構 ra負責給不同廠家分配的**(高位24位),也稱為「編制上唯一的識別符號」 (organizationally unique identifier),後三個位元組(低位24位)由各廠家自行指派給生產的介面卡介面,稱為擴充套件識別符號(唯一性)。

mac位址在網路上用來區分裝置的唯一性,接入網路的裝置都有乙個mac位址,他們肯定都是不同的,是唯一的。一部iphone上可能有多個mac位址,包括wifi的、sim的等,但是itouch和ipad上就有乙個wifi的,因此只需獲取wifi的mac位址就好了,也就是en0的位址。

1、直接使用「mac address」

2、使用「md5(mac address)」

3、使用「md5(mac address+bundle_id)」獲得「機器+應用」的唯一標識(bundle_id 是應用的唯一標識)

在ios系統中,獲取裝置唯一標識的方法有很多:

一.udid(unique device identifier)

二.uuid(universally unique identifier)

三.mac address

四.open udid

五.廣告標示符(idfa-identifierforidentifier)

六.vindor標示符 (idfv-identifierforvendor)

七.推送token+bundle_id

udid的全稱是unique device identifier,它就是蘋果ios裝置的唯一識別碼,它由40個字元的字母和數字組成(越獄的裝置通過某些工具可以改變裝置的udid)。流動網路可利用udid來識別移動裝置,但是,從ios5.0(2023年8月份)開始,蘋果宣布將不再支援用uniqueidentifier方法獲取裝置的udid,ios5以下是可以用的。在2023年3月21日蘋果已經通知開發者:從2023年5月1日起,訪問uidids的程式將不再被審核通過,替代的方案是開發者應該使用「在ios 6中介紹的vendor或advertising標示符」。所以udid是絕對不能用啦。

open udid,沒有用到mac位址,同時能保證同一臺裝置上的不同應用使用同乙個openudid,只要使用者裝置上有乙個使用了openudid的應用存在時,其他後續安裝的應用如果獲取openudid,都將會獲得第乙個應用生成的那個。但是根據貢獻者的**和方法,和一些開發者的經驗,如果把使用了openudid方案的應用全部都刪除,再重新獲取openudid,此時的openudid就跟以前的不一樣。可見,這種方法還是不保險。

廣告標示符,是ios 6中另外乙個新的方法,提供了乙個方法advertisingidentifier,通過呼叫該方法會返回乙個nsuuid例項,最後可以獲得乙個uuid,由系統儲存著的。不過即使這是由系統儲存的,但是有幾種情況下,會重新生成廣告標示符。如果使用者完全重置系統((設定程式 -> 通用 -> 還原 -> 還原位置與隱私) ,這個廣告標示符會重新生成。另外如果使用者明確的還原廣告(設定程式-> 通用 -> 關於本機 -> 廣告 -> 還原廣告標示符) ,那麼廣告標示符也會重新生成。關於廣告標示符的還原,有一點需要注意:如果程式在後台執行,此時使用者「還原廣告標示符」,然後再回到程式中,此時獲取廣 告標示符並不會立即獲得還原後的標示符。必須要終止程式,然後再重新啟動程式,才能獲得還原後的廣告標示符。

vindor標示符,也是在ios 6中新增的,跟advertisingidentifier一樣,該方法返回的是乙個 nsuuid物件,可以獲得乙個uuid。如果滿足條件「相同的乙個程式裡面-相同的vindor-相同的裝置」,那麼獲取到的這個屬性值就不會變。如果是「相同的程式-相同的裝置-不同的vindor,或者是相同的程式-不同的裝置-無論是否相同的vindor」這樣的情況,那麼這個值是不會相同的。

推送token+bundle_id的方法:

1、應用中增加推送用來獲取token

2、獲取應用bundle_id

3、根據token+bundle_id進行雜湊運算

uuid是universally unique identifier的縮寫,中文意思是通用唯一識別碼。它是讓分布式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過**控制端來做辨識資訊的指定。這樣,每個人都可以建立不與其它人衝突的 uuid。在此情況下,就不需考慮資料庫建立時的名稱重複問題。蘋果公司建議使用uuid為應用生成唯一標識字串。

ios中獲取uuid的**如下: 

-(nsstring*) uuid

ios中獲取網絡卡mac的**如下:

#include // per msqr

#include #include #include #pragma mark mac addy

// return the local mac addy

// courtesy of freebsd hackers email list

// accidentally munged during previous update. fixed thanks to mlamb.

- (nsstring *) macaddress

if (sysctl(mib, 6, null, &len, null, 0) < 0)

if ((buf = malloc(len)) == null)

if (sysctl(mib, 6, buf, &len, null, 0) < 0)

ifm = (struct if_msghdr *)buf;

sdl = (struct sockaddr_dl *)(ifm + 1);

ptr = (unsigned char *)lladdr(sdl);

// nsstring *outstring = [nsstring stringwithformat:@"%02x:%02x:%02x:%02x:%02x:%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];

nsstring *outstring = [nsstring stringwithformat:@"%02x%02x%02x%02x%02x%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];

free(buf);

return [outstring uppercasestring];

}

開發者可以在應用第一次啟動時呼叫一 次,然後將該串儲存起來,以便以後替代udid來使用。但是,如果使用者刪除該應用再次安裝時,又會生成新的字串,所以不能保證唯一識別該裝置。這就需要各路高手想出各種解決方案。所以,之前很多應用就採用mac address。但是現在如果使用者公升級到ios7(及其以後的蘋果系統)後,他們機子的mac address就是一樣的,沒辦法做區分,只能棄用此方法,重新使用uuid來標識。如果使用uuid,就要考慮應用被刪除後再重新安裝時的處理。

乙個解決的辦法是:uuid一般只生成一次,儲存在ios系統裡面,如果應用刪除了,重灌應用之後它的uuid還是一樣的,除非系統重置 。但是不能保證在以後的系統公升級後還能用(如果系統儲存了該資訊就能用).

IOS獲取裝置唯一標識

wwdc 2013已經閉幕,ios7 beta隨即發布,介面之難看無以言表.簡直就是山寨android。更讓ios程式猿悲催的是,裝置唯一標識的mac address在ios7中也失效了。ios系統中,獲取裝置唯一標識的方法有很多 一.udid unique device identifier ud...

獲取iOS裝置唯一標識

1.已禁用 uidevice uniqueidentifier 3.mac位址不能再用來設別裝置 還有乙個生成ios裝置唯一標示符的方法是使用ios裝置的media access control mac 位址。乙個mac位址是乙個唯一的號碼,它是物理網路層級方面分配給網路介面卡的。這個位址蘋果還有其...

iOS獲取裝置唯一標識

目前市面應用普遍採用使用者體驗,涉及到部分重要功能時候才提醒使用者註冊賬戶,而使用者之前的操作,比如收藏,點讚,關注等內容需要同時關聯進註冊的賬戶,那麼根據什麼記錄使用者的操作資訊就尤為重要。下面就列出我之前收集資料總結的方案。udid unique device identifier ios 裝置...