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)" ];

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

猜你喜欢

转载自www.cnblogs.com/cy521/p/10031172.html