WKWebView和WebView与JS的交互方式

UIWebView与JS的交互方式

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

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

使用方式:
OC部分:

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

 JS部分:

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

 

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

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

使用方式:
JS部分:

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

 OC部分:

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

 

WKWebView与JS的交互方式

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

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

使用方式:
OC部分:

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

 JS部分:

1
2
3
function playSount() {
    //playSount...
}

 

二,JS调用OC

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

1
2
3
4
5
6
//创建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的调用

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

 JS部分:

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

 

利用JavaScriptCore库,WebView与JS的交互 

一,OC调用JS

1
2
3
4
5
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

1
2
3
4
5
6
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协议

1
2
3
4
5
@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协议,并实现它什么的方法与属性

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@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.使用方式:

1
2
3
4
5
6
7
8
9
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)"];

 

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

 

posted @   滴水微澜  阅读(5347)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示