博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UIWebView中Objective C和JavaScript通信
阅读量:6997 次
发布时间:2019-06-27

本文共 1921 字,大约阅读时间需要 6 分钟。

JS和OC的交互,使用到JavaScriptCore这个框架,用到的类和协议有JSExportJSContext

网页很简单,只有一个button按钮,button按钮的事件点击主要执行了wst.duobao('123');wst是自定义的一个普通JS对象,在OC中需要使用到wst捕获对应的js方法调用。

网页html代码如下:

    
html5page-oc 复制代码

OC处理JS的事件回调,主要步骤

  1. 定义JSContext的对象jsContext
  2. 在WebView的代理方法webViewDidFinishLoad:中调用[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]获取到JSContext的对象。
  3. 调用_jsContext[@"wst"] = self;注册JS中的对象wst派发的方法的处理模块,这里是把处理wst模块的代理设置为当前类,实际中如果有多个模块可以使用一个自定义的实现JSExport来单独处理JS的逻辑,本例中有实现了JSExport协议的自定义协议JavaScriptObjectiveCDelegate,具体看第4点
  4. 自定义继承JSExport协议JavaScriptObjectiveCDelegate,这边定义JS和OC交互的接口。
  5. 实现JavaScriptObjectiveCDelegate,重写对应的方法处理JS的回调,注意JS回调的方法是在子线程执行的,如果涉及到UI操作,需要派发到主线程中处理。

OC调用JS方法

调用JSContext的方法evaluateScript,参数为JS代码即可

[_jsContext evaluateScript:@"alert('oc call js')"];复制代码

完整的代码如下:

// 自定义继承`JSExport`协议,这边定义JS和OC交互的接口@protocol JavaScriptObjectiveCDelegate 
- (void)duobao(NSString*)params;@end@interface YTTWebViewController ()
@property (nonatomic, strong) UIWebView *webView;@property (nonatomic, strong, readonly) JSContext *jsContext;@end// ...- (void)webViewDidFinishLoad:(UIWebView *)webView{ if (_jsContext == nil) { // 1.从WebView中获取到JSContext对象 _jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; // 2. 关联打印异常 _jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) { context.exception = exceptionValue; NSLog(@"异常信息:%@", exceptionValue); }; _jsContext[@"wst"] = self; } // OC调用JS [_jsContext evaluateScript:@"alert('oc call js')"];}#pragma mark - JavaScriptObjectiveCDelegate-(void)duobao { // JS调用OC是在子线程 NSLog(@"current thread = %@", [NSThread currentThread]); dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"js call oc"); });}复制代码

转载于:https://juejin.im/post/5ca5d48ef265da309d08a3a2

你可能感兴趣的文章
正文处理命令及tar命令
查看>>
实习第三周小记-----生活在于经历 分类: 程序人生 ...
查看>>
将excel中的数据转为json格式
查看>>
字典操作
查看>>
[洛谷P2839][国家集训队]middle
查看>>
《求一个数组的连续的最大子数组之和》
查看>>
设置行间距,自适应文字大小
查看>>
资金流学习-广州发展
查看>>
python基础3(元祖、字典、深浅copy、集合、文件处理)
查看>>
正确编写Designated Initializer的几个原则
查看>>
iOS播放动态GIF图片
查看>>
获取版本号
查看>>
使用jdk自带的visualVM监控远程监控was
查看>>
集合视图UICollectionView 介绍及其示例程序
查看>>
JsLint 的安装和使用
查看>>
合并傻子//区间dp
查看>>
让IE和Chrome都以隐身模式启动
查看>>
MyPython-->进阶篇-->类
查看>>
unity remote 连接设置
查看>>
2018 NOIP备战计划
查看>>