mislyvinky 2019-06-26

dsBridge是一个三端(Android、IOS、JavaScript)易用的现代跨平台 JavaScript bridge, 通过它,你可以在Javascript和原生之间同步或异步的调用彼此的函数.
Github: https://github.com/wendux/DSBridge-IOS
pod "dsBridge"
请参考工程目录下的 dsbridgedemo/ 文件夹. 运行并查看示例交互.
如果要在你自己的项目中使用 dsBridge :
1.新建一个类,实现API
@implementation JsApiTest
//同步API
- (NSString *) testSyn:(NSString *) msg
{
return [msg stringByAppendingString:@"[ syn call]"];
}
//异步API
- (void) testAsyn:(NSString *) msg :(void (^)(NSString * _Nullable result,BOOL complete))completionHandler
{
completionHandler([msg stringByAppendingString:@" [ asyn call]"],YES);
}
@end可以看到,DSBridge正式通过API类的方式集中、统一地管理API。
2.添加API类实例到 DWKWebView
DWKWebView * dwebview=[[DWKWebView alloc] initWithFrame:bounds]; // register api object without namespace [dwebview addJavascriptObject:[[JsApiTest alloc] init] namespace:nil];
3.在Javascript中调用原生 (Java/Object-c/swift) API ,并注册一个 javascript API供原生调用.
初始化 dsBridge
//cdn方式引入初始化代码(中国地区慢,建议下载到本地工程) //<script src="https://unpkg.com/[email protected]/dist/dsbridge.js"> </script> //npm方式安装初始化代码 //npm install [email protected] var dsBridge=require("dsbridge")
调用原生API ,并注册一个 javascript API供原生调用
//同步调用
var str=dsBridge.call("testSyn","testSyn");
//异步调用
dsBridge.call("testAsyn","testAsyn", function (v) {
alert(v);
})
//注册 javascript API
dsBridge.register('addValue',function(l,r){
return l+r;
})4.在Object-c中调用Javascript API
[dwebview callHandler:@"addValue" arguments:@[@3,@4] completionHandler:^(NSNumber* value){
NSLog(@"%@",value);
}];命名空间可以帮助你更好的管理API,这在API数量多的时候非常实用,比如在混合应用中。DSBridge (>= v3.0.0) 支持你通过命名空间将API分类管理,并且命名空间支持多级的,不同级之间只需用'.' 分隔即可。
在调试模式时,发生一些错误时,将会以弹窗形式提示,并且原生API如果触发异常将不会被自动捕获,因为在调试阶段应该将问题暴露出来。如果调试模式关闭,错误将不会弹窗,并且会自动捕获API触发的异常,防止crash。强烈建议在开发阶段开启调试模式,可以通过如下代码开启调试模式:
// open debug mode [dwebview setDebugMode:true];
通常情况下,调用一个方法结束后会返回一个结果,是一一对应的。但是有时会遇到一次调用需要多次返回的场景,比如在javascript钟调用端上的一个下载文件功能,端上在下载过程中会多次通知javascript进度, 然后javascript将进度信息展示在h5页面上,这是一个典型的一次调用,多次返回的场景,如果使用其它Javascript bridge, 你将会发现要实现这个功能会比较麻烦,而DSBridge本省支持进度回调,你可以非常简单方便的实现一次调用需要多次返回的场景,下面我们实现一个倒计时的例子:
In Object-c
- ( void )callProgress:(NSDictionary *) args :(void (^)(NSNumber * _Nullable result,BOOL complete))completionHandler
{
value=10;
hanlder=completionHandler;
timer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(onTimer:)
userInfo:nil
repeats:YES];
}
-(void)onTimer:t{
if(value!=-1){
hanlder([NSNumber numberWithInt:value--],NO);
}else{
hanlder(@"",YES);
[timer invalidate];
}
}In javascript
dsBridge.call("callProgress", function (value) {
document.getElementById("progress").innerText = value
})完整的示例代码请参考demo工程。
DSBridge已经实现了 Javascript的弹出框函数(alert/confirm/prompt),这些对话框按钮、标签文字默认都是中文的,如果你想自定义这些文本可以参考 customJavascriptDialogLabelTitles API,如果你不想使用DSBridge实现的对话框,你可以通过设置DSUIDelegate 属性(是WKUIDelegate的代理属性)完全自定义。
另外注意,DSBridge实现的弹出框都是模态的,这会阻塞UI线程,如果你需要非模态的对话框,请参考disableJavascriptDialogBlock API.
下面是完整的API列表,详细的文档请移步:https://github.com/wendux/DSBridge-IOS
addJavascriptObject:(id) object namespace:(NSString *) namespaceremoveJavascriptObject:(NSString *) namespacecallHandler:(NSString *) methodName arguments:(NSArray *) args]callHandler:(NSString *) methodName completionHandler:(void (^)(id value))completionHandlercallHandler:(NSString *) methodName arguments:(NSArray *) args completionHandler:(void (^ )(id value))completionHandlerdisableJavascriptDialogBlock:(bool) disablesetJavascriptCloseWindowListener:(void(^_Nullable)(void))callbackhasJavascriptMethod:(NSString*) handlerName setDebugMode:(bool) debugcustomJavascriptDialogLabelTitles:(NSDictionary*) dicdsBridge.call(method,[arg,callback])dsBridge.register(methodName|namespace,function|synApiObject)dsBridge.registerAsyn(methodName|namespace,function|asyApiObject)dsBridge.hasNativeMethod(handlerName,[type])dsBridge.disableJavascriptDialogBlock(disable)当dsBridge遇见 Fly.js 时,将会打开一个新的世界。fly.js传送门
正如我们所知,在浏览器中,ajax请求受同源策略限制,不能跨域请求资源。然而, Fly.js 有一个强大的功能就是支持请求重定向:将ajax请求通过任何Javascript bridge重定向到端上,并且 Fly.js 官方已经提供的 dsBridge 的 adapter, 可以非常方便的协同dsBridge一起使用。由于端上没有同源策略的限制,所以 fly.js可以请求任何域的资源。
另一个典型的使用场景是在混合APP中,由于Fly.js 可以将所有ajax请求转发到端上,所以,开发者就可以在端上进行统一的请求管理、证书校验、cookie管理、访问控制等。
详情请参考 https://github.com/wendux/fly. (DSBridge Android版 demo中包含fly.js的示例)
如果你喜欢 DSBridge, 欢迎star,以便更多的人知道它, 谢谢 ! 再次贴出DSBridge仓库链接:
DSBridge for IOS:https://github.com/wendux/DSBridge-IOS
DSBridge for Android: https://github.com/wendux/DSBridge-Android