iOS下JS与OC互相调用
背景情况:
app项目中有几个界面是需要经常变动的(不仅是内容还有UI布局等),比如活动宣传界面就是属于这一类。但是由于AppStore提交审核也是需要时间的,就算审核快,也不至于每次都为了这点事频繁审核吧。因此,这个界面就让Web组的来做HTML界面。
其实,如果只是安安静静的在app上展示下HTML,就很简单了。
JS与OC之间的交互,其实也就是两个方面,一种是点击HTML上的按钮,但是调用OC方法。另一种就是点击OC原生按钮,但是调用HTML中的方法。
一、点击HTML上的按钮,但是调用OC方法
在iOS7之后,Cocoa Touch添加了一个新的库javascriptCore,专门用来做JS交互,因此JS与原生OC交互也就简单了很多。
步骤一:首先要导入javascriCore库
#import <JavaScriptCore/JavaScriptCore.h>
在UIWebView加载完之后,在下面这个代理方法种完成步骤二三:
步骤二、在OC种获取JS的上下文
步骤三、定义好JS会调用的方法,注意方法名一定要与JS调用时的方法名统一
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
// 获取JS的上下文
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 定义好JS要调用的方法, ios_skipToSpaceList就是调用的ios_skipToSpaceList方法名
context[@"ios_skipToSpaceList"] = ^() {
NSLog(@"JS调用了ios_skipToSpaceList方法";
}; context[@"ios_shiptoToprizesList"] = ^() {
NSLog(@"JS调用了ios_shiptoToprizesList方法");
};
}
【说明】在开发中需要与HTML开发人员沟通好,确定好方法的名字,因为JS那边调用方法的时候就是你定义的方法名。
还有一点,因为HTML那边还需要与安卓那边适配,JS上肯定是需要区分对待的。所以跟HTML、服务器端协商下,怎么把app端的设备系统种类信息(iOS还是安卓)让HTML得知。
二、点击OC原生按钮,但是调用HTML中的方法
先说明下为什么有这样的需求,比如我这次,由于HTML同学写出的页面是可以放大缩小的,但是我app这边是不能让他缩放的,我就用JS代码控制下。(其实由HTML同学弄也可以,只是不想麻烦他了)
步骤一、首先写好JavaScript语句
NSString *injectionJSString =
@"var script = document.createElement('meta');"
"script.name = 'viewport';"
"script.content=\"width=device-width, initial-scale=1.0,maximum-scale=1.0, minimum-scale=1.0, user-scalable=no\";"
"document.getElementsByTagName('head')[0].appendChild(script);";
步骤二、注入到JS中
方式1:
[webView stringByEvaluatingJavaScriptFromString:injectionJSString];
方式2:
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
[context evaluateScript:injectionJSString];
三、一些小伎俩
1、获取网页的title、image、url
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
// 网页的标题
NSString *webTitle = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
self.navigationItem.title = webTitle; // 网页的图标
NSString *articleImageUrl = [_webView stringByEvaluatingJavaScriptFromString:@"document.images[0].src"]; // 网页的url
NSString *currentURL = [webView stringByEvaluatingJavaScriptFromString:@"document.location.href"];
}
iOS下JS与OC互相调用的更多相关文章
- iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge
上一篇文章介绍了UIWebView 如何通过WebViewJavascriptBridge 来实现JS 与OC 的互相调用,这一篇来介绍一下WKWebView 又是如何通过WebViewJavascr ...
- iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge
WebViewJavascriptBridge是一个有点年代的JS与OC交互的库,使用该库的著名应用还挺多的,目前这个库有7000+star.我去翻看了它的第一版本已经是4年前了,在版本V4.1.4以 ...
- iOS下JS与OC互相调用(四)--JavaScriptCore
前面讲完拦截URL的方式实现JS与OC互相调用,终于到JavaScriptCore了.它是从iOS7开始加入的,用 Objective-C 把 WebKit 的 JavaScript 引擎封装了一下, ...
- iOS下JS与OC互相调用(一)--UIWebView 拦截URL
最近准备把之前用UIWebView实现的JS与原生相互调用功能,用WKWebView来替换.顺便搜索整理了一下JS 与OC 交互的方式,非常之多啊.目前我已知的JS 与 OC 交互的处理方式: * 1 ...
- iOS下JS与OC互相调用(二)--WKWebView 拦截URL
在上篇文章中讲述了使用UIWebView拦截URL的方式来处理JS与OC交互. 由于UIWebView比较耗内存,性能上不太好,而苹果在iOS 8中推出了WKWebView. 同样的用WKWebVie ...
- iOS下JS与OC互相调用(八)--Cordova详解+实战
扯两句,可以跳过 由于项目中Cordova相关功能一直是同事在负责,所以也没有仔细的去探究Cordova到底是怎么使用的,又是如何实现JS 与 OC 的交互.所以我基本上是从零开始研究和学习Cordo ...
- iOS下JS与OC互相调用(八)--Cordova简单实战
新建工程,添加Cordova 关键类 新建一个工程TestCordova 然后添加:confug.xml.Private 和 Public 两个文件夹里的所有文件 然后build 发现报错 为什么有会 ...
- iOS下JS与OC互相调用(七)--Cordova 基础
Cordova 简介 在介绍Cordova之前,必须先提一下PhoneGap.PhoneGap 是Nitobi软件公司2008年推出的一个框架,旨在弥补web 和iOS 之间的不足,使得web 和 i ...
- iOS下JS与OC互相调用(三)--MessageHandler
使用WKWebView的时候,如果想要实现JS调用OC方法,除了拦截URL之外,还有一种简单的方式.那就是利用WKWebView的新特性MessageHandler来实现JS调用原生方法. Messa ...
随机推荐
- 克隆虚拟机后ip配置
(1)出错原因: 错误:No suitable device found: no device found for connection "System eth0" 原因:克隆虚拟 ...
- CDH搭建大数据集群(5.10.0)
纠结了好久,还是花钱了3个4核8G的阿里云主机,且行且珍惜,想必手动搭建过Hadoop集群的完全分布式.HBase的完全分布式的你(当然包括我,哈哈),一定会抱怨如此多的配置,而此时CDH正是解决我们 ...
- mysql 多次分组查询 数据最大的一行
SELECT B, D, Max(E)FROM `总表`WHERE B = '张士建'GROUP BY B, D 通过查询创建工具 编写查询语句
- buuctf——easyjava
虽然学过Javaweb的开发,但没好好学,所以对Javaweb了解不深 菜的真实 WEB-INF/web.xml泄露 贴一个别人的源码泄露总结ctf/web源码泄露及利用办法[总结中] WEB-INF ...
- Plastic Bottle Manufacturer - Different Cosmetic Plastic Bottle Materials, Different Characteristics
Plastic bottles are usually made of PP, PE, K, AS, abs, acrylic, PET, and the like. Dust caps for th ...
- Vue 项目 在局域网内访问
之前在百度上看到过很多中 关于局域网访问项目的方法, 在这里,个人推荐两种比较喜欢的方法 一.直接在项目的package.json文件中进行配置 ,代码如下 "scripts": ...
- Leetcode 12,452,455-贪心算法
Leetcode第12题,整数转罗马数字,难度中等 整个题目比较好理解,难度也不大,就算不过脑子,用一串if也基本上可以解决问题,比如 /** 执行用时:6ms,在所有 Java 提交中击败了52.6 ...
- Codeforces Round #608 (Div. 2) - D. Portals(贪心)
题意:你起初有一支军队,有$k$个士兵,现在有$n$座城堡,你若想占领第$i$座城堡,至少得有$a[i]$个士兵才能占领$($占领后士兵不会减少$)$,占领了第$i$座城堡后,你将得到$b[i]$个士 ...
- C语言中的快速排序函数
C库中有自带的快排函数 qsort() ; 它的函数原型为: void qsort(void * , size_t ,size_t size , int (__cdecl *)(const void ...
- Ajax记载html