背景情况:

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互相调用的更多相关文章

  1. iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge

    上一篇文章介绍了UIWebView 如何通过WebViewJavascriptBridge 来实现JS 与OC 的互相调用,这一篇来介绍一下WKWebView 又是如何通过WebViewJavascr ...

  2. iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge

    WebViewJavascriptBridge是一个有点年代的JS与OC交互的库,使用该库的著名应用还挺多的,目前这个库有7000+star.我去翻看了它的第一版本已经是4年前了,在版本V4.1.4以 ...

  3. iOS下JS与OC互相调用(四)--JavaScriptCore

    前面讲完拦截URL的方式实现JS与OC互相调用,终于到JavaScriptCore了.它是从iOS7开始加入的,用 Objective-C 把 WebKit 的 JavaScript 引擎封装了一下, ...

  4. iOS下JS与OC互相调用(一)--UIWebView 拦截URL

    最近准备把之前用UIWebView实现的JS与原生相互调用功能,用WKWebView来替换.顺便搜索整理了一下JS 与OC 交互的方式,非常之多啊.目前我已知的JS 与 OC 交互的处理方式: * 1 ...

  5. iOS下JS与OC互相调用(二)--WKWebView 拦截URL

    在上篇文章中讲述了使用UIWebView拦截URL的方式来处理JS与OC交互. 由于UIWebView比较耗内存,性能上不太好,而苹果在iOS 8中推出了WKWebView. 同样的用WKWebVie ...

  6. iOS下JS与OC互相调用(八)--Cordova详解+实战

    扯两句,可以跳过 由于项目中Cordova相关功能一直是同事在负责,所以也没有仔细的去探究Cordova到底是怎么使用的,又是如何实现JS 与 OC 的交互.所以我基本上是从零开始研究和学习Cordo ...

  7. iOS下JS与OC互相调用(八)--Cordova简单实战

    新建工程,添加Cordova 关键类 新建一个工程TestCordova 然后添加:confug.xml.Private 和 Public 两个文件夹里的所有文件 然后build 发现报错 为什么有会 ...

  8. iOS下JS与OC互相调用(七)--Cordova 基础

    Cordova 简介 在介绍Cordova之前,必须先提一下PhoneGap.PhoneGap 是Nitobi软件公司2008年推出的一个框架,旨在弥补web 和iOS 之间的不足,使得web 和 i ...

  9. iOS下JS与OC互相调用(三)--MessageHandler

    使用WKWebView的时候,如果想要实现JS调用OC方法,除了拦截URL之外,还有一种简单的方式.那就是利用WKWebView的新特性MessageHandler来实现JS调用原生方法. Messa ...

随机推荐

  1. Go语言基础之Path包与FilePath包

    文章引用自 path包的使用 package main; import ( "fmt" "path" ) //go语言path包的学习 func main() ...

  2. python二维数组的创建

    话不多说,代码伺候 m = [[]*]*3 #创建一个3行5列的二维数组 m[][]= print(m) 输出结果为: 分析: m = [[0]*5]*3只是指向三个空列表的引用. 创建一个二维数组的 ...

  3. 「HNOI/AHOI2018」游戏

    传送门 Luogu 解题思路 这是一道 \(O(n^2)\) 暴力加上 \(\text{random_shuffle}\) 优化 什么鬼 就可以 \(\text{AC}\) 的题. 但还是要讲一下 \ ...

  4. mysql 单表批量备份sh文件

    #!/bin/bashDBS=$(mysql -u root -padmin -e 'use database; show tables;' | awk '{ print $1 }');for tab ...

  5. Spark性能调优-高级篇

    前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问 ...

  6. opencv python:模糊操作

    均值模糊 中值模糊 自定义模糊 模糊操作的基本原理 基于离散卷积 定义好每个卷积核 不同卷积核得到不同的卷积效果 模糊是卷积的一种表象 blur cv2.blur(image, (1, 3)) 第二个 ...

  7. ubuntu 修改和配置ip

    因为主机里面有好多个虚拟机,但是ip就一个,最近开了一个win的虚拟机,真好玩是不?所以就暂时把ubunut的ip给改了,要不冲突,哎呀,不说多了,上图, 1.修改配置文件blacklist.conf ...

  8. Python学习第二十六课——PyMySql(python 链接数据库)

    Python 链接数据库: 需要先安装pymysql 包 可以设置中安装,也可以pip install pymysql 安装 加载驱动: import pymysql # 需要先安装pymysql 包 ...

  9. 02-13Android学习进度报告十三

    今天我学习了ListView之checkbox错位问题解决.感觉还是很麻烦的. 好的存储这个Checkbox的方法有很多,你可以放到一个HashMap<Integer, Boolean>中 ...

  10. Jmeter_请求原件之参数化txt

    把数据存放在TXT上进行参数化,然后运行 用于注册,登录等不同的用例 1.登录接口地址: http://test.lemonban.com/futureloan/mvc/api/member/logi ...