关于ios中的uiwebview(转载)

最近用了下uiwebview,说实话真不错。至少在ui表现方面,使用html写界面可以省去很多功夫。但是uiwebview其实还是存在着很多问题的。一个最关键的问题就是对https双向(单向)认证的支持。

其实看看api说明基本已经明白双向的https是不可行的了,那么单向又如何呢?答案是可行,但有问题。

在进行单向认证的过程中,uiwebview其实还做了一步证书的认证,就是匹配证书中的域与当前访问的域名是否相同,不相同则拒绝。这就使得用uiwebview访问https://alipay.com和https://www.alipay.com会得到两个不同的结果,而如何才能不进行这一认证,单从api上我还是没看到好方法。

既然uiwebview本身的功能有这么多限制,那么就会想是否通过别的方式来实现数据的传输(request和response),而只使用uiwebview进行html语法的解析(渲染)呢?这个思路是可行的,但是还是有问题。

首先支持这样的做法的一个基础就是uiwebview的一个delegate

webView:shouldStartLoadWithRequest:navigationType:


在每次uiwebview真正去请求前都会进入这个delegate,而通过delegate中的request参数,我们就可以获得这次请求的url,body,header等各个参数,有了这些参数就可以使用其它的方法去访问服务器,得到返回的数据,参看下面的文章,列出了几种直接访问服务器的方法

http://www.cocoachina.com/bbs/read.php?tid-55317.html

得到数据后通过uiwebview中的另一个消息

loadHTMLString:baseURL:

就可轻松展现页面。不过我又要说了,可能还是有点问题。

当你尝试去显示的页面中有这么一张图片,它的属性src不是通过绝对路径而是相对路径显示的时候,你会发现图片无法加载,通过上面方法的第二个参数baseURL告知其基地址,从而使相对路径成为绝对路径得到图片信息。不过在我的测试过程中却发现了一些https单向的网站却始终无法通过uiwebview得到图片的问题,而且也没有任何错误提示,猜测下最大的原因可能还是关于证书的验证使得链接又一次被拒绝了。



总之,如果把uiwebview拿来用作界面的显示确实是个不错的方案,但是现在的uiwebview功能还是太少,依然存在着一定的问题。

猜你喜欢

转载自linwwwei.iteye.com/blog/1714265