溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何用代碼分析活躍用戶數(shù)量減少的原因?

發(fā)布時(shí)間:2020-05-27 15:35:15 來(lái)源:億速云 閱讀:190 作者:鴿子 欄目:移動(dòng)開(kāi)發(fā)

最近有網(wǎng)友發(fā)現(xiàn)友盟的數(shù)據(jù)統(tǒng)計(jì)里面,活躍用戶的數(shù)量有點(diǎn)不大對(duì)勁,跟啟動(dòng)次數(shù)相比,嚴(yán)重偏少。sdk的使用方式?jīng)]啥好說(shuō)的,就那么簡(jiǎn)單幾步,應(yīng)該不會(huì)是sdk設(shè)置的問(wèn)題。于是就從友盟關(guān)于活躍用戶的定義開(kāi)始,著手分析這個(gè)問(wèn)題。

活躍用戶的定義:打開(kāi)應(yīng)用的用戶即為活躍用戶,不考慮用戶的使用情況。

從上面的文章,了解到Umeng里面對(duì)用戶的定義:友盟將一個(gè)獨(dú)立的設(shè)備視為一個(gè)用戶,然而每個(gè)獨(dú)立的用戶是通過(guò)UMID來(lái)進(jìn)行唯一標(biāo)識(shí)的。然而UMID又是神馬鬼東西?簡(jiǎn)單來(lái)說(shuō)就是友盟會(huì)在第一次安裝的時(shí)候生成一個(gè)UMID,當(dāng)ID生成以后友盟會(huì)盡量保證這個(gè)UMID不會(huì)發(fā)生變化。

在應(yīng)用對(duì)應(yīng)的存儲(chǔ)目錄下面,我們可以找到這個(gè)UMID的身影:

ngeIdentity.json這個(gè)文件來(lái)說(shuō),cat一下里面的內(nèi)容,應(yīng)該可以看到:

筆者發(fā)現(xiàn)公司里多臺(tái)設(shè)備的UMID都居然是一個(gè)相同的UMID值,WTF?。?!也同樣是上面這串神秘的代碼:528c8e6cd4a3c6598999a0e9df15ad32。

這個(gè)時(shí)候就需要查一下UMID的生成方式了,從上面那篇UMID方案解析的文章中,可以了解到Android系統(tǒng)中與UMID相關(guān)的幾個(gè)ID:imei、mac地址、android_id。有了這些關(guān)鍵點(diǎn),我們就可以開(kāi)始去反編譯友盟的sdk包并進(jìn)行下一步的搜索了(這里反編譯了友盟最新的jar包:umeng-analytics-v6.0.1.jar)。。。果然,使用上面這幾個(gè)關(guān)鍵字,很快就搜索到了一些關(guān)鍵的代碼:

段代碼邏輯比較簡(jiǎn)單(由于筆者所調(diào)試系統(tǒng)<23,故省略了一部分代碼),首先TelephonyManager.getDeviceId()獲取imei,若取不到則調(diào)用u(context)函數(shù)獲取下一個(gè)字符串,若再取不到,則獲取android_id。其實(shí)這里可以猜測(cè)到,u()中返回的字符串應(yīng)該就是mac地址,我們來(lái)看下函數(shù)u()的邏輯代碼:

果然,函數(shù)u(context)就是返回wifi的mac地址的。那么,回到剛剛的那個(gè)問(wèn)題,到底那串神秘的UMID是528c8e6cd4a3c6598999a0e9df15ad32根據(jù)啥來(lái)生成的?看著這格式有點(diǎn)像md5。然后把機(jī)器上的imei、mac地址、android_id都打印了出來(lái):

突然發(fā)現(xiàn)公司設(shè)備上打印出來(lái)的mac地址都是00:00:00:00:00:00(因?yàn)槟居衱ifi模塊,只有ethernet模塊,囧!?。。?,怒將其轉(zhuǎn)為md5,正是上面的串代碼。

可是,為啥當(dāng)mac地址是00:00:00:00:00:00的時(shí)候,不去選擇android_id呢?回去仔細(xì)看代碼,發(fā)現(xiàn)友盟用的是坑爹的TextUtils.isEmpty()來(lái)判斷mac地址的有效性,跪了,上面那串明明就是無(wú)效的mac地址好么?只能說(shuō)代碼寫(xiě)得不嚴(yán)謹(jǐn)。。。

至此,代碼及原因分析完畢。當(dāng)一些Android平板設(shè)備統(tǒng)一返回相同的mac地址,如00:00:00:00:00:00時(shí)(有可能是沒(méi)有wifi模塊;也有可能是山寨機(jī)出現(xiàn)這種情況的時(shí)候),友盟將會(huì)將其數(shù)據(jù)識(shí)別成同一用戶,并且將會(huì)造成嚴(yán)重的MAC地址漂移。

作為比較,我們來(lái)看一下友盟的競(jìng)爭(zhēng)對(duì)手shareinstall的渠道統(tǒng)計(jì)代碼!

首先,我們開(kāi)看看shareinstall的web集成步驟:

<!-- 建議直接引用下面的js鏈接,以便得到最及時(shí)的更新,我們將持續(xù)跟蹤各種主流瀏覽器的變化,為您提供最好的服務(wù)-->
<script type="text/javascript" src="//www.shareinstall.com/js/page/shareinstall.min.js"></script>
<script type="text/javascript">
//錯(cuò)誤處理:確保app始終能正常的安裝
var timer = setTimeout(
function() {
var button = document.getElementById("downloadButton");
button.style.visibility = "visible";
button.onclick = function() {
var ua = navigator.userAgent;
if (ua.indexOf(" MicroMessenger/") > -1) {
//微信中顯示遮罩提示在瀏覽器中打開(kāi)或進(jìn)入應(yīng)用寶
var div = document.createElement("div");
div.innerHTML = "<div style="font-size:2rem;color:#fff;text-align:center;"
+"position:fixed;left:0;top:0;background:rgba(0,0,0,0.5);filter:alpha(opacity=50);"
+"width:100%;height:100%;z-index:10000;">點(diǎn)擊右上角在瀏覽器中打開(kāi)</div>";
document.body.appendChild(div);
} else {
if (ua.indexOf("Android") > -1) {
//直接下載apk
//window.location="apk地址";
} else if (ua.indexOf("iPhone") > -1 || ua.indexOf("iPad") > -1
|| ua.indexOf("iPod") > -1) {
//直接進(jìn)入appstore
//window.location="appstore地址";
}
}
}
}, 5000);

//shareinstall初始化,初始化時(shí)將與shareinstall服務(wù)器交互,應(yīng)盡可能早的調(diào)用
/*web頁(yè)面向app傳遞的json數(shù)據(jù)(json string/js Object),應(yīng)用被拉起或是首次安裝時(shí),通過(guò)相應(yīng)的
 android/ios api可以獲取此數(shù)據(jù)*/
var data = ShareInstall.parseUrlParams();//shareinstall.js中提供的工具函數(shù),解析url中的所有查詢參數(shù)
new ShareInstall({
    appKey : 'F6BKAREBHF22EB',
    onready : function() {
        //shareinstall已成功回調(diào),清除定時(shí)器
        clearTimeout(timer);
        timer = null;

        var m = this, button = document.getElementById("downloadButton");
        button.style.visibility = "visible";

        /*用戶點(diǎn)擊某個(gè)按鈕時(shí)(假定按鈕id為downloadButton),安裝app*/
        button.onclick = function() {
            m.wakeupOrInstall();
        }
    }
}, data);

</script>
shareinstall提供完整的javascript api,方便Web開(kāi)發(fā)者實(shí)現(xiàn)完全自主的設(shè)計(jì)。

再開(kāi)看看shareinstall的代碼配置(測(cè)試):

如果做測(cè)試,獲取參數(shù),則必須在Appdelegate.h加上如下測(cè)試代碼。

#pragma mark 將oc數(shù)據(jù)類型轉(zhuǎn)成NSString
-(NSString *)DataTOjsonString:(id)object
{
if (!object) {
return null;
}

NSString *jsonString = null;
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object
                                                   options:NSJSONWritingPrettyPrinted
                                                     error:&error];
if (! jsonData) {
    NSLog(@"Got an error: %@", error);
} else {

jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}
return jsonString;
}
使用Shareinstall 控制中心提供的渠道統(tǒng)計(jì)時(shí),在App用戶注冊(cè)完成后調(diào)用,可以統(tǒng)計(jì)渠道注冊(cè)量。

警告:必須在注冊(cè)成功的時(shí)調(diào)用[ShareInstallSDK reportRegister] 方法,否則可能導(dǎo)致注冊(cè)統(tǒng)計(jì)不準(zhǔn)。

由上比較得知,shareinstall與友盟最大的優(yōu)勝點(diǎn)就在于首先實(shí)現(xiàn)完全自主。這很大一部分是因?yàn)樗鼈円婚_(kāi)始實(shí)現(xiàn)目的就有差別。例如:友盟針對(duì)一項(xiàng)SDK下載,需要同時(shí)下載3個(gè)包,而shareinstall則可以一鍵完成;而在集成上,友盟面對(duì)不同的項(xiàng)目需要不同的操作,過(guò)程過(guò)于繁瑣。而shareinstall通過(guò) URL Scheme 和 Universal Links 實(shí)現(xiàn)在不同瀏覽器中拉起APP,應(yīng)用集成造成的代碼冗余少,集成簡(jiǎn)單。攜參安裝實(shí)現(xiàn)個(gè)性化,渠道統(tǒng)計(jì)更精確。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI