最近項(xiàng)目中接觸到一個(gè)麻煩的登錄接口,需要用native方法請(qǐng)求登錄接口后,返回的鏈接列表再請(qǐng)求一遍。照做后發(fā)現(xiàn)WebView還是不會(huì)自動(dòng)登錄。詢(xún)問(wèn)ios同事發(fā)現(xiàn)他也是這樣做,但是能自動(dòng)登錄。后來(lái)我發(fā)現(xiàn)了這篇文章【W(wǎng)ebView的cookie機(jī)制 】輕松搞定WebView cookie同步問(wèn)題,里面提到“因?yàn)锳ndroid不會(huì)自動(dòng)同步cookie到WebView。做IOS開(kāi)發(fā)則不用擔(dān)心這個(gè)問(wèn)題,因?yàn)镮OS內(nèi)部已經(jīng)實(shí)現(xiàn)了cookie同步”。
于是我按照他的方式二去實(shí)現(xiàn),發(fā)現(xiàn)還是不行。期間我跟后臺(tái)的同事溝通,用加載JS的方式去解決問(wèn)題,發(fā)現(xiàn)在電腦的瀏覽器上可以成功,但是在手機(jī)瀏覽器上不成功,進(jìn)度又回到了原地。
重點(diǎn)來(lái)了?。?!

通過(guò)數(shù)據(jù)庫(kù)查看軟件打開(kāi)Cookies發(fā)現(xiàn),保存到數(shù)據(jù)庫(kù)里的name-value鍵值對(duì)只保存了一個(gè),而從電腦瀏覽器看有三個(gè)。


問(wèn)題就出現(xiàn)在取Cookie的時(shí)候沒(méi)有取全,下面是網(wǎng)上取Cookie的方法
String cookieStr = conn.getHeaderField("Set-Cookie");
下面代碼是我通過(guò)HttpURLConnection取Cookie的方法,其他網(wǎng)絡(luò)框架的自行Google。
URL url =new URL(url);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.connect();
if(conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
Map<String, List<String>> headFields = conn.getHeaderFields();
List<String> cookieList = headFields.get("Set-Cookie");
}

然后通過(guò)CookieManager的setCookie方法把url跟cookie綁定下就好了。
CookieManager cookieManager = CookieManager.getInstance();??
for(String cookie: cookieList) {
cookieManager.setCookie(url, cookie);
}

如果API是21以下的話,需要在CookieManager前
CookieSyncManager.createInstance(context);
在for循環(huán)結(jié)束后
CookieSyncManager.getInstance().sync();
花了兩天終于把這個(gè)問(wèn)題解決了,WebView已經(jīng)能自動(dòng)登錄。
如有什么錯(cuò)誤或者不足的地方,請(qǐng)指正。