那么,引入h5相关文件的正确操作方式如下,这样就不会出现资源文件无法引入并正常使用的情况。
1.ios利用webview控件加载本地html5或者网络上html5
说明:在文章中,我主要讲解webview控件加载本地html5,至于加载网络html5,这个就是一样的!只不过需要从网络接口中去获取html5代码而已!
准备工作
1>.首先,你可以将写好的html文件拖拽到ios工程目录中;
如下图所示:
2>.在xcode工程中,往storyboard当中拖入一个uiwebview控件,方便待会儿使用;
如下图所示:
3>.设置控制器为webview的代理,遵守协议;利用webview控件加载本地html5;
如下图所示:
4>.最后,我们通过ios模拟器看一下工程运行之后的效果(这里我为了让大家更加清晰的看到模拟器效果,我把页面的背景颜色换成了黄色,后面会讲到如何修改uiwebview页面背景颜色);
当然,对于有ios基础的学生来说,以上加载本地html5或者加载网络html5的操作,都很简单,很多学生的困惑在于当网络接口当中显示的webview界面不符合我们的需求时,该如何修改html5里内容,也就是我们平常所说的增、删、改、查!接下来给大家讲解如何获取html5中的标签以及如何修改html5中的内容!
在ios当中修改html5内容
实现代理方法webviewdidfinishload:来操作网页,在代理方法中进行操作html5中的标签(增删改查);
代码中的操作如下:
重新运行工程,我们看一下模拟器中的效果变化:
说明:(要看懂字符串中的代码,必须具备js基础知识)从模拟器中可以看出,我们成功的删除了id为‘paragraph’的p标签、更改了class为'baidu'的标签里的内容(从‘百度’修改为了‘让教育回归本质’)、而且在后面成功的**了一张图片!
在ios中操作html5的几个步骤:
1.利用webview控件加载本地html5或者网络上html5;
2.设置当前控制器对象为webview的代理的代理对象,并遵守协议;
3.用类选择器或者id选择器或者标签选择器等选择要进行操作的标签;
4.把获取到的标签转换成字符串;
5.webview调用stringbyevaluatingjavascriptfromstring方法去执行js代码;
此处注意修改html5内容的应用场景:比如加载了网络上的某个链接,但是不想要它某个链接标签,利用这个代理方法,获取这个标签,然后删除它,或者更改他标签的显示文字等内容;
ios与html5和js之间的交互
首先采用的框架是webviewjavascriptbridge,采用这套框架可以方便的使ios与js交互
一, 流程图
二,ios端的使用
//首先导入#import "webviewjavascriptbridge.h"文件 //第一步:开启日志 // 开启日志,方便调试 [webviewjavascriptbridge enablelogging]; //第二步:给objc与js建立桥梁 // 给哪个webview建立js与ojbc的沟通桥梁 self.bridge = [webviewjavascriptbridgebridgeforwebview:webview]; // 设置代理,如果不需要实现,可以不设置 [self.bridgesetwebviewdelegate:self]; //第三步:注册handlename,用于给js端调用ios端 // js主动调用ojbc的方法 // 这是js会调用getuseridfromobjc方法,这是oc注册给js调用的 // js需要回调,当然js也可以传参数过来。data就是js所传的参数,不一定需要传 // oc端通过responsecallback回调js端,js就可以得到所需要的数据 [self.bridgeregisterhandler:@"getuseridfromobjc"handler:^(id data, wvjbresponsecallback responsecallback) { nslog(@"js call getuseridfromobjc, data from js is %@", data); if (responsecallback) { // 反馈给js responsecallback(@{@"userid": @"123456"}); } }]; [self.bridgeregisterhandler:@"getblognamefromobjc"handler:^(id data, wvjbresponsecallback responsecallback) { nslog(@"js call getblognamefromobjc, data from js is %@", data); if (responsecallback) { // 反馈给js responsecallback(@{@"blogname": @"星仔"}); } }]; //第四步:直接调用js端注册的handlename [self.bridgecallhandler:@"getuserinfos"data:@{@"name": @"ddsds"}responsecallback:^(id responsedata) { nslog(@"from js: %@", responsedata); }];
三,javascript端使用
<script> window.onerror = function(err) { log('window.onerror: ' + err) } /*这段代码是固定的,必须要放到js中*/ function setupwebviewjavascriptbridge(callback) { if (window.webviewjavascriptbridge) { return callback(webviewjavascriptbridge); } if (window.wvjbcallbacks) { return window.wvjbcallbacks.push(callback); } window.wvjbcallbacks = [callback]; var wvjbiframe = document.createelement('iframe'); wvjbiframe.style.display = 'none'; wvjbiframe.src = 'wvjbscheme://__bridge_loaded__'; document.documentelement.appendchild(wvjbiframe); settimeout(function() { document.documentelement.removechild(wvjbiframe) }, 0) } /*与oc交互的所有js方法都要放在此处注册,才能调用通过js调用oc或者让oc调用这里的js*/ setupwebviewjavascriptbridge(function(bridge) { var uniqueid = 1 function log(message, data) { var log = document.getelementbyid('log') var el = document.createelement('div') el.classname = 'logline' el.innerhtml = uniqueid++ + '. ' + message + ':<br/>' + json.stringify(data) if (log.children.length) { log.insertbefore(el, log.children[0]) } else { log.appendchild(el) } } /* initialize your app here */ /*我们在这注册一个js调用oc的方法,不带参数,且不用objc端反馈结果给js:打开本demo对应的博文*/ bridge.registerhandler('openwebviewbridgearticle', function() { log("openwebviewbridgearticle was called with by objc") }) /*js给objc提供公开的api,在objc端可以手动调用js的这个api。接收objc传过来的参数,且可以回调objc*/- bridge.registerhandler('token', function(data, responsecallback) { log("g星爷: ", data) responsecallback({这里给我返回拼接后的地址}) }) /*js给objc提供公开的api,objc端通过注册,就可以在js端调用此api时,得到回调。objc端可以在处理完成后,反馈给js,这样写就是在载入页面完成时就先调用*/ bridge.callhandler('getuseridfromobjc', function(responsedata) { log("js call objc's getuseridfromobjc function, and js received response:", responsedata) }) document.getelementbyid('blogids').onclick = function (e) { log('js call objc: getblognamefromobjc') bridge.callhandler('ww', {'blogdurl': 'weidsfdl'}, function(response) { log('js got response', response) }) } }) </script>
四,注意
当出现这样的提示的话,说明js那边已经实现了名字为‘ww’的方法,但是ios这边没有注册,
具体实现是:
[self.bridgeregisterhandler:@"ww"handler:^(id data, wvjbresponsecallback responsecallback) { nslog(@"js call getblognamefromobjc, data from js is %@", data); if (responsecallback) { // 反馈给js responsecallback(@{@"blogname": @"星仔"}); } }];
2. 当在push或者说页面消失的时候,将bridge对象置为空。
五,防止webview长按实现的方法
- (void)webviewdidfinishload:(uiwebview *)webview{ // 禁用 页面元素选择 [webview stringbyevaluatingjavascriptfromstring:@"document.documentelement.style.webkituserselect='none';"]; // 禁用 长按弹出actionsheet [webview stringbyevaluatingjavascriptfromstring:@"document.documentelement.style.webkittouchcallout='none';"]; }