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