iOS开发 UIWebView+JavaScript 交互总结
算是个人项目经验的,印象比较深的Web+JS交互的使用
iOS原生应用与Web页面元素交互方式有很多,JavaScriptCore、拦截协议、第三方框架WebViewJavaScriptBridge、iOS8之后的WKWebView等;
简要记录下之前开发用到的两种方式:
1. 劫持页面加载,从 UIWebVIew 的 shouldStartLoadWithRequest 方法中拦截RequestURL 判断加载项,代码简要:
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSString *urlStr = [[request URL] absoluteString];
// 加载的url 关键词需要同后台约定
NSRange range_keyWord = [urlStr rangeOfString:@"opengood://"];
if (range_keyWord.length > 0) {
[self doSomeThing];
}
return YES;
}
2. iOS7之后水果公司推出的 JavaScriptCore 框架,交互起来hin方便
需要注意的是JS调用的方法名等需要同前端的同事沟通好,最好由前端提供给你。
浅显的说,这个方式等同于将当前ViewController 注入到web的context中,不同webClick都能够有不同的JS方法与VC上面的代理方法相对应,
例:
Web端
javaScript控件的点击事件约定触发 'task.openNewWeb('urlStr')'
“task”这个东西在web源码中并没有什么实际意义 它只相当于iOS端的某个viewController的占位符号
iOS端代码:
#import <JavaScriptCore/JavaScriptCore.h>
UIWebView 代理方法中将当前控制器动态注入js中
- (void)webViewDidStartLoad:(UIWebView *)webView {
//首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)
JSContext * context =[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 控制器self 填充web中预留的占位符‘task’
self.context[@"task"] = self;
// 这时候javaScript控件的点击事件约定触发 'task.openNewWeb('urlStr')'
// 那么在OC语法中相当于 [self openNewWeb:urlStr];
self.context.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
context.exception = exceptionValue;
NSLog(@"异常信息:%@", exceptionValue);
};
}
******** ⚠️ 注意:WEB JS交互crush
/*
* web点击事件 'task.click()' ,OC中必须要有对应的方法声明和实现,否则无法响应交互或导致crush
* 而且,在iOS10 以后 貌似加强了调度表查询机制,所以声明OC方法名的时候注意重复问题,
* 例如 openWeb:(int)index (NSString *)url 与 openWeb:(NSString *)url 形参数量存在差异,视为两个不同方法
* 因为在OC消息传递机制中,self.openNewWeb() 首先是通过self 查找保存本身所有selector的调度表
* 若self的selectorNameList中并未找到js调用的task.selectorName ,则通过self的isa定位到superClass,继续从super中的函数调度表 selectorNameList查询
* superClass中仍未查到则继续根据其isa顺藤摸瓜找到super的元类继续查找 如果元类中还没有 抛出异常>> crush.nice - -b
*/
所以对于上面拦截web加载的方式,JavaScriptCore 的另一个优点就是提升代码可读性。。。
由于项目代码内部有涉及到公司业务不方便贴出来,给大家提供两个之前调研过的连接,里面有详尽的JavaScriptCore 使用
链接1
http://mp.weixin.qq.com/s?__biz=MzAxMzE2Mjc2Ng==&mid=401786074&idx=1&sn=f03d52e7b4f980d694ed4a6b0e808d3b&scene=23&srcid=0309JfhgdIYEJ4vg1YY3OD2T#rd
链接2
http://mp.weixin.qq.com/s?plg_nld=1&plg_auth=1&plg_nld=1&plg_dev=1&plg_uin=1&plg_usr=1&plg_vkey=1&plg_nld=1&plg_uin=1&mid=403853462&plg_nld=1&idx=1&scene=23&plg_auth=1&__biz=MjM5Nzc1MzU2NA%3D%3D&plg_dev=1&srcid=0308AYX0Hpyq3w7TEdwDQ8z8&plg_usr=1&sn=f7437fe6fa45e62d86c026efa4aa1645&plg_vkey=1#rd
在很多页面涉及web交互时,就要频繁调用JS与ViewController关联的方法
这个之前写的一个web类目,提供下载链接,欢迎修改和完善
http://pan.baidu.com/s/1eRSt6p0
iOS开发 UIWebView+JavaScript 交互总结的更多相关文章
- iOS 开发与H5交互(JavaScriptCore框架的使用)
现在的iOS项目中嵌入了越来越多的Web界面,当然是为了方便,那么为了迎合这一趋势,作为iOS开发程序员,我们必须要了解怎么样用OC去和这些Web界面进行交互.这里介绍的是JavaScriptCore ...
- iOS开发——JS网页交互——javaScript
JS中调用OC #import "ViewController.h" @interface ViewController () <UIWebViewDelegate> ...
- iOS开发-UIWebView加载本地和网络数据
UIWebView是内置的浏览器控件,可以用它来浏览网页.打开文档,关于浏览网页榜样可以参考UC,手机必备浏览器,至于文档浏览的手机很多图书阅读软件,UIWebView是一个混合体,具体的功能控件内置 ...
- iOS开发——UIWebView
(已写好代码,待空闲更新……)
- 【iOS开发】UIWebView与JavaScript(JS) 回调交互
------------------------------------------------- 很多关于objc 与 js 交互的文章都比较适用于 mac开发,iOS的webview 还是有所不一 ...
- IOS开发之——objective-c与javascript交互
原文:http://blog.csdn.net/pjk1129/article/details/6936545 在写 JavaScript 的时候,可以使用一个叫做 window 的对象,像是我们想要 ...
- Hybrid App开发模式中, IOS/Android 和 JavaScript相互调用方式
IOS:Objective-C 和 JavaScript 的相互调用 iOS7以前,iOS SDK 并没有原生提供 js 调用 native 代码的 API.但是 UIWebView 的一个 dele ...
- iOS开发进阶之 UIWebView
刚接触IOS开发1年多,现在对于混合式移动端开发越来越流行,因为开发成本上.速度上都比传统的APP开发要好,混合式开发是传统模式与PC网页端相结合的模式.那么提到了 APP的混合模式开发,在Andro ...
- iOS开发笔记7:Text、UI交互细节、两个动画效果等
Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...
随机推荐
- ubuntu使用
1主机名修改 在Ubuntu系统中永久修改主机名也比较简单.主机名存放在/etc/hostname文件中,修改主机名时,编辑hostname文件,在文件中输入新的主机名并保存该文件即可.
- JavaScript 中介者模式与观察者模式有何不同?
http://addyosmani.com/resources/essentialjsdesignpatterns/book/#detailmvp 感觉二者非常像,都是pub/sub机制,如何进行区分 ...
- 关于Windows Phone平台音乐播放的的技术调研
希望看到这篇文章的开发者能提供你们的想法,让我们一起来探讨一款wp平台上面一款能流畅播放.能流畅拖拽进入条.只发一次请求就可以缓存的最好的播放器.希望大家能对我下面遇到的问题作出回答. 现在出了Win ...
- 【分布式】RPC初探
事先声明:本文代码参考自Dubbo作者的博客. RPC(Remote Procedure Call)远程过程调用,是分布式系统当中必不可少的一个玩意.比如说在单机系统当中,我想调用某个方法,直接调就可 ...
- EPANET中的哈希文件——hash.c
/*-----------------------------------------------------------------------------** hash.c**** Imp ...
- sprint3(第三天)
今天在做的任务是整合前台和后台,使前台可以从后台得到数据 燃尽图:
- 【JavaScript回顾】闭包
什么是闭包? 闭包是指有权访问另一个 函数作用域中的变量的函数(也就是说,你这个函数用到的变量另外一个域的就算闭包) <script> function f1() { var age = ...
- jQuery实现隐藏标签
要求:用户进入该页面时,品牌列表默认是精简显示,用户可以单击商品列表下方的“显示全部品牌”按钮来显示全部的品牌. <%@ Page Language="C#" Inherit ...
- sencha treestore 取消自动加载数据
gridstore在设置了autoLoad=false后不会自动加载数据,但是treestore不行,后来发现删掉root里的expanded:true后就可以了.但是界面上树没有展开,需在store ...
- 取值:webconfig中的key
String rootUrl = System.Configuration.ConfigurationManager.AppSettings["SiteDomain"].ToStr ...