UIWebView js oc相互调用的三种方法

iOS和html交互:html调用oc方法 html端调用oc端方法,比如网页端需要支付,但只有oc才能调起支付宝或微信支付,可以这样写: OC端: 引入库        #import <JavaScriptCore/JavaScriptCore.h> 设置代理         @protocol JSObjectProtocol <JSExport>         - (void)callIosPayF... 阅读详情


转自:http://www.jianshu.com/p/dbddfc0eaa26


JS oc相互调用方法:

 1.利用定义url调用
 2.利用js直接调用
 3.利用js里对象调用

首先先创建UIWebView对象,加载本地html文件

//加载本地html文件
NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"jsbridge" ofType:@"html"];
//NSString *htmlPath1 = [[NSBundle mainBundle]  pathForResource:@"jsbridge" ofType:@"html"];
//NSString *htmlPath2 = [[NSBundle mainBundle] pathForResource:@"jsbridge" ofType:@"html"];
NSString *htmlString = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];
_webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
[_webView loadHTMLString:htmlString baseURL:nil];
_webView.delegate = self;
[self.view addSubview:_webView];

实现UIWebViewDelegate

 //网页是否要加载
 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
//网页开始加载
- (void)webViewDidStartLoad:(UIWebView *)webView
//网页加载完成
- (void)webViewDidFinishLoad:(UIWebView *)webView
//网页加载失败
- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error
1.利用定义url调用
js 调用oc:

定义js方法,点击网页上的按钮触发js方法,重定向url,UIWebViewd的代理方法触发


屏幕快照 2016-05-03 下午3.14.25.png


判断定义好的scheme,获取url传过来的值


屏幕快照 2016-05-03 下午3.19.05.png
oc 调用js:
NSString *textJS = @"showAlert('这里是JS中alert弹出的message 第一种方式')";
[_webView stringByEvaluatingJavaScriptFromString:textJS];
2.利用js直接调用

使用第二种和第三种方式时需要加入JavaScriptCore.framework,如果项目要求支持ios7.0之前的需要做兼容
从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了。
首先导入JavaScriptCore.framework


20150725170931474.png

然后导入头文件

#import <JavaScriptCore/JavaScriptCore.h>

更换加载的html文件


屏幕快照 2016-05-03 下午3.34.10.png


web中的js方法


屏幕快照 2016-05-03 下午3.37.36.png

点击web中按钮,通过JScontext直接调用share方法,从JSValue中取值


屏幕快照 2016-05-03 下午3.35.26.png
oc 调用js:
 JSContext *context = [_webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
 //oc 调用 js
 NSString *textJS = @"showAlert('这里是JS中alert弹出的message')";
[context evaluateScript:textJS];
3.利用js里对象调用

此处稍微复杂一点我们需要使用到

JSExport

凡事添加了JSExport协议的协议,所规定的方法,变量等 就会对js开放,我们可以通过js调用到

首先在html中创建对象,定义方法


屏幕快照 2016-05-03 下午3.44.27.png
 无参方法
 TestJSobject.TestNOParameter();
 有一个参数的方法
 TestJSobject.TestOneParameter(TestJSobject.name);
  有两个参数的方法          
TestJSobject.TestTwoParameterSecondParameter(TestJSobject.name,TestJSobject.age);
创建oc类,添加协议

屏幕快照 2016-05-03 下午3.47.46.png


实现协议方法


屏幕快照 2016-05-03 下午3.48.01.png

特别注意:

如果js中的参数超过两个,oc中方法名需要分开

js中的方法TestJSobject.TestTwoParameterSecondParameter(TestJSobject.name,TestJSobject.age);oc中的方法-(void)TestTwoParameter:(NSString *)message1 SecondParameter:(NSString *)message2

  //js对象调用,创建对象
JSContext *context = [webView    valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
TestJSobject *test = [TestJSobject new];
 context[@"TestJSobject"] = test;
oc 调用js:
 //同样我们也用刚才的方式模拟一下js调用方法
 NSString *jsStr1=@"TestJSobject.TestNOParameter()";
[context evaluateScript:jsStr1];

点击web中的按钮,oc中的协议方法被触发


屏幕快照 2016-05-03 下午4.05.06.png

屏幕快照 2016-05-03 下午4.05.10.png

总结:根据以上几种方法,个人感觉第三种方法能更好的和oc相关联起来,而且还避免了viewController中过于庞大,如果方法多的时候。



文/跑步的李磊(简书作者)
原文链接:http://www.jianshu.com/p/dbddfc0eaa26
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

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

相关推荐

iOS webView的高级用法之JS交互,js与oc的相互调用(JavaScriptCore)

重要的事情放前面 github地址:https://github.com/horisea/JSCallOCTest   欢迎star   前言:说起JS交互,很多童鞋会黯然色变,感觉很高深的样子。大部分小伙伴只知道一种,哪一种我也说说吧。    1.在webView中将要请求的时候,拦截URL,进行重定向,然而该场景实用有限,网上资料也很多下面说说另一种交互方式。 - (BOOL)webV...

horisea的博客 2万+

JS与OC互相调用的一百种方法(包括WKWebView和UIWebView)

首先,UP主要承认错误,JS调用OC并没有一百种那么多~但是,也是有很多种办法的,起码我们可以花样使用。好了,废话不多说,下面开始逐一介绍。。。 一、简单介绍 JSCore全称为JavaScriptCore,是苹果公司在iOS中加入的一个新的framework。该framework为OC与JS代码相互操作的提供了极大的便利。该工程默认是没有导入工程中的,需要我们手动添加。

kidd风的博客 1万+

JS与原生OC/Swift相互调用总结

JS和OC/Swift相互调用,主要总结了JS和OC交互的三种方式:1.使用UIWebView,利用JavaScriptCore实现2.使用WKWebView,利用WKScriptMessageHandler实现3.使用第三方框架WebViewJavascriptBridge实现案例地址:https://github.com/xinyuly/JS_OC_SwiftJavaScriptCore在Sw...

jacob_ios的博客 1554

javascript调用OC原生方法

【代码】javascript调用OC原生方法。

carbonzhao的专栏 443

JS调用OC代码

JS 虽然是 OO,但是并没有 class,所以将 JS 对象传到 Obj C 程序里头,除了基本字串会转换成 NSString、基本数字会转成 NSNumber,像是 Array 等其他对象,在 Objective-C 中,都是 WebScriptObject 这个 Class。意思就是,JS 的 Array 不会帮你转换成 NSArray。

语音识别(ASR)-- Kaldi 学习笔记

语音识别(ASR)-- Kaldi学习笔记语音识别简介GMM-HMM基本原理DNN-HMM(基于神经网络)KaldiKaldi架构简介Kaldi在Windows下的安装工具准备编译OpenFST配置PortAudio配置KaldiKaldi目录说明 语音识别简介 语音识别(Speech Recognition)技术,也被称为自动语音识别(Automatic Speech Recognition, ASR)、计算机语音识别(Computer Speech Recognition)或是语音转文本识别(Spee

qq_43318971的博客 4848

IOS开发之——网页-原生与JS相互调用(03)

一 概述 之前介绍过——Android原生和WebView相互调用,本文介绍IOS原生和JS相互调用 加载本地网页文件 原生调用JS JS调用原生 二 加载本地网页文件 2.1 index.html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>demo</title> <style>

我的博客 3824

Zabbix Trigger actions访问出现500

本篇博客详细介绍了Zabbix访问'Trigger actions'出现的错误状况,访问界面出现500,并提供了解决方案。

格子的博客 562

iOS js oc相互调用(JavaScriptCore)

从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了。 下面我们就简单了解一下这个框架 首先我导入framework 方法如下 点击Linked Frameworks and Libraries 的添加后 选择 JavaScriptCore.framework 选中JavaScriptCore

7万+

CH569 USBSS库函数分析

CH569 USB3.0 解析

havc_W的博客 7685

GraphRAG 与 HippoRAG 深度对比:在 RAGFlow 中如何选择知识图谱方案?

本文深入对比了GraphRAG与HippoRAG在RAGFlow中的知识图谱构建方案,分析了两者在技术架构、资源消耗和场景适配性上的核心差异。GraphRAG适合需要快速响应和资源有限的场景,而HippoRAG则更适用于精确关系推理的专业领域。文章还提供了RAGFlow的演进路线和选型决策框架,帮助架构师根据实际需求做出合理选择。

weixin_27889245的博客 247

js页面加载完成调用oc_js oc相互调用的三种方法

JS oc相互调用方法:1.利用定义url调用2.利用js直接调用3.利用js里对象调用首先先创建UIWebView对象,加载本地html文件//加载本地html文件NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"jsbridge" ofType:@"html"];//NSString *htmlPath1 = [[NSB...

weixin_32659841的博客 652

动力学约束下的运动规划算法——Kinodynamic RRT*算法

动力学约束下的运动规划算法——Kinodynamic RRT*算法

慕羽★的博客 6751

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

解决Qt字体问题:QFontDatabase: Cannot find font directory xx/lib/fonts

1.直接在main函数里设置app的整体字体库.这个错误提示比较明显的就是字体库缺失。

有问题或资源连接有缺失的可以私信公众号新潮看世界获取 3044

蓝牙攻防实战指南:低功耗蓝牙

Bluetooth Low Energy(也称Bluetooth Smart)是经典蓝牙(Bluetooth Classic)的演进版本,设计目标是实现极低功耗,适用于无需频繁更换电池的设备,如智能手环、健康监测器、蓝牙标签等。Bluetooth Low Energy 是一项极具前景的无线通信技术,它以极低的功耗实现了短距离高效通信,广泛应用于智能设备和物联网领域。然而,其简化的协议结构和配对机制也带来了不小的安全挑战。

idlecloud0105的博客 683

IOS WebView中JS和OC相互调用

现在有很多项目中都涉及到HTML5,在一个普通的APP里面嵌入HTML5网页,嵌入的这些网页在服务器把页面修改之后同样也能跟着修改,这样就能很方便的修改程序的展示内容。如果使用tabelView或者其他的控件展示内容的话,当展示的内容的样式需要发生改变的时候必须修改程序本身才能够达到修改的效果。所以,在APP里面HTML5的嵌入可以更加方便的维护程序的内容,但是由于现在受网速啊,手机性能等因素的影响

清风的博客 5313

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

iOS开发 --- UIWebView OC调用JS方法

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.navigationItem.title = @"活动详情页面"; self.backButton.frame = CGRectMake(0, 0, 66, 44...

iOS技术分享与学习博客 590

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

廖雪峰Python教程[完整版]

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

iOS JS 和 OC交互 / JS 和 native 相互调用

现在app 上越来越多需求是通过UIWebView 来展示html 或者 html5的内容, js 和 native OC代码交互 就非常常见了. js 调用 native OC代码 第一种机制 (1)最常用的是 利用 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)reques...

weixin_34250434的博客 723

UIWebView与JS的交互

UIWebView与JS的交互,说白了就是Objective-C和JavaScript的相互调用。Objective-C调用JavaScript代码的方法,是通过UIWebView的 - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;的方法来实现的。该方法向UIWebView传递一段需要执行的JavaScr

Panwave的专栏 1454

UIWebView 获取当前的javascript上下文,并js,oc互调

OC调用UIWebView 中的js,网上例子很多,最常用的是UIWebView自带的一个方法; - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script; UIWebView中的js 掉用本地的oc方法; 通过UIWebView开始加载请求的代理方法中,去解析OC跟js约定好的协议(比如...

anxing1070的博客 180

iOS UIWebView中JS和OC互相调用

最近做的项目中,是用html做的,我这边直接用iOS原生的UIWebView进行加载显示,在期间用到了js和OC的互相调用,这里记录下来      JS调用OC方法:         首先,什么是JS调用OC方法,意思就是界面上有一个html的按钮,我点击这个按钮之后,要调用OC原声的方法,这就是JS调用OC方法。我们项目里面有一个点击注销按钮返回原生登陆界面的例子 先impot

crypond的专栏 5542

iOS的JS和OC代码互相调用

1.JS调用OC代码 步骤1:以下是html页面,test1函数,并没有在页面中声明,而是在OC的UIWebView中绑定的             //test2(p)函数是准备 OC调用JS函数用的         function test2(p){             alert(p);         }         test1()" onc

VictorZhang 3259

iOS中OC调用js方法简述(一)

从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了。

Levilly的博客 8256

UIWebview JS和OC相互调用

OS开发之Objective-C与JavaScript交互操作是本文要介绍的内容,主要主要是讲解了stringByEvaluatingJavaScriptFromString的用法,它的功能非常的强大,用起来非常简单,通过它我们可以很方便的操作uiwebview中的页面元素。UIWebView是iOS最常用的8SDK之一,它有一个stringByEvaluatingJavaScriptFromStr

li198847的博客 427
上一篇: iphone 6plus 输出的屏幕尺寸 375 ,667的原因 - 简书
下一篇: C++ 异常处理(廿五)--abort()
Gz_Jason_chen
博客等级 码龄11年 49粉丝 141原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值