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¶m2" } |
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)" ]; |
这三种使用方式可以根据实际情况进行适当使用
分类:
Hybrid Coding
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了