使用场景
当我们在实现原生App使用Webview打开网页时候,即Android嵌套H5页面,如果用户已经在我App登录过,这时候再让用户进行一次登录操作,就会造成一种非常不友好的用户体验。那么,我们应该如何去实现无需二次登录这个问题呢?
问题描述
App只是一个“壳”的作用,由于登录功能是在H5中实现的,所以希望实现用户第一次登录后,关闭App或者过段时间再次打开App的时候,我们希望它会自动跳过登录这个步骤。即验证我们已经登录过,无需重复登录。现在市面上的大部分应用,都是这种实现,比如某宝、某东等。下面请看大致思路实现!
思路分析
我们可以将H5的登录信息,比如token等信息,通过Android的CookieSyncManager
和CookieManager
实现H5的登录信息进行同步和保存到手机中储存,类似于浏览器的cookie缓存一样,也就是保存H5用户登录的信息,进行一个同步,
解决方案
根据上述的思路分析,我们可以在Android的webView.setWebViewClient
里面的onPageFinished
这个方法中实现,具体源码参考下面:
//获取H5的token设置缓存
CookieSyncManager.createInstance(MainActivity.this);
//保留cookies,而不是在随后的重新启动后清除
CookieManager cookieManager = CookieManager.getInstance();
// 允许接受 Cookie
cookieManager.setAcceptCookie(true);
// 设置webView支持JS的Cookie的调用,5.0以上才要设置
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// 跨域cookie读取
cookieManager.setAcceptThirdPartyCookies(view, true);
}
//移除Cookie
//cookieManager.removeAllCookie();
String val = cookieManager.getCookie(url);
System.out.println("H5 cookie:" + val);
String urlDecoder = URLEncodeing.toURLDecoder(val);
// 向WebView中添加Cookie,一定要给主域设置cookie,给子级地址设置,父级会无法获取到cookie值
cookieManager.setCookie(url, urlDecoder);
// 刷新,同步
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
CookieManager.getInstance().flush();
}
CookieSyncManager.getInstance().sync();
//验证是否将cookie同步进去
//String newCookie = cookieManager.getCookie(url);
//System.out.println("newCookie:" + newCookie);
到此就完成了,重新执行app安装,你就会发现App登录过后,无论是关闭后二次打开,还是隔断时间再次打开,都无需进行登录即可进入App主页,赶紧去试试吧!祝“码”到成功!
结语
此方案仅供参考,你可以根据自行的项目需求进行优化,具体实现多久重新登录一次,这个问题可以从token中设定,即你的token有效期!