全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

IOS与网页JS交互详解及实例

 IOS与网页JS交互

随着移动APP的快速迭代开发趋势,越来越多的APP中嵌入了html网页,但在一些大中型APP中,尤其是电商类APP,html页面已经不仅仅满足展示功能,这时html要求能与原生语言进行交互、相互传值。比如携程APP中一个热门景点的网页中,点击某个景点,可以跳转到原生中的该景点详情页控制器。

为此,我整理了三种最常用最便捷有效的OC与JS交互的方式,供大家学习交流。

第一种:JS给OC传值。

1. 技术方案:使用JavaScriptCore.framework框架

2. 使用场景: 网页中代码中的某个方法,比如点击事件方法,将该方法的参数传值给OC,供OC使用。

比如:携程APP中一个热门景点的网页中,有很多个热门景点,点击某个景点的图片或名称,可以跳转到原生中的该景点详情页控制器。

3. 代码实现如下:

OC里要实现的代码:

拖入JavaScriptCore.framework静态库,遵守UIWebViewDelegate代理协议。

在-webViewDidFinishLoad:方法里编写如下代码:

- (void)webViewDidFinishLoad:(UIWebView *)webView{

  JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

  context[@"passValue"] = ^{

    NSArray *arg = [JSContext currentArguments];
    for (id obj in arg) {
      NSLog(@"%@", obj);
    }
  };

}

其中 passValue 是JS的函数名,得到的 arg数组 里面为JS的 passValue 函数的参数,即 JS要传给OC的参数。

JS里要实现的代码:

function testClick()
      {
        var str1=document.getElementById("text1").value;
        var str2=document.getElementById("text2").value;

        passValue(str1,str2);
      }

在需要给OC传值的函数里(例如:testClick())直接调用 passValue()函数,将值传进去即可。

第二种:JS给OC传值。

1. 技术方案:使用自定义url方法,每次点击网页

2. 使用场景: 网页中代码中的某个方法,比如点击事件方法,将该方法的参数传值给OC,供OC使用。

比如:携程APP中一个热门景点的网页中,有很多个热门景点,点击某个景点的图片或名称,可以跳转到原生中的该景点详情页控制器。

3. 代码实现如下:

JS里要实现的代码:

 function testClick()
      {

        var str1=document.getElementById("text1").value;
        var str2=document.getElementById("text2").value;

        // "objc://"为自定义协议头;
        // str1&str2为要传给OC的值,以":/"作为分隔
        window.location.href="objc://"+":/"+str1+":/"+str2;
      }

在需要给OC传值的函数里(例如:testClick())写如上格式的代码。

其中 objc:// 是自定义的协议头,str1与str2为JS要传给OC的值。

OC里要实现的代码:

//遵守UIWebViewDelegate代理协议。
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
  //拿到网页的实时url
  NSString *requestStr = [[request.URL absoluteString] stringByRemovingPercentEncoding];

  //在url中寻找自定义协议头"objc://"
  if ([requestStr hasPrefix:@"objc://"]) {

    // 以"://"为中心将url分割成两部分,放进数组arr
    NSArray *arr = [requestStr componentsSeparatedByString:@"://"];
    NSLog(@"%@",arr);

    //取其后半段
    NSString *paramStr = arr[1];
    NSLog(@"%@",paramStr);

    //以":/"为标识将后半段url分割成若干部分,放进数组arr2,此时arr2[0]为空,arr2[1]为第一个传参值,arr2[2]为第二个传参值,以此类推
    NSArray *arr2 = [paramStr componentsSeparatedByString:@":/"];
    NSLog(@"%@",arr2);

    //取出参数,进行使用
    if (arr2.count) {
      NSLog(@"有参数");
      [self doSomeThingWithParamA:arr2[1] andParamB:arr2[2]];
    }else{
      NSLog(@"无参数");
    }
    return NO;
  }

  return YES;
}
//对JS传来的值进行调用
- (void)doSomeThingWithParamA:(id)paramA andParamB:(id)paramB{

  NSLog(@"%@  %@", paramA, paramB);
}

第三种:利用第三方库实现JS与OC的相互传值。

1. 技术方案:使用WebViewJavascriptBridge三方库

2. 使用场景: 网页中代码中的某个方法,比如点击事件方法,将该方法的参数传值给OC,供OC使用。

比如:携程APP中一个热门景点的网页中,有很多个热门景点,点击某个景点的图片或名称,可以跳转到原生中的该景点详情页控制器。
或者将原生中的用户信息传递给网页,以便其个性化展示

3. 代码实现如下:

OC传值给JS

JS里需要实现的代码:

function setupWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
    if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
    window.WVJBCallbacks = [callback];
    var WVJBIframe = document.createElement('iframe');
    WVJBIframe.style.display = 'none';
    WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
    document.documentElement.appendChild(WVJBIframe);
    setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
  }

  //调用上面定义的函数
  setupWebViewJavascriptBridge(function (bridge){

    //OC传值给JS 'testJavascriptHandler'为双方自定义好的统一方法名;'data'是OC传过来的值;'responseCallback'是JS接收到之后给OC的回调
    bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {
        //打印OC传过来的值
        log('ObjC called testJavascriptHandler with', data)

        var responseData = { 'Javascript Says':'Right back atcha!' }

        log('JS responding with', responseData)

        //给OC的回调
        responseCallback(responseData)

      })

OC里需要实现的代码:

导入第三方库WebViewJavascriptBridge;遵守UIWebViewDelegate;

 //设置第三方Bridge是否可用
  [WebViewJavascriptBridge enableLogging];

  //关联webView和bridge
  _bridge = [WebViewJavascriptBridge bridgeForWebView:web];

  [_bridge setWebViewDelegate:self];

  //OC给JS传值,双方自定义一个统一的方法名'testJavascriptHandler';data里即为要传过去的值
  [_bridge callHandler:@"testJavascriptHandler" data:@{@"年龄":@"20"}];

JS传值给OC

JS里需要实现的代码:

 //点击网页上一个按钮时
   callbackBt.onclick = function()
   { 
   var str1=document.getElementById("text1").value;
   var str2=document.getElementById("text2").value;

   //JS给OC传值。'passValue'为双方自定义的统一方法名;'str1'&'str2'为要传的值; response为OC收到后给JS的回调
   bridge.callHandler('passValue', {str1,str2}, function(response) {
                })

   }

OC里需要实现的代码:

导入第三方库WebViewJavascriptBridge;遵守UIWebViewDelegate;

 //设置第三方Bridge是否可用
  [WebViewJavascriptBridge enableLogging];

  //关联webView和bridge
  _bridge = [WebViewJavascriptBridge bridgeForWebView:web];

  [_bridge setWebViewDelegate:self];

  //js给oc传值.'passValue'为双方自定义的统一方法名;'data'为JS传过来的值;'responseCallback'为OC收到值后给JS返回的回调
  [_bridge registerHandler:@"passValue" handler:^(id data, WVJBResponseCallback responseCallback) {

    //打印js传过来的值
    NSLog(@"%@", data);

    //返回给js的值
    responseCallback(@"收到了");
  }];

需要注意的是:不论哪方给哪方传值,传值的方法名称与对应接收值的方法名称要保持一致。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# IOS与网页JS交互  # IOS与网页JS交互实例详解  # IOS网页JS  # iOS中的NSURLCache数据缓存类用法解析  # Objective-C的缓存框架EGOCache在iOS App开发中的使用  # C++开发在IOS环境下运行的LRUCache缓存功能  # 使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)  # iOS 条码及二维码扫描(从相册中读取条形码/二维码)及扫码过程中遇到的坑  # iOS实现时间显示几分钟前  # 几小时前以及刚刚的方法示例  # IOS正则表达式判断输入类型(整理)  # iOS 仿百度外卖-首页重力感应的实例  # IOS 开发之应用唤起实现原理详解  # IOS TextFiled与TextView 键盘的收起以及处理键盘遮挡  # IOS Cache设计详细介绍及简单示例  # 自定义  # 第三方  # 有很多  # 回调  # 携程  # 跳转到  # 详情页  # 将该  # 的是  # 第一个  # 尤其是  # 但在  # 以此类推  # 希望能  # 第二个  # 三种  # 谢谢大家  # 收到了  # 能与  # 即为 


相关文章: 如何基于PHP生成高效IDC网络公司建站源码?  定制建站价位费用解析与套餐推荐全攻略  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  c# Task.ConfigureAwait(true) 在什么场景下是必须的  赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?  建站VPS推荐:2025年高性能服务器配置指南  建站主机CVM配置优化、SEO策略与性能提升指南  中山网站推广排名,中山信息港登录入口?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  宝塔建站助手安装配置与建站模板使用全流程解析  黑客如何利用漏洞与弱口令入侵网站服务器?  如何获取开源自助建站系统免费下载链接?  微课制作网站有哪些,微课网怎么进?  如何快速搭建安全的FTP站点?  高性价比服务器租赁——企业级配置与24小时运维服务  建站之星客服服务时间及联系方式如何?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  如何在橙子建站上传落地页?操作指南详解  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  网站制作服务平台,有什么网站可以发布本地服务信息?  如何挑选高效建站主机与优质域名?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  太平洋网站制作公司,网络用语太平洋是什么意思?  建站之星如何助力网站排名飙升?揭秘高效技巧  如何快速上传自定义模板至建站之星?  建站主机选虚拟主机还是云服务器更好?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  建站主机是否属于云主机类型?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  已有域名和空间,如何快速搭建网站?  如何在宝塔面板中创建新站点?  如何快速搭建二级域名独立网站?  广州美橙建站如何快速搭建多端合一网站?  已有域名和空间如何搭建网站?  如何通过虚拟主机快速搭建个人网站?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何快速搭建高效香港服务器网站?  如何在宝塔面板创建新站点?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  重庆市网站制作公司,重庆招聘网站哪个好?  学校为何禁止电信移动建设网站?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  建站之星安装提示数据库无法连接如何解决?  建站之星图片链接生成指南:自助建站与智能设计教程  如何高效利用200m空间完成建站?  如何高效配置IIS服务器搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。