OC 与 JS 交互 (UIWebView & WKWebView)

iOS UIWebView和WKWebView的JS调用详解 一般应用开发,用到webview和JS交互的地方特别多,当然也有很多优秀的第三方可以使用,例如:WebViewJavascriptBridge,有兴趣的可以研究下,非常好用的一个框架,本文主要概括下苹果提供的原声控件和JS互相简单调用。webview以及WKWebView。      iOS8.0之前,苹果只提供UIwebview一个控件,这个控件JS调用OC主要通过UIwebview的代理方法 阅读详情

iOS8以后,苹果推出了新框架Webkit,提供了替换UIWebView的组件WKWebView。WKWebView 的优势不必多说,这里将两者与 JS 的交互分别做对比.

首先,和前端以及安卓同学定义好一样的方法:
js 调用原生: jsCallNativeDoSomethingWithParams()
原生调用js: nativeCallJSSendParams()

UIWebView 与 JS 的交互
引入库

#import <JavaScriptCore/JavaScriptCore.h>

加载 html

    NSURL *url = [NSURL URLWithString: @"www.baidu.com"];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url];
     //如果需要在加载请求的时候用 post 请求传参数的话,加上下面三句.WKWebView这个方式不行,下面有解决方法
     NSString *body = [NSString stringWithFormat: @"arg1=%@&arg2=%@", @"val1",@"val2"];
    [request setHTTPMethod: @"POST"];
    [request setHTTPBody: [body dataUsingEncoding: NSUTF8StringEncoding]];

    [self.webView loadRequest: request];

js 调用原生的两种方式:

第一种: 采用协议方法
添加协议并遵守

@protocol TestJSExport <JSExport>
- (void)jsCallNativeDoSomethingWithParams:(NSString *) jsonStr;
@end

@interface JSCallOCViewController : UIViewController<UIWebViewDelegate,TestJSExport>

@end

然后再把方法进行关联

#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

    // 打印异常
    self.context.exceptionHandler =
    ^(JSContext *context, JSValue *exceptionValue)
    {
        context.exception = exceptionValue;
        NSLog(@"异常 %@", exceptionValue);
    };

    // 以 JSExport 协议关联 native 的方法
    self.context[@"native"] = self;
}

#pragma mark - JSExport Methods

- (void)jsCallNativeDoSomethingWithParams:(NSString *) jsonStr
{
    NSLog(@"%@", jsonStr);
}

js 中的相关代码

 <input type="button" value="call native" onclick="native.jsCallNativeDoSomethingWithParams(input.value);" />
            <br/>

第二种,以 block 形式关联

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
     self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

    // 打印异常
    self.context.exceptionHandler =
    ^(JSContext *context, JSValue *exceptionValue)
    {
        context.exception = exceptionValue;
        NSLog(@"异常 %@", exceptionValue);
    };
    self.context[@"jsCallNativeDoSomethingWithParams"] =
    ^(NSString *jsonStr)
    {
        NSLog(@"%@", jsonStr);
    };

}

js 相关代码

  <input type="button" value="调用原生" onclick="jsCallNativeDoSomethingWithParams('json');" />

原生调用js

- (void) nativeCallJSSendParams:(NSString *)jsonStr {
    NSNumber *inputNumber = [NSNumber numberWithInteger:[self.textField.text integerValue]];
    JSValue *function = [self.context objectForKeyedSubscript:@"nativeCallJSSendParams"];
    JSValue *result = [function callWithArguments:jsonStr];
    NSString * jsonStr = [NSString stringWithFormat:@"%@", [result toString]];
}

WKWebView 与 JS 的交互

注: WKWebView 有一个bug ,就是第一次在加载 url 的时候是无法使用 post 传参数的,因为请求过程中,请求体会丢失,所以,如果实在需要传值,可以再加载好之后,用原生调用 js 方法传值(下面会有介绍),参考:
https://stackoverflow.com/questions/26253133/cant-set-headers-on-my-wkwebview-post-request

引入库

#import <WebKit/WebKit.h>

继承代理

@interface UIViewController ()<WKNavigationDelegate, WKUIDelegate,WKScriptMessageHandler>

正常加载页面

 - (void)viewDidLoad
{
    [super viewDidLoad];

    [self.view addSubview:self.newsWebView];

    NSURL *url = [NSURL URLWithString: @"你的url"];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url];
    [self.newsWebView loadRequest: request];
}


#pragma mark - WKScriptMessageHandler

//js 调用 原生
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {

    NSLog(@"jsCallNativeMessageBody ==> %@", message.body);

    if ([message.name isEqualToString:@"jsCallNativeDoSomethingWithParams"]) {
        [self jsCallNativeDoSomethingWithParams:message.body];
    }
}

//原生 调用 js
- (void) nativeCallJSSendParams:(NSString *)jsonStr {
    //注意:这里得把json字符串去掉空格,回车才可以,不然会报错
    NSString * paramStr = [self noWhiteSpaceString:jsonStr];
    NSString *returnJSStr = [NSString stringWithFormat:@"nativeCallJSSendUserMessage('%@')",paramStr];

    [self.newsWebView evaluateJavaScript:returnJSStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
        NSLog(@"nativeCallJSSendParams result = %@,error = %@", result, error);
    }];
}

- (NSString *)noWhiteSpaceString: (NSString *)newString {
    newString = [newString stringByReplacingOccurrencesOfString:@"\r" withString:@""];
    newString = [newString stringByReplacingOccurrencesOfString:@"\n" withString:@""];
    newString = [newString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];      
    newString = [newString stringByReplacingOccurrencesOfString:@" " withString:@""];
      return newString;
}


#pragma mark - getter
- (WKWebView *)newsWebView {
    if (!_newsWebView) {
        WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
        configuration.userContentController = [[WKUserContentController alloc] init];
        [configuration.userContentController addScriptMessageHandler:self name:@"jsCallNativeDoSomethingWithParams"];
        _newsWebView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
        _newsWebView.UIDelegate = self;
        _newsWebView.navigationDelegate = self;
    }
    return _newsWebView;
}

另外告知前端同学(如果需要的话)添加对应 js 的方式:

    function showMessageFromWKWebViewClick() {            
        window.webkit.messageHandler.nativeCallJSSendParams.postMessage('js调用原生'); 
    }

    function nativeCallJSSendParams(returnStr) {

        document.getElementById("oneEle").value = returnStr;
                    alert(returnStr);
    }
sendjs:http请求 sendjs sendjs是一个请求库 浏览器支持 最新的 :check_mark: 最新的 :check_mark: 最新的 :check_mark: 最新的 :check_mark: 最新的 :check_mark: 9+ :check_mark: 安装 npm install sendjs-保存 进口 从&#39;sendjs&#39;导入sendjs; 例子 获取方法sendjs.get(URL,data,config).then()。then()。catch() sendjs . get ( &#39;/user&#39; , { age : 23 } ) . then ( function ( response ) { // handle success console . log ( response ) ; } ) . catch ( function ( error ) { // handle error console . log ( error ) ; 立即下载

相关推荐

ArcGIS小白必看:5分钟搞定shp矢量文件分割(附常见错误排查)

本文为ArcGIS新手详细解析了分割shp矢量文件的四种核心方法:裁剪工具、分割工具、按属性选择导出及ArcPy脚本自动化。重点强调了投影匹配等关键步骤,并提供了常见错误排查指南,帮助用户快速掌握矢量数据分割技巧,提升GIS数据处理效率。

h9j8k7l6m5n的博客 798

ios js与oc原生WKWebView方法注入及交互传值

上篇文章中,我们整理了关于WKWebView的详细使用,包含进度条、获取web title等等内容,这篇文章我们整理下,项目中,我们可能使用到的oc 与 js 原生交互场景下的使用.如有兴趣,可加入oneTeam技术交流群: 234713941 ,本人不才小白,多多指教!      原生加载控件使用的是WKWebView.      1.浏览web页面,点击某个方法,并传值给oc原生,

ONE_PERSON_ONE_LIFE的博客 3万+

从东南大学906被刷到调剂过程(内含个人感想)

介绍了自己在看到初试成绩,到后期复习以及调剂的全过程,当中也包含了自己的复试中的感想,希望大家理性看待。

Philo的博客 2854

iOS WKWebview与JS交互

在APP开发中,调用H5极验功能涉及到原生与JS 交互,我用的是系统原生的方式实现,下面记录下实现步骤。 (仅涉及iOS端工作流程记录) 【OC版本:】 @interface ViewController ()&lt;WKUIDelegate,WKNavigationDelegate,WKScriptMessageHandler&gt; @property(nonatomic, strong)WK...

u010707262的博客 3040

OriginPro实战:5步搞定碳材料拉曼光谱D峰G峰分析(附完整数据处理流程)

本文详细介绍了使用OriginPro进行碳材料拉曼光谱D峰G峰分析的完整流程,涵盖数据预处理、多图层可视化、高精度分峰拟合等关键步骤。特别针对材料科学研究中的基线漂移、多峰重叠等问题提供专业解决方案,帮助研究者快速完成从原始数据到科研级图表的全流程分析,提升碳材料表征效率与准确性。

vodka的博客 942

Oracle19c集群节点故障恢复:从主机重装到重新加入集群的完整指南

本文详细介绍了Oracle19c集群节点故障恢复的全过程,从主机重装到重新加入集群的完整指南。重点讲解了保持集群配置一致性、彻底清理故障节点残留信息和分阶段验证等关键恢复原则,帮助DBA高效解决节点故障问题,确保集群稳定运行。

weixin_42524276的博客 255

JS实现AJAX请求_1

JS实现AJAX请求_1(基础篇) AJAX:全称“Asynchronous JavaScript and XML”   (异步的JavaScript与XML)   AJAX请求的特点:   1,不刷新页面   2,服务器仅返回需要的数据   AJAX引擎:XMLHttpRequest   此对象是浏览器中的内置对象,在目前的所有浏览器中都支持此对象。   IE中获取此对象...

零起点 331

Python在Windows环境下驱动乐视三合一摄像头的深度图像处理实践

本文详细介绍了在Windows系统下,使用Python驱动乐视三合一摄像头进行深度图像处理的完整实践流程。从环境配置、驱动安装、OpenNI与OpenCV库的部署,到深度与彩色数据流的读取、可视化、三维点云转换以及背景移除等应用开发,为开发者提供了从零开始掌握深度摄像头编程的实战指南。

gitlab7runner的博客 231

javascript基础学习系列三百七十四:发送和接收数据

打开 Web Socket 之后,可以通过连接发送和接收数据。服务器向客户端发送消息时,WebSocket 对象上会触发 message 事件。与通过 send()方法发送的数据类似,event.data 返回的数据也可能是 ArrayBuffer 或 Blob。这由 WebSocket 对象的 binaryType 属性决定,该属性可能是"blob"或"arraybuffer"。

m0_68635815的博客 546

目标检测YOLO实战应用案例100讲-基于数据融合的SAR图像中海上目标检测与跟踪(中)

本文使用的数据集为欧空局(European Space Agency, ESA)提供的Sentinal-1 数据集,Sentinel-1是欧洲“哥白尼计划”的SAR卫星机群,主要是用于陆地和海 洋服务的极地轨道全天候昼夜雷达成像任务[ 34]。Sentinel-1A于2014年4月3日发 射升空,Sentinel-1B于2016年4月25日发射升空,每颗卫星都携带C波段SAR, 共同提供地球表面的全天候、昼夜图像。

qq_36130719的博客 355

第6章: MMU Notifier在KVM虚拟化中的应用

本文分析了KVM如何利用MMU Notifier机制维护客户机与宿主机地址映射一致性。KVM采用三层地址空间转换架构(GVA→GPA→HPA),通过硬件辅助虚拟化(EPT/NPT)实现高效转换。重点探讨了KVM MMU Notifier回调实现,包括invalidate_range_start/end等核心函数,以及HVA范围处理流程。当宿主机内存变化时,KVM通过注册的notifier回调及时更新映射关系,确保虚拟化环境的内存一致性。文章详细解析了相关数据结构和关键代码实现,揭示了KVM内存管理的核心机制

图形/计算GPU的驱动与虚拟化技术分享园地 2315

网络编程-JavaScript中发送网络请求汇总

早期的网页都是通过后端渲染来完成的:服务器端渲染(SSR,server side render):服务器端渲染的缺点:有没有办法在页面数据变动时,只向服务器请求新的数据,并且在阻止页面刷新的情况下,动态的替换页面中展示的数据呢?AJAX是“Asynchronous JavaScript And XML”的缩写(异步的JavaScript和XML),是一种实现无页面刷新获取服务器数据的技术。你可以使用AJAX最主要的两个特性做下列事 :这里有两幅图给大家理解一下:什么是HTTP呢?我们来看一下维基百科的解释:

m0_71485750的博客 5482

论文翻译:2024 High-Confidence Computing A survey on large language model (LLM) security and privacy: The

大型语言模型(LLMs),如ChatGPT和Bard,已经彻底改变了自然语言理解和生成。它们具有深度语言理解能力、类似人类的文本生成能力、上下文意识和强大的问题解决技能,使它们在各个领域(例如搜索引擎、客户支持、翻译)中变得不可或缺。同时,LLMs也在安全领域获得了关注,揭示了安全漏洞并展示了它们在安全相关任务中的潜力。本文探讨了LLMs与安全性和隐私的交集。具体来说,我们研究了LLMs如何积极影响安全性和隐私,与它们使用相关的潜在风险和威胁,以及LLMs内部的固有漏洞。

CSPhD-winston的博客 1722

iOS使用WKWebView与JS的交互

前言 WKWebView是iOS8 出来的浏览器控件,用来取代UIWebView 现在2020年 苹果已经不建议使用UIWebView了,所以需要把原来用到的换成WKWebView 本篇文章主要作用是实现JS调用OC,并且OC可以给到回调 WKJSBridge gitHub地址 WKWebView在iOS9才开始完善,所以建议将工程设置成最低支持iOS9 #1.WKWebView调用JS方法 WKWebView调用JS方法是通过直接执行JS代码来实现的 iOS中WK的的方法 evaluateJa.

weixin_41643655的博客 6073

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

WKWebView OC与JS交互

文章目录WKWebView OC与JS交互1. OC调用JS2. JS调用OC3. 总结 WKWebView OC与JS交互 整体上看原理还是挺简单的,即OC端向JS中注入JS脚本或者注入一个事件对象,生成一个时间handeler,当JS触发此事件时,handler处理事件的回调用,实现相互传值和事件交互的效果。 1. OC调用JS OC调用JS方法主要是通过执行javaScript脚本来实现的。 WKWebKit提供的主要方法是:- (void)evaluateJavaScript:(NSString *

竹毛言己 5952

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

OC与JS交互之WKWebView

转载地址:https://www.cnblogs.com/markstray/p/5757264.html OC与JS交互之WKWebView 阅读目录 一、WKWebView Framework 二、WKWebView中的三个代理方法 三、使用WKWebView重写 四、后记 上一篇文章我们使用了JavaScriptCore框架重写了之前的示例,iOS8苹果偏爱HTML...

zwl492454828的专栏 5524

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

iOS JS与OC交互

iOS JS与OC交互 1、UIWebView 与 JS 交互 UIWebView 在 iOS12 中已经被废弃,同时WKWebView在iOS8中已经出现。所以无特殊情况的话,我们一般应该也是用不到前者了! UIWebView 初始化: self.webView = [[UIWebView alloc] initWithFrame:self.view.bounds]; self.webView.delegate = self; [self.view addSubview:self.

kangpp的博客 2978

iOS WKWebView JS原生交互之JS调用OC(附demo)

WKWebView和UIWebView区别和其优缺点 大家都知道自从iOS8之后,推出了WKWebView,相较于UIWebView来说,性能和其稳定性也提高了不少,当然也有它的坑,大家自行选择,这里我用的是WKWebView WKWebView相比于UIWebView浏览器之间内核引擎的区别 JS调用OC 比如网页里有一个返回按钮,点击的时候需要pop到上一层。 OC @interf...

msbaby的博客 6675

iOS WKWebview JS与OC互相调用,传递数据

前言:WKWebView是一个展示交互式web内容的视图,支持iOS8.0及macOS10.10以上的系统。提供了替换UIWebView的组件, WKWebView解决了UIWebView加载速度慢,占用内存多,优化困难等问题,可以说WKWebView是目前App内部加载网页的最佳选择。 目录 1.JS 与 OC 交互 2.OC 向 JS 传递值 1.JS 与 OC 交互 添加注...

俊而不逊的博客 9452

iOS 开发 Object-C和JavaScript交互详解之OC与JS交互在WKWebView中使用

1.OC与JS交互在UIWebView中使用iOS 开发 Object-C和JavaScript交互详解之OC与JS交互在UIWebView中使用2. WKWebView的使用详解iOS开发 WKWebView的使用3.OC与JS交互在WKWebView中使用// // ViewController.m // oc与js交互WKWebView // // Created by zhouyu o

高级软件开发工程师--周玉的博客 5431

iOS oc与js交互详解 之 WKWebView

Xcode8发布以后,编译器开始不支持iOS7,所以很多应用在适配iOS10之后都不在适配iOS7了,其中包括了很多大公司,网易新闻,滴滴出行等。 支持到iOS8,第一个要改的自然是用WKWebView替换原来的UIWebView。WKWebView有很多明显优势: 1、更多的支持HTML5的特性 2、官方宣称的高达60fps的滚动刷新率以及内置手势 3、...

1960

iOS OC与JS交互(WebView监听事件)

在iOS应用的开发过程中,我们经常会使用到WebView,当我们对WebView进行操作的时候,有时会需要进行源生的操作.那么我记下来就与大家分享一下OC与JS交互. 首先先说第一种方法,并没有牵扯OC与JS交互,只是做拦截和跳转. 拦截跳转的URL,跳转源生界面(用起来感觉怪怪的,万一URL更换了怎么办.) UIWebView //UIWebViewDelegate - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithReques.

笔记 4973

UIWebView替换WKWebView看这篇就够了

调研UIWebView和WKWebView的异同 一、UIWebView 介绍 1.UIWebView网页加载展现的几种方法 // 使用 NSURLRequest 的方式加载网页 (url可以是远程也可以是本地) - (void)loadRequest:(NSURLRequest *)request; /*! @brief 加载HTML字符串 * * @param string 为要加载的本地HTML字符串 * @param baseURL 用来确定htmlString的基准地址,相当于HT

兰欣的博客 3606

iOS 边学边记 WKWebView与js交互详解

iOS下OC与JS的交互(WKWebview-MessageHandler实现) 在开发过程中,iOS 中实现加载 web 页面主要有两种控件,UIWebView 和 WKWebview,两种控件对应具体的实现方法不同。 现在苹果公司已经不允许使用webview的app上架,所以只针对WKWebView。 一、 WKWebView的代理方法 1.WKNavigationDelegate 该代理提供的方法,可以用来追踪加载过程(页面开始加载、加载完成、加载失败)、决定是否执行跳转。 // 页面开始加载时调用

一了百-了的博客 5463

UIWebView和WKWebView的对比

1.UIWebView和WKWebView UIWebView 1)UIWebView是iOS2就有了的,占用内存也比较多,内存峰值也挺夸张的 2)UIWebView继承自UIView 是用来加载网页的类,可以简单理解成就是一个view WKWebView 1)相比UIWebView的话,支持更多的HTML5的特性 2)滚动刷新率在60fps以及内置手势 3)添加了加载进度属性:es...

zxc8890304的博客 1847

iOS WKWebView JS 与 原生交互

一些说明: 在iOS开发中难免会用到网页,在iOS 8以前,我们更喜欢使用UIWebView,但是UIWebView有很多弊端,首先它有一个最让人头疼的问题就是内存会暴增,并且释放不掉,而且苹果开放出来的接口相对较少,目前用Xcode 9进行iOS开发,其支持最低的系统版本号为iOS 9.0,目前所在的公司也并没有要求对iOS 8.0以前版本进行适配于是,在新的项目中打算摒弃UIWebView而采...

u598975767的专栏 1569
上一篇: 关于 iPad 转屏的问题
下一篇: WKWebView 和 UIWebView 的适配问题
lin_transform
博客等级 码龄9年 3粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值