转载 【iOS开发】网页JS与OC交互(JavaScriptCore) OC ----->JS
目标
本文介绍利用苹果在iOS7时发布的JavaScriptCore.framework框架进行js与OC的交互。我们想要达到的目标是:
- OC调用网页上的js方法
- 网页js调用APP中的OC方法
JavaSciptCore.framework框架介绍
JavaScriptCore是webkit的一个重要组成部分,主要是对js进行解析和提供执行环境。
具体介绍请看这篇简书的文章:JavaScriptCore 使用
准备环境
- 创建一个名为JS与OC交互Demo的iOS工程。然后在storyboard添加一个UIWebVeiw,并设置上下左右约束为0,背景设为白色。
- 刚才创建的webView作为ViewController的属性。用webView加载百度界面


- 编写html文件
由于没有现成的网页能够符合我们这篇文章的需求,所以楼主自己做了一个本地的html文件。作为我们的素材。
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="utf-8">
<title>JS与OC交互</title> <!-- 定义js函数 -->
<script type="text/JavaScript">
function test1()
{
alert("我是被OC调用的js方法")
}
</script> </head>
<body>
<br /><br /><br /><br /> <!-- 创建一个按钮,点击就调用 printHelloWorld() 方法 -->
<button onclick="printHelloWorld()">在Xcode控制台打印HelloWold</button> </body>
</html>
html的代码很简单
首先是在head里面定义了一个js函数test1()。调用这个函数会弹出一个alert窗口。
<!-- 定义js函数 -->
<script type="text/JavaScript">
function test1()
{
alert("我是被OC调用的js方法")
}
</script>
body里面创建了一个按钮,点击按钮会调用printHelloWorld()方法。这里没有定义这个方法的实现,等下我们会在OC代码中定义
<!-- 创建一个按钮,点击就调用 printHelloWorld() 函数 -->
<button onclick=" printHelloWorld() ">在Xcode控制台打印HelloWold</button>
好了,现在我们可以加载这个本地html文件了。
//
// ViewController.m
// JS与OC交互Demo
//
// Created by 石学谦 on 16/7/9.
// Copyright © 2016年 shixueqian. All rights reserved.
// #import "ViewController.h" @interface ViewController ()<UIWebViewDelegate> //webView
@property (weak, nonatomic) IBOutlet UIWebView *webView; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; //设置webView代理
self.webView.delegate = self; //获取本地html路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"index.html" ofType:nil];
//中文路径要转码
path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //加载html
NSURL *url = [NSURL URLWithString:path];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request]; } -(void)webViewDidFinishLoad:(UIWebView *)webView {
NSLog(@"网页加载完成");
} @end

环境准备完成,开工
OC调用网页上的JS方法
我们的html文件定义了一个js方法test1(),现在我们就来调用这个方法
- 先导入JavaScriptCore.framework。工程->Build Phases->Link Binary With Libraries->点击“+”->输入“JavaScriptCore”->Add

在ViewController.m导入头文件#import <JavaScriptCore/JavaScriptCore.h>。
写代码
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSLog(@"网页加载完成");
[self demo1];
}
- (void)demo1 {
//创建JSContext对象,(此处通过当前webView的键获取到jscontext)
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.JavaScriptContext"];
//OC调用JS方法
[context evaluateScript:@"test1()"];
}
运行之后会弹出一个alert窗口,证明html上的js方法test1被调用了

上面的代码都是无参的,加入是有参数的呢?
我们在html文件中加一个js方法test3(a,b)。方法有两个参数。<!-- 定义js函数 -->
<script type="text/JavaScript">
function test3(a,b)
{
alert("我是被OC调用的js方法" + a + b)
}
</script>然后在ViewController.m里面调用
-(void)webViewDidFinishLoad:(UIWebView *)webView {
NSLog(@"网页加载完成");
// [self demo1];
[self demo2];
}
//OC调用有多个参数的JS方法
- (void)demo2 {
//创建JSContext对象
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.JavaScriptContext"];
[context evaluateScript:@"test1(/"我是参数a/",/"我是参数b/")"];
}
运行结果为:

- 上面是OC调用html中定义的JS方法。我们还可以在iOS程序里面写一段JS代码来调用。
-(void)webViewDidFinishLoad:(UIWebView *)webView {
NSLog(@"网页加载完成");
// [self demo1];
// [self demo2];
[self demo3];
}
//OC调用OC代码写出来的js方法
- (void)demo3 {
//创建JSContext对象
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.JavaScriptContext"];
//JS代码
NSString *jsCode = [NSString stringWithFormat:@"alert(/"我是OC里面的js方法/")"];
//OC调用JS方法
[context evaluateScript:jsCode];
}
运行结果如下:

转载 【iOS开发】网页JS与OC交互(JavaScriptCore) OC ----->JS的更多相关文章
- [转载]iOS开发之手势识别
感觉有必要把iOS开发中的手势识别做一个小小的总结.在上一篇iOS开发之自定义表情键盘(组件封装与自动布局)博客中用到了一个轻击手势,就是在轻击TextView时从表情键盘回到系统键盘,在TextVi ...
- IOS开发之——objective-c与javascript交互
原文:http://blog.csdn.net/pjk1129/article/details/6936545 在写 JavaScript 的时候,可以使用一个叫做 window 的对象,像是我们想要 ...
- 转载iOS开发中常见的警告及错误
iOS警告收录及科学快速的消除方法 前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉得警告又不是错误可以完全不管么? 如果你也被这些问题困惑,可以和我一起进行下面的操作. ...
- [转载] iOS开发分辨率那点事
1 iOS设备的分辨率 iOS设备,目前最主要的有3种(Apple TV等不在此讨论),按分辨率分为两类 iPhone/iPod Touch 普屏分辨率 320像素 x 480像素 Retina ...
- 转载 IOS开发之---static变量
Objective-C 支持全局变量 主要有两种实现方式: (1)第一种和C/C++中的一样, 使用"extern"关键词: (2)另外一种就是使用单例实现. (比如我们经常会把一 ...
- iOS开发 - Swift使用JavaScriptCore与JS交互
一.前言 在这个提倡敏捷开发和H5横行的年代,原生App内嵌入一些H5页面已经成为一种流行的趋势.一套H5页面就可以适配复杂的iOS和Android页面,大量节省了开发和维护时间,如果本来就有移动端网 ...
- iOS与Html5和JS之间的交互---学习笔记五
首先采用的框架是WebViewJavascriptBridge,采用这套框架可以方便的使iOS与JS交互 一. 流程图(主要介绍思路) 二.iOS端如何使用 首先导入#import "Web ...
- iOS开发学习概述及知识整理
设计师设计出来了一个不错的引导界面,然而当我看到设计稿的时候,我们的app也没几天就要上线了.这个界面模仿了Evernote iOS app的风格. 我以迅雷不及掩耳盗铃之势开始在Xcode上编程,用 ...
- 那些在学习iOS开发前就应该知道的事(part 1)
英文原文:Things I wish I had known before starting iOS development—Part 1 http://www.cocoachina.com/ios/ ...
随机推荐
- 程序编译时书写Makefile注意事项一例
在进行程序编译时,可能需要指定一些库的库的路径.头文件的路径,分别使用的参数选项是-L和-I,需要注意的是: 需要确保-L和-I后边的内容不为空,否则会出现意想不到的错误,而这种错误比较难以发现,引起 ...
- VUE的进阶 标签属性数据绑定和拼接
在vue官网把文档扫了一遍后,就开始写网站项目了,没有设计,就百度里找了一个h5的助赢软件的网站把他copy下来,想想有点坏了,接着把内容改改吧.首先开始做一个列表展示vue实例好后,给对象添加默认数 ...
- log4j教程 6、Logger方法
Logger类提供了多种方法来处理日志活动. Logger类不允许实例化一个新的记录器实例,但它提供了两个静态方法获得一个 Logger 对象: public static Logger getRoo ...
- CKEditor+SWFUpload实现功能较为强大的编辑器(一)---CKEditor配置
CKEditor爆表的强大功能大家都有目共睹,号称最强大的在线编辑器,只要将文件复制到项目中,在添加引用,在一句代码就可以将普通的textarea变成华丽的编辑器 所谓一复制,一拖,一换就大功告成 但 ...
- hdu 4512 吉哥系列故事——完美队形I(最长公共上升自序加强版)
首先要去学习最长公共上升子序列LCIS.然后是对n*n效率的算法进行优化,这里要注意的是能够求出来的序列中间能够有一个最高的.刚開始将输入的数组进行逆置,写下来发现这可能存在问题. 只是详细是什么也没 ...
- postman里面的mockserver使用方法
转载:http://blog.csdn.net/Cloud_Huan/article/details/78326159 首先说下mockserver是干啥的,从英文翻译理解就是模拟一个服务器,通俗点说 ...
- 3. Spring Boot热部署【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/51584549 在编写代码的时候,你会发现我们只是简单把打印信息改变了下,就需要重新部署,如 ...
- Solidworks如何为装配体绘制剖面视图
1 如图所示的工程图来自装配体 2 点击剖面视图,随后绘制一条线(我从正中劈开),弹出对话框,勾选自动打剖面线,确定 3 剖面视图绘制完毕 三个剖视图如下 关于半剖视图,可以这样做.先 ...
- C++ 设置文件最近修改时间
利用VS开发C++项目,经常发现修改系统时间后,每次编译过程会变得很慢,其原因就是当你把系统时间调到未来的一个时间点,然后有意或者无意编辑过一些代码文件,那么这些文件的时间戳就停留在未来. 当你把系统 ...
- 算法练习--ABCD*E=DCBA
//1.ABCD * E = DBCA//2.A,B,C,D {0-9} , E {1-9}//3.A,B,C,D,E all different var existSameN = function ...