昨天項(xiàng)目中碰到了一個(gè)bug,我們的客戶(hù)端webview加載了我們的一個(gè)新聞詳情頁(yè)些膨,在詳情頁(yè)里面發(fā)表一條評(píng)論,但是刷新頁(yè)面后钦铺,剛才發(fā)表的評(píng)論卻沒(méi)有顯示在評(píng)論列表里订雾。
第一直覺(jué),用其他的瀏覽器試試這一流程矛洞,發(fā)現(xiàn)沒(méi)有問(wèn)題洼哎。
這就奇怪了,難道是webview的設(shè)置有問(wèn)題嗎?但是因?yàn)椴恢佬侣勗u(píng)論這個(gè)功能的前端后端邏輯,隨便修改webview的設(shè)置只能是盲人摸象噩峦,亂改一通锭沟,就算改好了可能也不知道為什么這樣改就可以了。
本著科(zhuang)學(xué)(bi)的精(yu)神(wang)识补,我先仔細(xì)想了想幾個(gè)可能導(dǎo)致bug的疑點(diǎn):
- 使用了網(wǎng)頁(yè)緩存族淮,所以導(dǎo)致沒(méi)有看到新的評(píng)論
- 發(fā)表的評(píng)論上傳失敗了
- 請(qǐng)求評(píng)論列表出現(xiàn)錯(cuò)誤
一開(kāi)始以為使用的緩存頁(yè)面,所以沒(méi)有刷出來(lái)評(píng)論李请,可用fiddler抓包發(fā)現(xiàn)2個(gè)現(xiàn)象:
- 發(fā)表評(píng)論的時(shí)候瞧筛,ajax請(qǐng)求返回的json,errorcode=0导盅,這說(shuō)明上傳評(píng)論是成功的较幌;
- 刷新頁(yè)面確實(shí)重新請(qǐng)求了評(píng)論列表,返回的json白翻,errorcode=0乍炉,說(shuō)明請(qǐng)求列表也是成功的,但是居然不包含剛剛發(fā)的評(píng)論滤馍!
抓包可以說(shuō)明兩件事:
- 基本可以排除是本地緩存導(dǎo)致的問(wèn)題
- 極有可能是后端出了問(wèn)題
所以找了下后端的開(kāi)發(fā)岛琼,了解了下評(píng)論邏輯。上傳的評(píng)論一般都需要審核(人工審核)巢株,但是為了能在審核之前讓用戶(hù)可以馬上看到自己剛發(fā)表的評(píng)論(防止以為是個(gè)bug)槐瑞,所以在服務(wù)端把剛評(píng)論的message種到了cookie里面,只要拿到cookie就可以顯示出評(píng)論了阁苞。
然而抓包過(guò)程中困檩,并沒(méi)有發(fā)現(xiàn)服務(wù)端發(fā)送任何cookie,查了很久那槽,終于發(fā)現(xiàn)最終的原因:
Apps that target KITKAT or below default to allowing third party cookies. Apps targeting LOLLIPOP or later default to disallowing third party cookies.
在A(yíng)ndroid 4.4及以下的系統(tǒng)悼沿,webview是默認(rèn)接收第三方cookie的。但是骚灸,從android 5.0開(kāi)始糟趾,webview默認(rèn)是不接受第三方cookie的。
我們的服務(wù)端和頁(yè)面剛好不在同一個(gè)域里面甚牲,而我的測(cè)試機(jī)是android 6.0的义郑,所以導(dǎo)致接受不到cookie。
既然知道了根源丈钙,也就好解決了魔慷,接收第三方cookie的開(kāi)關(guān)是:
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView,true);
}
另外,注意到第一個(gè)參數(shù)是webview著恩,說(shuō)明這個(gè)設(shè)置不是全局的院尔,這一點(diǎn)android官網(wǎng)也做了說(shuō)明
Allowing third party cookies is a per WebView policy and can be set differently on different WebView instances.
所以蜻展,如果新建了一個(gè)webview,這個(gè)webview默認(rèn)還是不接收第三方cookie的邀摆,這點(diǎn)要特別注意!
感謝您的耐心閱讀纵顾,以上如果有錯(cuò)誤的地方或者理解有失偏頗,請(qǐng)留言指正栋盹,謝謝~~