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

本文详细介绍了在ReactNative中使用WebView时遇到的Cookie同步问题,特别是在Android 5.0及以上版本中出现的退登现象。通过调整WebView设置和Cookie管理策略,实现了跨平台的用户状态持久化。
摘要由CSDN通过智能技术生成

前言:

       最近公司把原生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各个版本之间的更改内容不熟悉,如果了解各个版本的更改内容应该会快速定位和解决问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值