JS和IOS进行交互
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS和IOS进行交互相关的知识,希望对你有一定的参考价值。
各位大神,你们好。 我现在想达到在JS中调用Objective-C中的方法,来传数据。 效果为只需要在JS页面添加一个对象就可以调用Objective-C的方法,其他的什么都不用。 方案1:使用javascriptcore,但是我发现它是把JS加载进context环境里面运行,而不是把值... 各位大神,你们好。 我现在想达到在JS中调用Objective-C中的方法,来传数据。 效果为只需要在JS页面添加一个对象就可以调用Objective-C的方法,其他的什么都不用。 方案1:使用javascriptcore,但是我发现它是把JS加载进context环境里面运行,而不是把值传到JS页面去,所以这个方法不行。另外,我只看到了OC调用JS方法的例子,没看到其他的例子。 方案2:是使用window对象, //通过此回调,将self传递给JS环境 - (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowObject forFrame:(WebFrame *)frame [windowObject setValue:self forKey:@"native"]; 这样就可以把整个类对象暴漏给JS环境了,其实质是把类对象设置成window的属性,但是不知道咋回事这个方法不好使,没法用,类型也找不着,为生命啥的。 所以这个解决方案也失败了。 方案3:使用bridge组件,那个组件必须要在JS界面添加代码,这个是不符合要求的。 我实在是没办法了,求大神帮忙吧。 谢谢!!! 展开
参考技术A 如果想不修改js就直接调用OC是不可能的WebViewJavascriptBridge组件是相对比较完整的解决方案
iOS下JS与原生的交互二
本篇主要讲的是UIWebView和JS的交互,UIWebView和JS交互的详解https://www.cnblogs.com/llhlj/p/6429431.html
一. WKWebView调用JS
[webView evaluateJavaScript:@"我是JS" completionHandler:^(id _Nullable response, NSError * _Nullable error) { }];
该方法为异步执行
二.JS调用OC
当JS端想传一些数据给iOS.那它们会调用下方方法来发送.
window.webkit.messageHandlers.<对象名>.postMessage(<数据>)
上方代码在JS端写会报错,导致页面后面业务不执行.可使用try-catch
执行.
那么在OC中的处理方法如下.它是WKScriptMessageHandler的代理方法.name和上方JS中的对象名相对应.
- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;
具体添加如下
1.设置addScriptMessageHandler的代理和名称
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; WKUserContentController *userContentController = [[WKUserContentController alloc] init]; [userContentController addScriptMessageHandler:self name:@"对象名"]; configuration.userContentController = userContentController; // WKPreferences *preferences = [WKPreferences new]; preferences.javaScriptCanOpenWindowsAutomatically = YES; // preferences.minimumFontSize = 40.0; configuration.preferences = preferences; _webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, WIDTH, HEIGHT64) configuration:configuration];
2.WKScriptMessageHandler协议方法
- (void)userContentController:(nonnull WKUserContentController *)userContentController didReceiveScriptMessage:(nonnull WKScriptMessage *)message { //js调用oc if ([message.name isEqualToString:@"对象名"]) { //具体逻辑 NSLog(@"---------%@",message.body);//message.boby就是JS里传过来的参数 } }
3.销毁
- (void)dealloc { ... [[_webView configuration].userContentController removeScriptMessageHandlerForName:@"对象名"]; ... }
以上是关于JS和IOS进行交互的主要内容,如果未能解决你的问题,请参考以下文章