博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js和native交互方法浅析
阅读量:7036 次
发布时间:2019-06-28

本文共 2965 字,大约阅读时间需要 9 分钟。

一、背景

最近接触公司项目,需要和原生app做交互,由此业务需求,开始了学习探索之路。

二、解决方案之WebViewJavascriptBridge 

想要和app交互,必须在app上先把bridge进行实例化,这是先决条件。

oc解决方案

步骤

1、引入文件

#import "WebViewJavascriptBridge.h"
@property WebViewJavascriptBridge* bridge;

2、实例化WebViewJavascriptBridge 

self.bridge = [WebViewJavascriptBridge bridgeForWebView:webView];

3、在oc中注册一个函数,并调用一个js处理函数 

[self.bridge registerHandler:@"ObjC Echo" handler:^(id data, WVJBResponseCallback responseCallback) {    NSLog(@"ObjC Echo called with: %@", data);    responseCallback(data);}];[self.bridge callHandler:@"JS Echo" data:nil responseCallback:^(id responseData) {    NSLog(@"ObjC received response: %@", responseData);}];

4、把这段js代码放入前端js或者页面中 

1 function setupWebViewJavascriptBridge(callback) { 2     if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); } 3     if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); } 4     window.WVJBCallbacks = [callback]; 5 // 创建iframe 对象, 在网页中,iframe的用法非常多,主要应用于伪ajax、嵌套页面、页面重用。 6     var WVJBIframe = document.createElement('iframe'); 7     WVJBIframe.style.display = 'none'; 8     WVJBIframe.src = 'https://__bridge_loaded__'; 9     document.documentElement.appendChild(WVJBIframe);10 //保证前面的代码执行完再删除这个iframe节点,11 //setTimeout (fn,0)12 //同步代码转异步代码,这是为了手动调配优先级不高的代码靠后执行。保证当前处于事件队列中的任务全部执行完后该任务(函数)立刻得到执行。13     setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)14 }

5、在前端调用

setupWebViewJavascriptBridge(function(bridge) {        /* Initialize your app here */    bridge.registerHandler('JS Echo', function(data, responseCallback) {        console.log("JS Echo called with:", data)        responseCallback(data)    })    bridge.callHandler('ObjC Echo', {'key':'value'}, function responseCallback(responseData) {        console.log("JS received response:", responseData)    })})

API

oc调用js

// OC端 向 JS端 传数据的回调函数, 注册 registerHandler(标识符, 数据回调闭包), 当OC端发起数据传送,会调用 function(数据, OC端给的回调函数) --------->handlerName要和OC端保持一致
bridge.registerHandler("handlerName", function(responseData) { ... })

js调用oc

bridge.callHandler("handlerName", data)
// JS端 向 OC端 传数据的方式,callHandler(方法标识符, 数据, 回调) ---------->testObjcCallback要和OC端保持一致
bridge.callHandler("handlerName", data, function responseCallback(responseData) { ... }) bridge.disableJavscriptAlertBoxSafetyTimeout()

总结

交互前需要先对OC环境和JS环境进行初始化,JS环境的初始化通过Web页面加载时发送特定的URL来完成。

WebViewJavascriptBridge在OC端和JS端各自维护一个bridge对象来保存开放给另一端的方法,以及自身调用另一端后的回调方法。前者通过handlerName来映射,后者通过callBackId标识唯一性。方法调用时必定携带handlerName,若需要回调,还需携带callBackId。

WebViewJavascriptBridge中OC调用JS采用的是WebView提供的JS执行方法;而JS调用OC采用的是URL拦截的方式,OC端通过识别特定的URL来区分是否需要拦截,并做相应的逻辑处理。

android解决方案

安卓版插件传送门https://github.com/gzsll/WebViewJavascriptBridge,原理基本一致,没有深入研究。

思考

WebViewJavascriptBridge还需要做IOS和Android的兼容,那么,还有没有更好的方案呢?功夫不负有心人,我找到了DSBridge

三、解决方案之DSBridge

dsbridge最大的特点就是支持同步!中文文档传送门:https://github.com/wendux/DSBridge-Android/blob/master/readme-chs.md

文章写的比较浅,如有纰漏,欢迎指正,如果有更好方案,欢迎留言。

 

 

转载于:https://www.cnblogs.com/wuyuchao/p/7922258.html

你可能感兴趣的文章
【知识库】信普知识库总结
查看>>
114ic电子元器件网
查看>>
原生js实现轮播图
查看>>
学习ASP.NET Core Razor 编程系列八——并发处理
查看>>
How Can I Get the Unique ID for the Last Inserted Row
查看>>
JTable设置透明
查看>>
在ASP.NET使用JavaScript显示信息提示窗口
查看>>
Android ViewPager使用详解
查看>>
linux下查找最耗iowait的进程
查看>>
(转载)类的各种成员函数在内存中是如何分配的?
查看>>
浅谈linux的死锁检测 【转】
查看>>
Directx11学习笔记【十】 画一个简单的三角形
查看>>
mysql创建触发器
查看>>
kafka0.10
查看>>
【转】存储过程介绍
查看>>
拥有Nanojit龙芯后端的firefox发布(10年1月14日更新)
查看>>
iOS - Alamofire 网络请求
查看>>
jhat中的OQL(对象查询语言)
查看>>
“新零售”即被翻页,2018云栖大会马云喊话“新制造”!
查看>>
证监会支持券商加大权益类资产配置力度
查看>>