在移動(dòng)數(shù)字廣告領(lǐng)域锚沸,設(shè)備ID是用來(lái)追蹤用戶行為的最重要的標(biāo)識(shí)跋选。
對(duì)于開(kāi)發(fā)者而言,設(shè)備ID的穩(wěn)定性(尤其對(duì)于開(kāi)放的安卓系統(tǒng)來(lái)說(shuō))以及統(tǒng)計(jì)分析和業(yè)務(wù)應(yīng)用(變現(xiàn)和追蹤等)扮演了非常關(guān)鍵的角色哗蜈。
作為一個(gè)膚淺的產(chǎn)品經(jīng)理前标,我們這次主要介紹的設(shè)備ID包括:IMEI,MAC,IDFA,Android ID距潘,OAID炼列,UUID,openUDID音比,GAID俭尖,Serial Number等這些無(wú)論是國(guó)內(nèi)和海外比較主流的移動(dòng)設(shè)備的唯一標(biāo)識(shí)碼或曾扮演重要角色的設(shè)備ID。
知道什么是設(shè)備ID不是最重要的洞翩,重要的是應(yīng)用的場(chǎng)景稽犁,應(yīng)用目的,以及如何應(yīng)用骚亿,所以這次已亥,我把設(shè)備ID分成國(guó)外主流和國(guó)內(nèi)主流使用的場(chǎng)景,來(lái)分別介紹来屠。
一虑椎、什么是設(shè)備ID震鹉?
設(shè)備ID是唯一的匿名標(biāo)識(shí)符,由與單個(gè)特定移動(dòng)設(shè)備或用戶相對(duì)應(yīng)的數(shù)字和字母組成捆姜。
全球所有智能手機(jī)和平板電腦都有唯一的設(shè)備ID传趾,該ID直接存儲(chǔ)在移動(dòng)設(shè)備本身上。
設(shè)備ID可以通過(guò)任何已安裝的應(yīng)用程序檢索娇未,并用于準(zhǔn)確衡量單個(gè)用戶采取的操作墨缘,即用于統(tǒng)計(jì)。
設(shè)備ID在用戶旅程和體驗(yàn)的所有階段都發(fā)揮著重要作用零抬,包括安裝歸因镊讼,應(yīng)用內(nèi)個(gè)性化,受眾群體細(xì)分和整體應(yīng)用性能平夜。
二蝶棋、海外的主流設(shè)備ID
海外的設(shè)備ID比較統(tǒng)一,無(wú)論是programmatic advertising市場(chǎng)還是performance advertising市場(chǎng)忽妒,無(wú)論目的是targeting audience還是tracking user的后續(xù)行為和效果玩裙,都是這個(gè)標(biāo)準(zhǔn)的。
Android – Google廣告ID(GAID):Google Advertising ID是由Google Play服務(wù)提供的用戶可重置的唯一廣告ID段直。
iOS –廣告商身份(IDFA):Identifier For Advertising吃溅,iOS獨(dú)有的廣告標(biāo)識(shí)符。
要么是傳了以上的兩種設(shè)備ID根據(jù)響應(yīng)的設(shè)備類型鸯檬,要么是不傳决侈,也就是為空,再或者喧务,是因?yàn)橛脩暨x擇了don't track而展示的以0填充的設(shè)備ID(當(dāng)然也有可能是假量導(dǎo)致的赖歌,各種各樣的fraud花樣,我們可以有時(shí)間再單獨(dú)聊)功茴。
三庐冯、國(guó)內(nèi)設(shè)備ID的應(yīng)用現(xiàn)狀
國(guó)內(nèi)的設(shè)備ID可以說(shuō)五花八門,因?yàn)槊襟w傳的各式各樣坎穿,至今也沒(méi)有一個(gè)統(tǒng)一的機(jī)構(gòu)對(duì)設(shè)備ID進(jìn)行規(guī)范展父。
總體上,國(guó)內(nèi)的廣告主偏向使用硬件地址或者穩(wěn)定不變且不會(huì)被重置的設(shè)備ID玲昧。我們可以按照設(shè)備ID被在線廣告市場(chǎng)接受程度(唯一性和穩(wěn)定性)去對(duì)市面上的設(shè)備ID排個(gè)優(yōu)先級(jí)犯祠。
Android:
IMEI:International Mobile Equipment Identity,國(guó)際移動(dòng)設(shè)備身份碼的縮寫酌呆。是由15位數(shù)字組成的“電子串號(hào)”衡载,它與每臺(tái)手機(jī)一一對(duì)應(yīng),每個(gè)IMEI在世界上都是唯一的隙袁。
MAC地址:硬件標(biāo)識(shí)符痰娱,包括WiFi mac地址和藍(lán)牙m(xù)ac地址弃榨。Android 6.0之后被禁止。被禁止后開(kāi)發(fā)者在APP端收集到的mac是亂碼或者02:00:00:00:00類似樣式的數(shù)據(jù)梨睁。
當(dāng)然這個(gè)Mac地址可能會(huì)被不法分子通過(guò)線下收集處在打開(kāi)WiFi情況下被探針的方式收集鲸睛,然后匹配數(shù)據(jù)庫(kù)里的IMEI甚至手機(jī)號(hào)等個(gè)人信息,所以通過(guò)WIFI上網(wǎng)或WIFI AP探針SSID廣播都可以獲取到MAC地址坡贺。
Android ID是每一個(gè)新設(shè)備系統(tǒng)都會(huì)隨機(jī)的分配一個(gè)Andriod_ID官辈,為64位數(shù)字。如果將設(shè)備恢復(fù)出廠設(shè)置遍坟、刷機(jī)拳亿,則會(huì)生成一個(gè)新的ID。通過(guò)Settings.Secure.ANDROID_ID獲取.
OAID: Open Anonymous Device Identifier, 由中國(guó)移動(dòng)安全聯(lián)盟(MSA)最近開(kāi)發(fā)愿伴,它代替了中國(guó)不受支持的Google Advertising ID肺魁,并取代了目前為止使用的IMEI / MEID,但還沒(méi)有被廣泛應(yīng)用隔节,希望可以用OAID取代現(xiàn)有的硬件相關(guān)的設(shè)備ID鹅经,使安卓設(shè)備的設(shè)備ID可以統(tǒng)一。
與GAID是對(duì)應(yīng)的怎诫,所以可以重置OAID甚至完全禁用OAID瘾晃,這是國(guó)內(nèi)準(zhǔn)備邁向隱私保護(hù)的第一步。
OAID支持的終端范圍:
對(duì)于不支持的版本幻妓,按原有邏輯走蹦误。
iOS:
IDFA:Identifier For Advertising,是Apple分配給用戶設(shè)備的隨機(jī)設(shè)備標(biāo)識(shí)符涌哲。因?yàn)閕OS設(shè)備封閉性比較好胖缤,無(wú)法取得其他硬件標(biāo)識(shí)碼尚镰,所以這塊國(guó)內(nèi)國(guó)外都比較統(tǒng)一阀圾。
另外,國(guó)內(nèi)有很多做法是將一些獲取到的設(shè)備ID(IMEI,MAC等)做哈希狗唉,以表示我沒(méi)有獲取到用戶的隱私初烘,所以衍生出來(lái)了IMEI MD5,IMEI SHA-1,MAC MD5,甚至是IDFA MD5,在我看來(lái)分俯,就有點(diǎn)內(nèi)味兒了肾筐,你自己感受一下。
其他:
除了上面主流的這些缸剪,還有下面這些設(shè)備ID吗铐,對(duì)于我這樣付錢的PM來(lái)講,遇到的比較少杏节,不過(guò)我也羅列下唬渗,以免你碰到不認(rèn)識(shí)典阵。
UDID:原蘋果設(shè)備的唯一識(shí)別ID,它是40個(gè)字符組成镊逝。在IOS舊版本可以使用,但在IOS7.0以后版本蘋果停用了此ID,新版都無(wú)法獲取假颇。
IDFV :是蘋果設(shè)備給單個(gè)APP自身用于追蹤用戶的唯一ID蛾狗,這個(gè)IDFV在一個(gè)APP內(nèi)是唯一的,跨APP就不唯一了座菠,因此只能用于單個(gè)APP自身用于追蹤用戶行為狸眼。
UUID:Universally Unique Identifier,通用唯一識(shí)別碼辈灼。由于Andriod體系ID的復(fù)雜性份企,所以還有廠商會(huì)根據(jù)UUID生成標(biāo)準(zhǔn)在APP中生成UUID來(lái)使用,聽(tīng)說(shuō)微軟會(huì)用這個(gè)巡莹。
MEID:(Mobile Equipment Identifier) 移動(dòng)設(shè)備識(shí)別碼是CDMA手機(jī)的身份識(shí)別碼司志,也是每臺(tái)CDMA手機(jī)或通訊平板唯一的識(shí)別碼。
Device ID:可以用系統(tǒng)提供的TelephonyManager服務(wù)來(lái)獲取降宅,具有唯一性骂远。其中又包括IMEI 和 MEID/ESN。具有通話功能Android設(shè)備才有腰根,平板等設(shè)備沒(méi)有激才;
Serial Number:設(shè)備序列號(hào),通過(guò)android.os.Build.SERIAL獲得额嘿。不穩(wěn)定的唯一標(biāo)識(shí)瘸恼,依賴廠商的實(shí)現(xiàn)。
注:IMEI是聯(lián)通册养、移動(dòng)手機(jī)的標(biāo)識(shí)东帅,MEID是電信手機(jī)的標(biāo)識(shí),但實(shí)際上球拦,膚淺的小編并沒(méi)見(jiàn)過(guò)MEID靠闭,猜測(cè)可能是都傳在IMEI哈希過(guò)字段里了。
四坎炼、如何獲取設(shè)備ID
上面已經(jīng)說(shuō)過(guò)愧膀,設(shè)備ID主要用于統(tǒng)計(jì)數(shù)據(jù)和歸因,那么可能我們需要的設(shè)備ID需要具有唯一性和穩(wěn)定性谣光。
講一下國(guó)內(nèi)外主流的幾個(gè)設(shè)備ID的獲取方法:
GAID:
adb shell setprop log.tag v & adb shell stop & adb shell start
2.打開(kāi)get_gaid.bat文件。內(nèi)容如下:
adb logcat -s tag GAID
3.打開(kāi)核心即可獲取GAID```
OAID:
OAID的獲取其實(shí)在MSA的官網(wǎng)上根據(jù)官網(wǎng)的指導(dǎo)和郵件對(duì)方索取SDK就可以萄金,目前最新的版本是2020年2月6日 miit_mdid_sdk_1.0.13蟀悦,里面已經(jīng)非常詳細(xì)了碳柱。
1)下載:
http://www.msa-alliance.cn/col.jsp?id=120
2)安裝
把 miit_mdid_x.x.x.aar 拷貝到項(xiàng)的 libs 目錄,并設(shè)置依賴熬芜,其中 x.x.x 代表版本號(hào)莲镣。
將 supplierconfig.json 拷貝到項(xiàng)目 assets 目錄下,并修改里邊對(duì)應(yīng)內(nèi)容涎拉,特別是需要設(shè)置 appid 的部分瑞侮。需要設(shè)置 appid 的部分需要去對(duì)應(yīng)廠商的應(yīng)用商店里注冊(cè)自己的 app。
3)設(shè)置依賴鼓拧。
```implementation files(‘libs/miit_mdid_x.x.x.aar’)```
4)混淆設(shè)置半火。
```-keep class com.bun.miitmdid.core.** {*;}```
5)設(shè)置 gradle 編譯選項(xiàng),這塊可以根據(jù)自己對(duì)平臺(tái)的選擇進(jìn)行合理配置季俩。
```ndk {
abiFilters 'armeabi-v7a', 'x86', 'arm64-v8a', 'x86_64', 'armeabi'
}
packagingOptions {
doNotStrip "*/armeabi-v7a/*.so"
doNotStrip "*/x86/*.so"
doNotStrip "*/arm64-v8a/*.so"
doNotStrip "*/x86_64/*.so"
doNotStrip "armeabi.so"
}```
5)初始化钮糖。
```public class APP extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
JLibrary.InitEntry(base);
}
}```
6)設(shè)置回調(diào)
```public interface AppIdsUpdater {
void OnValidId(@NonNull JSONObject ids);
}```
7)設(shè)置調(diào)用類
```public class MiIdHelper implements IIdentifierListener {
private boolean isSupport;
private String oaid, vaid, aaid;
public JSONObject getDeviceIds(Context cxt) {
long startTime = System.currentTimeMillis();
int code = CallFromReflect(cxt);
long endTime = System.currentTimeMillis();
long time = endTime - startTime;
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("description", descriptionCode(code));
jsonObject.put("code", code);
jsonObject.put("time", time);
jsonObject.put("isSupport", isSupport);
jsonObject.put("oaid", oaid);
jsonObject.put("vaid", vaid);
jsonObject.put("aaid", aaid);
} catch (Exception e) {
e.printStackTrace();
}
return jsonObject;
}
private int CallFromReflect(Context cxt) {
return MdidSdkHelper.InitSdk(cxt, true, this);
}
@Override
public void OnSupport(boolean isSupport, IdSupplier _supplier) {
this.isSupport = isSupport;
if (_supplier != null) {
this.oaid = _supplier.getOAID();
this.vaid = _supplier.getVAID();
this.aaid = _supplier.getAAID();
_supplier.shutDown();
}
}
private String descriptionCode(int code) {
switch (code) {
case ErrorCode.INIT_ERROR_DEVICE_NOSUPPORT:
return "DEVICE_NOSUPPORT";
case ErrorCode.INIT_ERROR_LOAD_CONFIGFILE:
return "LOAD_CONFIGFILE";
case ErrorCode.INIT_ERROR_MANUFACTURER_NOSUPPORT:
return "MANUFACTURER_NOSUPPORT";
case ErrorCode.INIT_ERROR_RESULT_DELAY:
return "RESULT_DELAY";
case ErrorCode.INIT_HELPER_CALL_ERROR:
return "HELPER_CALL_ERROR";
default:
return "SUCCESS";
}
}
}```
8)獲取OAID
``` MiIdHelper miIdHelper = new MiIdHelper();
JSONObject result=miIdHelper.getDeviceIds(getApplicationContext());```
9)效果展示
```{
"description":"SUCCESS",
"code":0,
"time":49,
"isSupport":true,
"oaid":"cf8cc008bb5adf96",
"vaid":"f8239c19f92836f1",
"aaid":"0115d997-c845-4e86-8fed-58c4fb246827"
}```
>來(lái)源:https://juejin.im/post/5df854745188251280061d3f
idfa:
``` #include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>
#import <AdSupport/AdSupport.h>
- (NSString *)zx_idfaString
{
NSBundle *adSupportBundle = [NSBundle bundleWithPath:@"/System/Library/Frameworks/AdSupport.framework"];
[adSupportBundle load];
if (adSupportBundle == nil)
{
return @"";
}
else
{
Class asIdentifierMClass = NSClassFromString(@"ASIdentifierManager");
if(asIdentifierMClass == nil){
return @"";
}
else
{
ASIdentifierManager *asIM = [[asIdentifierMClass alloc] init];
if (asIM == nil) {
return @"";
}
else{
if(asIM.advertisingTrackingEnabled)
{
return [asIM.advertisingIdentifier UUIDString];
}
}
}
}
}```
>來(lái)源:https://juejin.im/post/5bdbb926f265da391e58fa92
##總結(jié):
國(guó)內(nèi)設(shè)備ID統(tǒng)一任重而道遠(yuǎn);
國(guó)外用戶隱私倒是越來(lái)越嚴(yán)酌住。
無(wú)論是前些年實(shí)施的歐盟的'GDPR',還是加州的'CCPA','COPPA'店归,以及今年google逐步實(shí)施的三方cookie,可以說(shuō)都對(duì)對(duì)應(yīng)地區(qū)和用戶的用戶的隱私更加嚴(yán)格和個(gè)性化的保護(hù)酪我,反過(guò)來(lái)對(duì)在線廣告行業(yè)卻是一個(gè)挑戰(zhàn)消痛,行業(yè)需要升級(jí),所以總會(huì)找到兩者兼顧的方面去做改進(jìn)都哭。
也希望國(guó)內(nèi)的在線廣告的設(shè)備ID秩伞,包括OTT在內(nèi),逐漸走向在變現(xiàn)路上兼顧用戶隱私的正軌欺矫。
![image](https://upload-images.jianshu.io/upload_images/13766341-8ee60d86f2d6b265?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)