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小时内与您取得联系。