UIWebView与JS的交互方式

一,OC调用JS
直接调用苹果提供的API

- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

使用方式:
OC部分:

[self.webView stringByEvaluatingJavaScriptFromString:@"add(1,2)"];

JS部分:

function add(a,b) {
return a+b;
}

二,JS调用OC
OC处理JS的时机在UIWebView的代理方法内

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

使用方式:
JS部分:

function btnClick1() {
location.href = "jsCallBack://method_?param1&param2"
}

OC部分:

NSString *schem = webView.request.URL.scheme;
if ([schem containsString:@"jsCallBack://"]) {
//action...
return NO;
}

WKWebView与JS的交互方式

一,OC调用JS
调用苹果提供的API

- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;

使用方式:
OC部分:

 [self.wkWebView evaluateJavaScript:@"playSount()" completionHandler:nil];

JS部分:

function playSount() {
//playSount...
}

二,JS调用OC

OC部分:
这种使用方式比较麻烦一些
1.在创建wkWebView时,需要将被js调用的方法注册进去

//创建WKWebViewConfiguration文件
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.preferences.minimumFontSize = 10.f;
[config.userContentController addScriptMessageHandler:self name:@"playSound"];
//创建WKWebView类
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];

2.在WKScriptMessageHandler代理方法中监听js的调用

#pragma mark - WKScriptMessageHandler
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { if ([message.name isEqualToString:@"playSound"]) {
[self playSound];
}
}

JS部分:

//JS响应事件
function btnClick() {
window.webkit.messageHandlers.playSound.postMessage(null);
}

利用JavaScriptCore库,WebView与JS的交互 

一,OC调用JS

    self.jsContent = [[JSContext alloc] init];

    NSString *js = @"function add(a,b) {return a + b}";
[self.jsContent evaluateScript:js];
JSValue *jsValue = [self.jsContent[@"add"] callWithArguments:@[@2,@3]];

二,JS调用OC

    self.jsContent = [[JSContext alloc] init];
self.jsContent[@"add"] = ^(int a, int b){
NSLog(@"a+b = %d",a+b);
}; [self.jsContent evaluateScript:@"add(10,20)"];

三,JS直接访问OC对象方法与属性

1.首先定义一个协议,这个协议遵守JSExport协议

@protocol JSExportTest <JSExport>
@property (nonatomic, assign) NSInteger sum;
JSExportAs(add, - (NSInteger)add:(int)a b:(int)b); @end

其中JSExportAs()是系统提供的宏,用来声明在JS环境中方法add与OC环境中方法- (NSInteger)add:(int)a b:(int)b对应。

2.创建一类,遵守JSExportTest协议,并实现它什么的方法与属性

@interface JSProtolObj : NSObject <JSExportTest>

@end

@implementation JSProtolObj

@synthesize sum = _sum;

- (NSInteger)add:(int)a b:(int)b {

    return a+b;
} - (void)setSum:(NSInteger)sum { _sum = sum;
} @end

3.使用方式:

    self.jsContent = [[JSContext alloc] init];

    self.jsContent.exceptionHandler = ^(JSContext *context, JSValue *exception) {
[JSContext currentContext].exception = exception;
NSLog(@"exception:%@",exception);
}; self.jsContent[@"OCobj"] = self.jsProtolObj;
[self.jsContent evaluateScript:@"OCobj.sum = OCobj.add(10,20)"];

这三种使用方式可以根据实际情况进行适当使用

最新文章

  1. dotnet获取PDF文件的页数
  2. css padding 填充
  3. 立即执行函数: (function(){...})() 与 (function(){...}()) 有什么区别?
  4. Web的Ajax应用开发模式(二)——Ajax开发模式分析
  5. (转)Genymotion安装virtual device的“unable to create virtual device, Server returned Http status code 0”的解决方法
  6. sql 语句总结
  7. css案例学习之div a实现立体菜单
  8. Python3.2官方文件翻译--课堂笔记和异常是阶级
  9. 如何使用HTTPS防止流量劫持
  10. 对deep learning的第一周调研
  11. 写好Java代码的30条经验总结(转)
  12. 海量数据挖掘MMDS week5: 聚类clustering
  13. [物理学与PDEs]第5章习题10 多凸函数一个例子
  14. Window上安装—Docker 笔记
  15. 自定义Dialog的详细步骤(实现自定义样式一般原理)
  16. mysql----------mysql5.7如何配置主从数据库
  17. JAVA 项目中使用 H2 数据库
  18. 元素随屏幕滚动到顶部固定js效果
  19. XMLHelper类 源码(XML文档帮助类,静态方法,实现对XML文档的创建,及节点和属性的增、删、改、查)
  20. ACCESS表的视图

热门文章

  1. 【Alpha】阶段总结报告
  2. 从Firefox升级说学习方法
  3. bug终结者 团队作业第二周
  4. 学号:201621123032 《Java程序设计》第6周学习总结
  5. 项目Beta冲刺Day1
  6. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
  7. 不看就亏了:DELL EqualLogic PS6100详解及数据恢办法
  8. 构建自己的PHP框架--构建模版引擎(3)
  9. 在bootstrap中让竖向排列的输入框水平排列
  10. selenium多个标签页的切换(弹出新页面的切换)