当前位置: 首页 > news >正文

iOS:OC与JS交互

目的是为了在webView页面截取到js操作,然后跳出到本地进行处理

第一种方法:使用原生的处理方式

1.下边是本地的a.html的源代码

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8"/>
        <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
        <meta name="viewport"
        content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
        <script>
            function test() {
                alert('clicked');
            }
        function testParams(a, b){
            alert(a+b);
        }
        </script>
    </head>
    <body>
        <button onclick="test()">点击我</button>
        <button onclick="testParams('hello', 123)">点击我(带参数)</button>
    </body>
</html>

2.导入JavaScriptCore.framework,在需要调用的web页面加上头文件#import <JavaScriptCore/JavaScriptCore.h>

3.打开本地html文件

 //打开本地html文件
    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"a" ofType:@"html"];
    NSURL *url = [NSURL fileURLWithPath:filePath];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.webView loadRequest:request];

4.开始截获

- (void)webViewDidFinishLoad:(UIWebView *)webView {
   
    JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    context[@"test"] =  ^() {
        NSLog(@"在这里便可以捕获到函数名为test的操作,这个操作不带参数");
    };
    context[@"testParams"] =  ^(id data,id secondData) {
        NSLog(@"在这里便可以捕获到函数名为testParams的操作,这个操作带两个参数");
        NSLog(@"第一个参数是%@,第二个参数是%@",data,secondData);
        NSArray *args = [JSContext currentArguments];
        for (id obj in args) {
            NSLog(@"遍历每一个参数,%@",obj);
        }
    };
}

 

第二种方法:使用github上的WebViewJavascriptBridge封装库

1.引入头文件 #import "WebViewJavascriptBridge.h",添加@property WebViewJavascriptBridge* bridge;

2.开始添加拦截

if (_bridge) {
        return;
    }
    [WebViewJavascriptBridge enableLogging];
    _bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView];
    
    [_bridge registerHandler:@"hubOrderUpdateDeliveryDate" handler:^(id data, WVJBResponseCallback responseCallback) {
        NSDictionary * dataDict = data;
        NSLog(@"testObjcCallback called: %@", data);
        //在此处进行拦截
    }];

**这个封装库,要求JS函数也按照一定标准写

**WebViewJavascriptBridge有很多方法,包括OC调用JS,JS调OC,很方便,推荐给大家

转载于:https://www.cnblogs.com/heyuanbo/p/5309910.html

相关文章:

  • 从C到iOS基础知识各阶段的书籍及提高实战图书推荐
  • [nginx] 网上最全面nginx教程(近100篇文章整理)
  • ios工程文件的重命名
  • Linux基础命令小结(下)
  • Python~字典
  • 回顾下最小重量机器设计问题
  • python urlencode 编码
  • Core Data
  • c++两个类相互调用需要注意的问题
  • sizeof的主要用法
  • 多线程在VC下和linux下的应用
  • js中substring和substr的用法比较
  • 理解JavaScript定时器:setTimeout和setInterval
  • 13、jQueryMobile知识总结
  • 控件函数对话框上的控件的大小和位置随着对话框的大小的改变而变化
  • [iOS]Core Data浅析一 -- 启用Core Data
  • CSS 专业技巧
  • echarts的各种常用效果展示
  • JavaScript学习总结——原型
  • Koa2 之文件上传下载
  • MD5加密原理解析及OC版原理实现
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue 配置sass、scss全局变量
  • Vue2 SSR 的优化之旅
  • 服务器从安装到部署全过程(二)
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 三分钟教你同步 Visual Studio Code 设置
  • 深入浅出Node.js
  • 新书推荐|Windows黑客编程技术详解
  • MyCAT水平分库
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (1)常见O(n^2)排序算法解析
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Java)【深基9.例1】选举学生会
  • (接口自动化)Python3操作MySQL数据库
  • (九)c52学习之旅-定时器
  • (三)模仿学习-Action数据的模仿
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)详解PHP处理密码的几种方式
  • ******之网络***——物理***
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET Standard 的管理策略
  • .NET 设计模式初探
  • .NET多线程执行函数
  • .NET委托:一个关于C#的睡前故事
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [android] 请求码和结果码的作用
  • [C/C++] C/C++中数字与字符串之间的转换
  • [C++]:for循环for(int num : nums)
  • [C++]二叉搜索树
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)