最近维护公司app,要内嵌在线网站进来,因为在线移动网站是类似常见商城的形式,底部有几个导航按钮,而app内嵌的情况想从网页层面控制页面的返回,同时再针对app内嵌情况下的界面做一些控制。

可能前面说得比较晦涩难懂,下面举个例子,比如,页面有12345五个底部导航,默认进首页(1),当点击2345的时候,在android下点击原生返回键还会回到首页(1),这样的效果体验不是很好,所以页面全局拦截a链接,通过js采用location.replace来做跳转,这样一来,只要内部页面没有直接跳回12345五个页面的操作,整体跳转体验应该和app类似了。

另一个问题,要做微信分享,但是众所周知,网页目前是不可能直接分享到微信(除了二维码形式),所以这里在定义了特定协议,网页请求如share://share?title=朴人博客&content=朴人博客…,原生app内接收后解析处理,在webview上弹出分享界面。

当然,这不是今天的重点,重点是这里页面的分享按钮要根据是否app内嵌来选择是否显示,这里就要加一个特殊标识,最初通过url参数形式增加,但是并不完美,需要解析url再增加参数,分享时还需要把参数移除,比较繁琐。后面希望采用userAgent形式,但是iOS的同学发现iOS携带userAgent比较麻烦,携带headers比较简单,故iOS采用了自定义headers来标识来自app。

android实现比较坑的是,通过webView.loadUrl(String url,Map headers),可以实现首次请求携带自定义头,而我们页面内点击跳转同样需要自定义头,按照网上普遍的解决方案,在shouldOverrideUrlLoading方法内部再次调用view.loadUrl(String url,Map headers),看似没问题的解决方案,实际测试发现,这样一来,相当于新增了一个页面请求,如果页面使用js进行了跳转,使用原生返回键或者js内使用history.back()时,只能返回js跳转前的页面,即使跳转时使用的是location.replace,也无济于事。查遍文档无果,最后选择采用userAgent形式携带固定标识。代码如下:

WebSettings webSettings = getSettings();
webSettings.setUserAgentString(webSettings.getUserAgentString() + " Poorren/android");

android设置userAgent的方式还是挺简单的,虽然方案不统一,还是基本解决了需求,暂且就这样用了,这里仅记录一下。