前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >红烧嗨鸟

红烧嗨鸟

作者头像
用户1907613
发布2018-07-20 15:18:17
4970
发布2018-07-20 15:18:17
举报
文章被收录于专栏:Android群英传Android群英传

今日菜谱——红烧嗨鸟!

前面有很多读者希望我能讲一讲关于Hybrid的东西,我想劝你们早日放弃,但毕竟有很多朋友都是不到黄河心不死,也有很多朋友是因为打不过PM才被妥协。但不管怎么样,看来我也是得给你们上这样一道菜了。

有人可能要问了,说好的嗨鸟呢?一看你就没看过我之前的文章:

记一个诡异的Hybird Bug是如何修改的 (http://mp.weixin.qq.com/s?__biz=MzAxNzMxNzk5OQ==&mid=2649484508&idx=1&sn=a5da61da9101135082b58086570e78d4#rd) 点击原文看不了!

OK,Hybrid、Hybird傻傻分不清吗?反正自从看到了这个bug,我现在是分不清了。不过还好,鄙司的嗨鸟框架是由我的同事——任康可负责的,所以我不用担心是否分得清。

下面就有请任康可来给大家分享下Hybrid开发中的一些技巧,今天是第一道,如果你不想这道菜成为嗨鸟菜系的最后一道菜,请一定去他的博客里面留言——快点吧,我等的花儿都谢了!

---------------康可出场---------------

Hybird本身的意思是混合的,其实用在这里,就是指的是原生和Web开发混合起来,各展所长。

最近在做Android hybird方面的研究和开发。有一些关于WebView开发的心得体会,特分享于大家。

之前我在这方面有两篇相关博客,分别介绍了Android中webview与javascript交互方法以及Android JS Debug技巧。这两篇文章对一些WebView的基本操作、使用以及调试进行了总结。

今天我会对在开发Web离线包遇到的问题、对webView请求请求拦截以及调整这些方面做介绍。

Hybird离线包

因为hybird方案使用webView加载,所以速度上有点慢,我们采用在本地使用离线包的形式、这样加载来提升速度,从而不受网络的影响。

这样做就需要使用 file:///协议来加载本地离线web页面,这样使用起来发现会导致一个问题,服务端去拿存储进去的cookie值,在大部分Android手机和部分iPhone手机拿不到。

经过分析,发现应该是因为协议的问题,我们用的是file:///协议,而用http协议就没有这个问题。

这样的话离线就遇到这样的问题,要么服务器端做一个兼容,不用cookie,这样很麻烦。或者是使用JS调用原生方法,每一个网络请求都起客户端进行封装,这样也是要改动非常多。

最终发现webView有这样一个方法shouldInterceptRequest,这个方法会在每一个请求执行前,进行拦截,然后开发者可以任意处理后,再返回一个处理后的网络请求WebResourceResponse,这个方法真是太酷了。

于是我们就可以将本地file协议先伪装成http协议,先随便请求一个网络地址,这个地址是什么不重要,只要首页一样就行了。

加载后,在此处进行拦截所有的请求,然后做处理,将所有的请求全部转换为本地文件。

其中 WebResourceResponse 主要是由三个部分组成:

其中 mimeType为请求文件的类型、encoding为文件的编码、data为文件的inputStream。

mimeType这个可以根据文件后缀来映射,或者用第三方开源的工具,encoding我们一般就用utf-8,文件流就直接读取就行了。

例如这样读取:

这样就完美的将本地web页面file协议请求伪装成了http协议的请求,这样cookie的问题就解决了。

webView中的所有网络请求都要添加自定义header

肯定有很多产品会希望webView中的所有网络请求都要添加自定义header,但webView只提供了一种添加header的方法。

但这种方法只能在url中添加,其它页面中的请求就添加不上了,那怎么办呢?

此时我们一思考就会发现,用上面shouldInterceptRequest这个拦截所有请求的方法就能解决这个问题。

我们在所有网络请求到达时,拦截,然后用http请求的方法,先添加header,然后去请求这个文件流,然后返回组装成webView需要的WebResourceResponse是不是很赞,哈哈。

Cookie问题

在使用第三方微博登录时,发现当用户没有安装微博时,微博web端会在登陆成功后清除整个应用webView的cookie,这个就导致此时我们的cookie丢失,失效的问题,怎么解决呢?

其实仔细研究发现webView也为我们提供了非常有用的cookie设置和cookie读取问题。我们可以首先要读取cookie,放在内存中

然后在微博将cookie清除后,将cookie再保存进去。

这样问题就方便地解决了。

总结

Hybird是一种很好的方案,webView提供的功能很强大,后续有更多有好的想法会持续分享给大家。

这是一个种很好的方案,两个平台解决方案都是想通的,iOS里的这个方法叫cachedResponseForRequest。

OK,这就是康可的第一道菜——红烧嗨鸟,如果各位觉得口味还可以,请一定去它的博客留言啊~他这人就是这样,不留言不更新!!!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 群英传 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档