js(javascript)与ios(Objective-C)相互通讯交互

随着苹果SDK的不断升级,愈来愈多的新特性增长了进来,本文主要讲述从iOS6至今,Native与JavaScript的交互方法javascript

1、UIWebview && iframe && JavaScript  <=iOS6

iOS6原生没有提供js直接调用Objective-C的方式,只能经过UIWebView的UIWebViewDelegate协议html

方法来作拦截,并在这个方法中,根据url来调用Objective-C方法java

1.javascript调用Objective-C

动态添加个iframe改变其地址 最后删除,这种方法不会使当前页面跳转 效果更佳git

javascript代码:github

 

Objective-C代码:web

 

 

2.Objective-C调用javascript

 

 

 

 


(PS)若是你想去掉webview弹出的alert 中的来自XXX网页sublime-text

 

 

2、JavaScriptCore && UIWebview >=iOS7

iOS7中加入了JavaScriptCore.framework框架。把 WebKit 的 JavaScript 引擎用 Objective-C 封装。该框架让Objective-C和JavaScript代码直接的交互变得更加的简单方便。api

合适时机注入交互对象

何时UIWebView会建立JSContext环境?

分两种方式数组

第一在渲染网页时遇到<script标签时,就会建立JSContext环境去运行JavaScript代码。浏览器

第二就是使用方法[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]去获取JSContext环境时,这时不管是否遇到<script标签,都会去创造出来一个JSContext环境,并且和遇到<script标签再创造环境是同一个。

何时注入JSContext问题

我一般都会在 - (void)webViewDidFinishLoad:(UIWebView *)webView中去注入交互对象,可是这时候网页还没加载完,JavaScript那边已经调用交互方法,这样就会调不到原生应用的方法而出现问题。

改为在- (void)viewDidLoad中去注入交互对象,这样却是解决了上面的问题,可是同时又引发了一个新的问题就是在一个网页内部点击连接跳转到另外一个网页的时候,第二个页面须要交互,这时JSContext环境已经变化,可是- (void)viewDidLoad仅仅加载一次,跳转的时候,没有再次注入交互对象,这样就会致使第二个页面无法进行交互。固然你能够在- (void)viewDidLoad和- (void)webViewDidFinishLoad:(UIWebView *)webView都注入一次,可是必定会有更优雅的办法去解决此问题。

若是上边的方案能知足需求,建议实在无可奈何再用这个方法,  就是在每次建立JSContext环境的时候,咱们都去注入此交互对象这样就解决了上面的问题。具体解决办法参考了此开源库UIWebView-TS_JavaScriptContext

多个iFrame中的JSContext问题

 

 

1. JavaScriptCore调用Objective-C

html中的JS代码

iOS中的代码  UIWebview的delegate

JSExport 协议关联 native 的方法

Objective-C

 

JavaScript

 

2.Objective-C 调用 JavaScriptCore

Objective-C

调用js的showResult方法,这里是一个参数 result,多个就依次写到数组中

JavaScript

 

3、WKWebView && JavaScript >=iOS8

iOS 8引入了一个新的框架——WebKit,以后变得好起来了。在WebKit框架中,有WKWebView能够替换UIKit的UIWebView和AppKit的WebView,并且提供了在两个平台能够一导致用的接口。WebKit框架使得开发者能够在原生App中使用Nitro来提升网页的性能和表现,Nitro就是Safari的JavaScript引擎 WKWebView 不支持JavaScriptCore的方式但提供message handler的方式为JavaScript 与Native通讯.

1.Objective-C  调用JavaScript

 

2. JavaScript 调用 Objective-C

JavaScript,简单的封装一下,‘Native’为事先在Objective-C注册注入的js对象

JavaScript调用

Objective-C实现

 

 

注:本文除了第三种方法以外,前两种JavaScript交互方法都和Android开发兼容,仅仅是api略不一样。

demo地址: https://github.com/shaojiankui/iOS-WebView-JavaScript

相关文章
相关标签/搜索