美文网首页iOS网络篇iOS点点滴滴
js与navive相互通信的机制

js与navive相互通信的机制

作者: 子键_北京不眠夜 | 来源:发表于2015-06-24 16:24 被阅读153次

js –> native

目前,截止至iOS7,iOS原生并没有提供js直接调用native的方式,只能通过UIWebView相关的UIWebViewDelegate协议的

1

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

方法来做拦截,并在这个方法中,根据url的协议或特征字符串来做调用方法或触发事件等工作,如

* 方法的返回值是BOOL值。

* 返回YES:表示让浏览器执行默认操作,比如某个a链接跳转

* 返回NO:表示不执行浏览器的默认操作,这里因为通过url协议来判断js执行native的操作,肯定不是浏览器默认操作,故返回NO

* /

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

NSURL *url = [request URL];

if ([[url scheme] isEqualToString:@"callFunction") {

//调用原生方法

return NO;

} else if (([[url scheme] isEqualToString:@"sendEvent") {

//触发事件

return NO;

} else {

return YES;

}

}

虽然通过这个方式,js调用native是异步的,但是效率还是很高,我通过在js调用端,把time传入navive然后相减的方式计算,平均只有5ms的时间间隔。

如何触发这个方法拦截

最最简单且实用的方法莫过于用js创建一个隐藏的iframe设置src了,代码:

1

2

3

4

5

6

7

8

function js2native(){

var iframe = document.createElement("iframe");

iframe.src="callFunction://";

iframe.style.display = 'none';

document.body.appendChild(iframe);

iframe.parentNode.removeChild(iFrame);

iframe = null;

}

通过查看phoneGap源码的iOSExec方法,还有使用XMLHttpRequest或修改hash的方式来触发方法拦截,但是因为有bug或其他原因,不推荐。

native –> js

native调用js非常简洁方便,只需要

1

[webView stringByEvaluatingJavaScriptFromString:@"alert('hello world!')"];

并且该方法是同步的。

调试

虽然现在能直接用Safari的开发模式直接查看模拟器中的webView页面,但是经过亲自尝试,最想要的也是最重要的js调试,还是不支持,不能进行js断点调试,还是要依赖console来弄……当然css样式调试支持的不错。

2014-04-09 update: 昨天发现Safari是可以对模拟器中的webView页面进行js断点调试的,之前是因为我没有设置启用所有断点……

可以在模拟器进入webView页面后,打开Safari,然后在 开发->iPhone simulator 菜单下进行页面选择,进入调试。

相关资料

唐巧-关于UIWebView和PhoneGap的总结

Github上的WebViewJavascriptBridge项目

大名鼎鼎的phonegap

转载自:http://sjpsega.com/blog/2014/03/08/js-communicate-with-native-in-iOS/

相关文章

  • js与navive相互通信的机制

    js –> native 目前,截止至iOS7,iOS原生并没有提供js直接调用native的方式,只能通过UIW...

  • React Native 中 Java 与 JS 互调的原理

    通信机制 在Java层与Js层的bridge分别存有相同一份模块配置表,Java与Js互相通信时,通过将里配置表中...

  • RN源码探索笔记

    可能大家都知道RN的实现机制主要是两个常驻线程,一个JS线程,一个UI线程,相互通信,js处理计算,给主线程发消息...

  • js Event Loop 运行机制

    js Event Loop 运行机制 一个进程可以有多个线程,线程之间可以相互通信 概念 进程和线程基本概念拿出在...

  • ReactNative通信机制

    了解新的事物之前带着问题思考以下问题 普通的OC-JS通信机制是什么?ReactNative通信机制是什么? 普通...

  • XTJsBridge规范文档

    一、什么是XTJsBridge 1.jsbridge通信机制,通过js的方式构建bridge(桥)通信方式,通过传...

  • 线程间通信

    等待/通知机制 线程之间不是独立的的个体,他们彼此之间可以相互通信和协作。 不使用等待、通知机制实现线程间通信 两...

  • 线程锁机制

    等待/通知机制 线程之间不是独立的的个体,他们彼此之间可以相互通信和协作。 不使用等待、通知机制实现线程间通信 两...

  • VSCode源码解读--IPC通信机制

    Electron 的 通信机制 我们知道 Electron 是基于 Chromium + Node.js 的架构。...

  • Flutter js 相互(调用)通信

    应用场景: 在Flutter 中显示一个网页(H5之类),然后在Flutter中可以调用网页js里的方法; js里...

网友评论

  • 昕竹居:问个很小白的问题,Navive是什么,与native应用的区别~~求问

本文标题:js与navive相互通信的机制

本文链接:https://www.haomeiwen.com/subject/vkceqttx.html