android webview同步cookie

接上篇文章 okhttp3 cookie的持久化
项目中有用到 h5页面, 每次进入时都跳转到登录页面 (坑啊), 后面发现原来 webview没有同步cookie . 哎, 还是太年轻 , 直接上代码

    /*同步cookie*/
    public void synCookies(Context context, String url) {
    //CookieSyncManager负责管理webView中的cookie
    CookieManager cookieManager = CookieManager.getInstance();
    // ==============下面这部很重要=================
   //  根据版本不同,用不同方法刷新删除之前的cookie
    //  根据版本不同,用不同方法刷新cookie
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        cookieManager.flush();
    } else {
         // 清理之前的缓存
        cookieManager.removeSessionCookie();
        cookieManager.removeAllCookie();
        CookieSyncManager.createInstance(this).sync();
    }
   // ===========之前忘了这部  找了半天的bug==========
    cookieManager.setAcceptCookie(true);
    // 获取cookie     
    cookiePersistor = new SharedPrefsCookiePersistor(context);
    List cookieList = cookiePersistor.loadAll();
    for (int i = 0; i < cookieList.size(); i++) {
        Cookie cookie = cookieList.get(i);
        if (cookie.name().equals("token")) {
            cookieManager.setCookie(url, cookie.name() + "=" +   cookie.value());
        }
    }
}
调用此方法后, 再   mWv_report.loadUrl(url);   这样调用H5界面时 ,就不会显示登录页面了 .

更新: 上面的方法 部分机型可能无法同步cookie (公司的魅族6测试机就出现无法同步, 其他小米/华为 都没问题) , 后面想到一个办法直接将cookie直接全部设置进去, 看代码

   /*同步cookie*/
public void synCookies(Context context, String url) {
    //CookieSyncManager负责管理webView中的cookie
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);
    cookieManager.acceptCookie();
    // 获取cookie
    cookiePersistor = new SharedPrefsCookiePersistor(context);
    List cookieList = cookiePersistor.loadAll();
    //  根据版本不同,用不同方法刷新删除之前的cookie
    //  根据版本不同,用不同方法刷新cookie
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
        cookieManager.setAcceptThirdPartyCookies(mWv_report, true);
        cookieManager.removeSessionCookies(null);
        cookieManager.removeAllCookies(null);
        cookieManager.flush();
        String cookies = cookieList.toString();
        // 只截取中间的cookie  主要就是这
        String cookie = cookies.substring(1, cookies.length() - 1);
        cookieManager.setCookie(url,cookie);
    } else {
        // 清理之前的缓存
        cookieManager.removeSessionCookie();
        cookieManager.removeAllCookie();
        CookieSyncManager.createInstance(this).sync();
        for (int i = 0; i < cookieList.size(); i++) {
            Cookie cookie = cookieList.get(i);
            if (cookie.name().equals("token")) {
                cookieManager.setCookie(url, cookie.name() + "=" + cookie.value());
            }
        }
    }

革命尚未成功, 同志任需努力啊 !!!

你可能感兴趣的:(android webview同步cookie)