网站大量收购独家精品文档,联系QQ:2885784924

UIWebView与JS的深度交互.docx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
UIWebView与JS的深度交互

UIWebView与JS的深度交互事情的起因还是因为项目需求驱动。折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾。我要实现这样一个需求:按照本地的CSS文件展示一串网络获取的带HTML格式的只有body部分的文本,需要自己拼写完整的HTML。除此之外,还需要禁用获取的HTML文本中自带的《img》标签自动加载,并把下载图片的操作放在native端来处理,并通过JS将图片在Cache中的地址返回给UIWebview。之所以要把图片操作放在native端做的好处在于:1、可以进行本地缓存,下次进入这篇文章可以直接从缓存读取,提高响应速度并且节省用户流量。2、可以实现点击图片放大、保存图片到相册等操作。技术难点也有两个:1、如何让HTML文本onLoad的时候,禁用自身的图片加载而是从本地获取图片?2、如何把native端下载好的图片返回给网页?起初,我也是束手无策,翻看文档可只找到了一个 - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script 和JS简易交互的方法,未能如愿。直到我在Github上看到了WebViewJavascriptBridge这个用于UIWebView/WebViews和JS交互的封装库。刚看sample的时候我差点没被各种回调搞晕,好记性不如烂笔头,我从来不掩饰自己的愚笨,所以我画了一个关系图。在放图之前,我们先看代码。一开始,我们在Native端和JS端都分别进行初始化:OC端:?@property?WebViewJavascriptBridge*?bridge;?对应的初始化代码如下,在初始化中直接包含了一个用于接收JS的回调:_bridge?=?[WebViewJavascriptBridge?bridgeForWebView:webView?webViewDelegate:self?handler:^(id?data,?WVJBResponseCallback?responseCallback)?{?NSLog(@ObjC?received?message?from?JS:?%@,?data);?responseCallback(@Response?for?message?from?ObjC);?}];?JS端:(以下是固定写法,你自己的JS文件中必须包含如下代码)function?connectWebViewJavascriptBridge(callback)?{?if?(window.WebViewJavascriptBridge)?{?callback(WebViewJavascriptBridge)?}?else?{?document.addEventListener(WebViewJavascriptBridgeReady,?function()?{?callback(WebViewJavascriptBridge)?},?false)?}?}?connectWebViewJavascriptBridge(function(bridge)?{?bridge.init(function(message,?responseCallback)?{?log(JS?got?a?message,?message)?var?data?=?{?Javascript?Responds:Wee!?}?log(JS?responding?with,?data)?responseCallback(data)?})?}?然后,我们要知道,在WebViewJavascriptBridge中,交互的方式只有两种:send 和callHandle,JS和OC都有这两个方法,所以对应的四种关系是:以上表中的对应关系的解读是,例如第一条:在JS中如果调用了bridge.send(),那么将触发OC端_bridge初始化方法中的回调。同理,第二条,在JS中调用了bridge.callHandler(testJavascriptHandler),它将触发OC端注册的同名方法:bridge.registerHandler(testJavascriptHandler,?function(data,?responseCallback)?{?log(ObjC?called?testJavascriptHandler?with,?data)?var?responseData?=?{?Javascript?Says:Right?back?atcha!?}?log(JS?responding?with,?responseData)?responseCallback(respon

文档评论(0)

hhuiws1482 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档