使用JavaScriptCore实现OC和JS交互详解
程序员文章站
2022-04-10 18:32:38
javascriptcore
javascriptcore是webkit的一个重要组成部分,主要是对js进行解析和提供执行环境。ios7后苹果在iphone平台推出,极大...
javascriptcore
javascriptcore是webkit的一个重要组成部分,主要是对js进行解析和提供执行环境。ios7后苹果在iphone平台推出,极大的方便了我们对js的操作。
首先创建webview,读取本地的html文件
nsurl* htmlurl = [[nsbundle mainbundle] urlforresource: @"demo" withextension: @"html"]; [_webview loadrequest: [nsurlrequest requestwithurl: htmlurl]];
在demo中,我们要实现4种情况
- js调用oc
- js调用oc并传递参数
- oc调用js
- oc调用js并传递参数
html文件中代码如下
<html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <script type="text/javascript"> function showalert(){ alert('oc call js with no argument'); } function showalertwithstring(string){ alert(string); } function callocwithargument() { jscallocwithargument('参数1 ','参数2 ','参数3'); } </script> </head> <body> </br> </br> </br> </br> <form> <button type='button' onclick='calloc()'>jscalloc</button> <button type='button' onclick='callocwithargument()'>jscallocwithargument</button> </form> </body> </html>
js调用oc
在webview的代理方法webviewdidfinishload中
-(void)webviewdidfinishload:(uiwebview *)webview { _context = [webview valueforkeypath:@"documentview.webview.mainframe.javascriptcontext"]; __weak typeof(self) weakself = self; _context.exceptionhandler = ^(jscontext *context, jsvalue *exception) { weakself.context.exception = exception; }; //js调用oc _context[@"calloc"] = ^() { nsarray *args = [jscontext currentarguments]; for (jsvalue *jsval in args) { nslog(@"%@", jsval.tostring); } dispatch_async(dispatch_get_main_queue(), ^{ uialertcontroller *alertview = [uialertcontroller alertcontrollerwithtitle:@"arguments" message:@"js call oc with no argument" preferredstyle:uialertcontrollerstylealert]; uialertaction * action = [uialertaction actionwithtitle:@"done" style:uialertactionstyledefault handler:^(uialertaction * _nonnull action) { }]; [alertview addaction:action]; [weakself presentviewcontroller:alertview animated:yes completion:nil]; }); }; _context[@"jscallocwithargument"] = ^() { nsarray *args = [jscontext currentarguments]; nsmutablestring * stirng = [nsmutablestring string]; for (jsvalue * value in args) { [stirng appendstring:value.tostring]; } dispatch_async(dispatch_get_main_queue(), ^{ uialertcontroller *alertview = [uialertcontroller alertcontrollerwithtitle:@"arguments" message:stirng preferredstyle:uialertcontrollerstylealert]; uialertaction * action = [uialertaction actionwithtitle:@"done" style:uialertactionstyledefault handler:^(uialertaction * _nonnull action) { }]; [alertview addaction:action]; [weakself presentviewcontroller:alertview animated:yes completion:nil]; }); }; }
我们定义一个block,然后保存到context里面,其实就是转换成了js中命名为calloc的function。然后我们直接执行这个function,调用的就是我们的block里面的内容了。
传过来的参数可以通过[jscontext currentarguments]这个array接受,里面是jsvalue对象。
oc调用js
初始化两个button,在点击事件中实现如下方法
- (ibaction)calljs:(id)sender { [_context evaluatescript:@"showalert()"]; } - (ibaction)calljswitharguments:(id)sender { [_context evaluatescript:@"showalertwithstring('oc call js with arguments')"]; // [_context[@"showalertwithstring"] callwitharguments:@[@"oc call js with arguments"]]; }
即可实现oc调用js。
demo已上传,需要的可以点此下载查看。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
上一篇: JS闭包用法实例分析
推荐阅读
-
使用JavaScriptCore实现OC和JS交互详解
-
iOS OC与JS的交互(JavaScriptCore实现)
-
详解使用JavaScriptCore实现OC和JS交互的示例代码
-
详解如何使用JS和canvas实现gif动图的停止和播放
-
详解使用JavaScriptCore实现OC和JS交互的示例代码
-
使用JavaScriptCore实现OC和JS交互详解
-
如何使用CSS和Vanilla.js实现展示苹果设备的交互动画(附源码)
-
详解如何使用JS和canvas实现gif动图的停止和播放
-
如何使用CSS和Vanilla.js实现展示苹果设备的交互动画(附源码)
-
iOS OC与JS的交互(JavaScriptCore实现)