您的位置:首页 > 移动开发

Android webView使用详解(Cookies)

2017-06-26 15:04 387 查看
前段时间的项目关系一直在和android的webview打交道,网上查了很多资料,发现关于webview的详细介绍都比较少,于是决定自己做个小总结。当然因为本人比较懒的缘故,可能这个总结也不会做的太全面,要想详细了解webview的话还是推荐直接去看Android Developer官方网站给的API文档,我在这里只是粗略介绍一下要想开发一个完整的webview需要用到的一些主要的class,以及提一下在使用webview时需要注意的一些point。
关于Webview几个比较重要的class是WebView, WebSettings, WebViewClient以及CookieManager。
WebView类就相当于一个小型浏览器,使用它就可以根据URL浏览某个网页;但在使用webview之前我们需要先对webview做一些基本的全局配置,这就需要用到WebSettings。然后WebViewClient相当于WebView这个简易浏览器的内核,设置黑白名单,对特定URL,scheme采取哪种响应方式,操作cookie都在(应该在)这个类里面进行相应方法的重载实现。这里不得不吐一下槽就是Android的CookieManager略难用,使用它去获得cookie时,只能得到所有cookie的“key=value”字符串,cookie的有效时间,domain啥的一律取不到,要想取得Cookie对象的话貌似目前只能通过HttpClient(具体我没实践过)。下面是示例代码,具体代码意义请看注释。

//假设你已经在Activity或者Fragment对应的layout文件中定义了一个id为webview的WebView组件。
WebView webview = (WebView) findViewById(R.id.webview);
//设定webview的useragent,这个主要用来服务器端进行验证,如果server端没有特殊要求的话可以不用管。
webview.getSettings().setUserAgentString("string");
WebSettings webViewSetting = webview.getSettings();
//下面这两行代码让webview在打开网页时自动进行大小匹配,让网页大小fit上屏幕大小
webview.getSettings().setUseWideViewPort(true);
webview.getSettings().setLoadWithOverviewMode(true);
//设置webview支持放大缩小功能,try部分的代码可能难理解,这是为了消去我们用手指进行放大缩小时屏幕中出现的“放大缩小按钮”
webview.getSettings().setBuiltInZoomControls(true);
webview.getSettings().setSupportZoom(true);
try {
Field webViewField = webViewSetting.getClass()
.getDeclaredField("mBuiltInZoomControls");
webViewField.setAccessible(true);
webViewField.set(webViewSetting, false);
} catch (Exception e) {
e.printStackTrace();
webViewSetting.setBuiltInZoomControls(false);
}
webview.setWebViewClient(newWebViewClient);
//WebViewClient是重头戏,很多自定义的逻辑控制功能都要借助这个类来实现。
//定义一个新的WebViewClient
private WebViewClient newWebViewClient = new WebViewClient() {
@Override
//这个函数用来决定每当webview打开一个新的URL时的动作,
//return true的话表示webview不会继续对URL进行操作,此时你需要指定来对该URL进行操作的应用或是其他组件;
//如果不指定,直接返回true的相当于该条URL不响应;
//return false的话表示webview会继续对该URL进行处理。
//如果要对特定的domain进行限定,也就是我们说的黑白名单,
//就需要重载这个方法,判断URL是否需要过滤,然后直接返回true
public boolean shouldOverrideUrlLoading(
final WebView view, final String url) {
for (int k = 0; k < blockList.length; k++) {
if (url.contains(blockList[k])) {
return true;
}
}
if (url.startsWith("http://")) {
return false;
} else if (url.startsWith("https://")) {
return false;
return true;
}

/**
* 之前我在使用webview时出现了当打开https的link时webview一片空白的情况
* 网上查了一下,说是重载这个函数并让他返回handler.proceed()就行。
* 试了之后确实可以解决问题,但这样子存在安全隐患。
* 因为这个函数的意思是忽略HTTPS错误,即当出现HTTPS错误,比如最常见的
* 没有签名的安全错误,webview也还是照样打开该网站,这就让钓鱼网站有机可乘,
* 所以一般做法时当出现HTTPS错误时,调用cancel()终止网页继续载入。
* 那如何解决HTTPS链接空白的问题呢?参考上面shouldOverrideUrlLoading()的定义
*/
@Override
public void onReceivedSslError(final WebView view,
final SslErrorHandler handler, final SslError error) {
//handler.proceed();
handler.cancel();
}

@Override
//当发生了HTTP错误,比如404错误啊,503错误啊等就调用这个函数,
//可以在这里获得errorCode并对errorCode进行对应处理
public void onReceivedError(final WebView view,
final int errorCode, final String description, final String url) {
}

/**
* 打开一个URL时会被调用的函数,在这里可以进行一些初始化操作,比如载入cookie等
*/
@Override
public void onPageStarted(final WebView view, final String url,
final Bitmap favicon) {
URL realUrl;
try {
realUrl = new URL(url);
host = realUrl.getHost();
domain = host.substring(host.indexOf("."));
} catch (MalformedURLException e) {
e.printStackTrace();
}
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
//注意我们在set cookie时不能直接针对URL进行cookie的set操作,而是应该要针对该URL的domain来进行设置
//domain的格式一定为".google.com"类似。
cookieManager.setCookie(domain, cookieKeyName);
if (cookieManager.hasCookies()) {
//但是在获取cookie时使用的参数是url,这里的区别要注意
String cookies = cookieManager.getCookie(url);
}
}
/**
* 当网页载入完毕时一定会调用的函数,可以在这里进行一些参数保存操作
*/
@Override
public void onPageFinished(final WebView view, final String url) {
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: