欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用JavaScriptCore实现OC和JS交互详解

程序员文章站 2022-07-04 21:48:52
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种情况

  1. js调用oc
  2. js调用oc并传递参数
  3. oc调用js
  4. 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已上传,需要的可以点此下载查看。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。