Android WebView 持久化问题(Cookie保存)

前言:

       最近公司把原生Android换成了React Native混合开发(别问我为什么不用Flutter,因为前端人员不会,移动端也不会,,,,),然后功能就由移动端完全搬到了Web端,IOS和Android使用UIWebview和WebView集成使用。

了解:

React Native(以下简称RN)技术是有Facebook(脸书)公司提供的一个的ReactUI框架,使用Javascript可以完成对移动端的交互工作已经画面绘制。github是这样介绍的。github,官网

使用RN可以完成一端多用,完成一个端的开发可以在IOS,Android,小程序,Web等等平台使用,既能减少人力成本,又能快速迭代,反正一堆优点,当然了缺点也不少,毕竟是集成在Webview中的与原生话说有所差距,渲染会稍微慢点,对网速要求也较高。

问题:

介绍了那么多RN好像跟主题跑偏了,拉回来。最近有客户反应会有部分机型会有退登的现象。而H5已经做了持久化处理(最初使用的是localStorage)但是手机上还是有部分苹果机型退登,最后Web端切换成了Cookie保存User-Token,但是在测试过程中发现Android端出现杀死APP后会出现退登现象。既然是面向百度编程,那就百度一番吧。百度后发现原来Android 5.0后对WebView做了比较大的更改,具体内容自行百度。而我们遇到的问题就是同步cookie的操作已经可以自动同步、但前提是我们必须开启第三方cookie的支持。

解决:

既然发现了问题那么解决就好解决,首先在初始化Webview中假如以下内容

  CookieManager mCookieManager = CookieManager.getInstance();
        mCookieManager.setAcceptCookie(true);
        mCookieManager.setAcceptThirdPartyCookies(webView, true);

然后在WebViewClient的onPageFinished方法中获取Cookie并保存到本地

CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
String cookiestr = cookieManager.getCookie(url);
someToolUtil.putSPData("cookie", cookiestr);

然后还是在WebViewClient中的shouldInterceptRequest方法中,在加载前同步Cookie

 syncCookie(getContext(),request.getUrl().toString());
syncCookie

    private void syncCookie(Context context, String url) {
        try {
            CookieSyncManager.createInstance(context);
            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.setAcceptCookie(true);
            cookieManager.removeSessionCookie();// 移除
//            cookieManager.removeAllCookie();

            String cookie = someToolUtil.getSPData("cookie");
            String[] cookies = cookie.split(";");
            if (!TextUtils.isEmpty(cookie)) {
                for (String cook : cookies) {
                    //一定要一个一个set, 如果是拼接的话,设置不成功。
                    cookieManager.setCookie(url, cook.trim());
                }
            }

            //最后一定要调用

            CookieSyncManager.getInstance().sync();

        } catch (Exception e) {
            logUtil.logE("Victory-Cookie", e.toString());
        }
    }

 

总结:

因为是公司项目就不发源码了,解决问题的代码都已经发布了,持久化最大的问题就Cookie数据存取的问题,如果存取问题解决了,程序也就持久化了。出现改问题的最大原因就是个人对Android各个版本之间的更改内容不熟悉,如果了解各个版本的更改内容应该会快速定位和解决问题

你可能感兴趣的:(Android,Tips)