最近有一個需求是要獲取設備的唯一標識,并在不同的應用中共享(或者是只獲取設備的唯一標識)鸵膏,并且開發(fā)者賬號還不一樣。目前為止沒找到可行的辦法怎炊,做了一大堆測試谭企,分享出來廓译。
1.同一個開發(fā)者賬號下。
在a應用下存儲數(shù)據(jù)债查。在b應用下可以拿到數(shù)據(jù)非区。
A9X5YRY6K2.keychain.test 前面的A9X5YRY6K2這段標識是相同的。在同一個開發(fā)者賬號下盹廷。不管征绸。.keychain.test后面這塊是否相同,都可以拿到俄占。
比如:keychain.test
test.fmdb-tools
133AF0CA-600A-4BAB-AC64-C4C780A5C437.png
5979C9F8-2082-4940-92F0-B4100B550ECE.png
2.在不同的開發(fā)者賬號下
keychain Groups不變.
{
acct = xxxxxxx;
agrp = "NLQUF9KEG2.keychain.test";
cdat = "2017-11-01 04:03:55 +0000";
mdat = "2017-11-01 04:03:55 +0000";
musr = <>;
pdmn = ak;
persistref = <>;
sha1 = <0d0df982 3c38bba7 55007d0b 4b0e4d51 63bc23ae>;
svce = xiaoxinyong;
sync = 0;
tomb = 0;
}
B應用拿不到a應用換了開發(fā)者賬號保存的數(shù)據(jù)管怠。 拿到的是上次保存的數(shù)據(jù)。
{
acct = xxxxx;
agrp = "A9X5YRY6K2.keychain.test";
cdat = "2017-11-01 03:58:16 +0000";
mdat = "2017-11-01 03:58:16 +0000";
musr = <>;
pdmn = ak;
persistref = <>;
sha1 = <97fc0e76 51f27d7a d2cb60b6 0a8b780f 3b036437>;
svce = xiaoxinyong;
sync = 0;
tomb = 0;
}
133AF0CA-600A-4BAB-AC64-C4C780A5C437.png
第二波測試
關于idfv的
同一個開發(fā)者賬號 下三個應用
1. bundle id xin.test idfv 46CC9F88-6474-4733-A410-DEEB58B1AB59
2 .bundle id test.fmdb-tools idfv 59E56353-AE10-434B-867D-3A26D2875A34
3. bundle id xin.fmdb-tools idfv 46CC9F88-6474-4733-A410-DEEB58B1AB59
不同的開發(fā)者賬號下 三個應用
1. bundle id xin.test idfv B8E18B1C-0EC3-44B8-B076-1EF87B5A4294
2 .bundle id test.fmdb-tools idfv B8E18B1C-0EC3-44B8-B076-1EF87B5A4294
3. bundle id xin.fmdb-tools idfv B8E18B1C-0EC3-44B8-B076-1EF87B5A4294
把2應用刪除掉重新安裝 idfv 3E32766A-563D-4F33-85CA-AFCC9E20C7AE
把3應用刪除重新安裝 idfv DCB69B6B-C0BB-4FD2-A5DE-51F6B4B1C553
把1 缸榄。渤弛。。甚带。 idfv DCB69B6B-C0BB-4FD2-A5DE-51F6B4B1C553
得出結論她肯,不管單獨刪除 xin.test還是單獨刪除xin.fmdb-tools,都不會變鹰贵。
只有當兩個都刪除才會發(fā)生變化晴氨。也就是說只有前面的xin這塊發(fā)生變化,或者是手機中沒有xin標識的app才會發(fā)生變化碉输。不管開發(fā)者賬號是否發(fā)生變化籽前。
新一輪的思考。
uuid雖然是唯一的敷钾,但是不同的開發(fā)者賬號下的keychain是沒有辦法分享的
idfv雖然前面的標識符一樣的情況下聚假,是相同的,但是在app全部卸載的情況下也是會發(fā)生變化的闰非。
idfv放到keychain中膘格。??還是沒想到解決辦法。
#import <AdSupport/AdSupport.h>
NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
每個設備只有一個IDFA财松,不同APP在同一設備上獲取IDFA的結果是一樣的
設備重啟不會產生新的IDFA
但IDFA存在重新生成的情況:
用戶完全重置系統(tǒng)(設置程序 -> 通用 -> 還原 -> 還原位置與隱私)
用戶明確還原廣告(設置程序-> 通用 -> 關于本機 -> 廣告 -> 還原廣告標示符)
限制了廣告追蹤則會變?yōu)?00-00000000-0000.
可以放到keychain中瘪贱。目測可行。辆毡。菜秦。
2020.11.22 更新
上面idfa的解決方案其實不不完美的,如果用戶限制了廣告標識符怎么辦舶掖?
那么我們拿到的只就會變成000-00000000-0000球昨。
其實可以用simulateIDFA.地址
如果我們取到的idfa為000-00000000-0000。那么我們可以先把這串數(shù)字進行MD5編碼眨攘,得到一個唯一的字符串主慰,如果等于這個字符串的時候嚣州,那么我們就用simulateidfa重新生成一個唯一標識符。
下面的內容是simulateidfa里實現(xiàn)共螺,具體的可以去github上去查看该肴。
生成的MD5值分兩部分。
以 626363D0-90D4-06BF-C281-384E4E69D3E2 為例:
前16位626363D0-90D4-06BF是由比較穩(wěn)定的參數(shù)組合獲得,這前16位只有在系統(tǒng)升級的情況下才會變藐不。
后16位C281-384E4E69D3E2 由 一些比較容易被改變的參數(shù)組合生成匀哄,比較常見的值變化情況是系統(tǒng)重新啟動。
參與前16位計算的參數(shù)有:
系統(tǒng)版本(9.3.2)雏蛮、硬件信息(N53AP,iPhone6,2,中國移動46002,1048576000)涎嚼、coreServices文件創(chuàng)建更新時間(2015-08-07 23:53:00 +0000,2016-06-07 23:53:09 +0000),系統(tǒng)容量(12266725376)
這里有一些信息是升級的時候會變的,系統(tǒng)版本挑秉、coreServices文件創(chuàng)建更新時間法梯、系統(tǒng)容量
參與后16位計算的參數(shù)有:
系統(tǒng)開機時間(1473301191去掉后面的4位數(shù) 147330)、國家代碼(CN)衷模、本地語言(zh-Hans-CN)鹊汛、設備名稱(XXXX)
image.png