先說(shuō)問題:
年會(huì)H5cooki同步失敗璃俗。但是
- 如果重新下載安裝套利,成功
- 舊app推励,進(jìn)入app后,不先進(jìn)入年會(huì)H5肉迫,首先進(jìn)入其他H5界面验辞,再回過來(lái)進(jìn)入年會(huì)H5,成功
事情緣由:
2022準(zhǔn)備開年會(huì)了喊衫,行政方面跌造,想通過內(nèi)部OA系統(tǒng),進(jìn)行一輪企業(yè)文化的答題環(huán)節(jié)族购。答題環(huán)節(jié)的內(nèi)容是H5壳贪,App端,只需一個(gè)WebView load就行寝杖。公司的OA违施,歷經(jīng)不下10人的版本迭代、代碼風(fēng)格參差不齊瑟幕,好不容易找到加載的地方---一個(gè)名叫H5ActivityActivity的類磕蒲。
問題分析:
1.本地的Cookie是肯定存在的,問題一定出現(xiàn)在同步cookie進(jìn)webView的地方只盹。
2.如果是如1所說(shuō)辣往,為什么是偶發(fā)性呢?
3.為什么卸載鹿霸、重裝就恢復(fù)了呢排吴?
代碼部分:
CookieSpUtil.syncCookie(this, "");//同步cookie
final WebView mWebView = (WebView) findViewById(R.id.mWebView);
if(TextUtils.isEmpty(webUrl))
return;
mWebView.loadUrl(webUrl);
WebSettings settings = mWebView.getSettings();
.....
/**
* 同步cookie,準(zhǔn)備顯示網(wǎng)頁(yè)
*/
public static void syncCookie(Context context,String defValue){
String cookie = CookieSpUtil.getCookieString(context,defValue);
String[] cookies = cookie.split(";");//這里一定是有值的
CookieManager cookieManager = CookieManager.getInstance();
for (int i = 0;i < cookies.length;i++){
cookieManager.setCookie(Constant.root, cookies[i]);//這里設(shè)置
}
CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(context);
cookieSyncManager.sync();//同步
}
第一次bug定位:setCookie(如果懦鼠,domain錯(cuò)誤钻哩,那肯定是同步失敗的)
在setCookie時(shí)屹堰,第一個(gè)參數(shù)是傳入的domain,和前端哥們綜合會(huì)診后街氢,發(fā)現(xiàn)歷史代碼中domain是一個(gè)三級(jí)域名扯键,例如:fat1.fat2.fat3,而年會(huì)H5的三級(jí)域名為:h5.fat2.fat3珊肃。因?yàn)橛蛎且患?jí)含二級(jí)荣刑,二級(jí)含三級(jí),所以這里是有問題的伦乔,于是修改domain為二級(jí)域名厉亏。
第二個(gè)疑問?為什么進(jìn)入別的H5界面烈和,再回來(lái)爱只,就好了?按道理招刹,既然domain錯(cuò)誤恬试,那是100%同步失敗的啊
CookieSpUtil.syncCookie(this, "");//同步cookie
final WebView mWebView = (WebView) findViewById(R.id.mWebView);
if(TextUtils.isEmpty(webUrl))
return;
mWebView.loadUrl(webUrl);
WebSettings settings = mWebView.getSettings();
.....
又和前端哥們、后端哥們綜合會(huì)診疯暑,發(fā)現(xiàn)训柴,因?yàn)槠渌鸋5的domain都是fat1.fat2.fat3,what妇拯?為什么不做成一樣的呢幻馁?
這就沒事了,先進(jìn)入一個(gè)其他H5乖阵,cookie會(huì)同步成功宣赔,再進(jìn)入年會(huì)H5時(shí),同步cookie失敗瞪浸。但是儒将,因?yàn)橹暗腸ookie,所以可以正常進(jìn)入对蒲。
第三個(gè)疑問钩蚊?為什么卸載、重裝后蹈矮,就恢復(fù)了呢砰逻?
經(jīng)排查,發(fā)現(xiàn)泛鸟,卸載蝠咆、重裝后,進(jìn)入app主界面,第一時(shí)間刚操,會(huì)彈出一個(gè)VersionInfo的H5界面闸翅,其原理和第二個(gè)疑問一樣,
這樣菊霜,一切都通了坚冀。
而后,把同步問題鉴逞,還做了些適配
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.flush();
} else {
CookieSyncManager.getInstance().sync();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0以上记某,WebView默認(rèn)不允許跨域獲取cookie
CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true);
}
最后,為了保證年會(huì)能順利的進(jìn)行下去构捡,還做了一個(gè)臨時(shí)的兜底方案液南,把用戶名當(dāng)參數(shù)拼接到url里,這樣叭喜,就萬(wàn)無(wú)一失了贺拣。
至于這個(gè)在線上蓖谢,且經(jīng)歷了數(shù)代的代碼捂蕴,改一處,動(dòng)全身闪幽,
想要重構(gòu)啥辨,可能需要提上公司層面,前后端配合盯腌,才能進(jìn)行了溉知。
暫時(shí),只能從App端腕够,一處一處優(yōu)化级乍。