DSBridge框架使用说明,Android常用面试

 //cdn方式引入初始化代码(中国地区慢,建议下载到本地工程)

 //<script src="https://cdn.jsdelivr.net/npm/dsbridge@3.1.4/dist/dsbridge.js"> //</script>

 //npm方式安装初始化代码

 //npm install dsbridge@3.1.4

 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;

})




**步骤四**:在Object-c中调用Javascript API



   [dwebview callHandler:@"addValue" arguments:@[@3,@4] completionHandler:^(NSNumber* value){

          NSLog(@"%@",value);

   }];



[]( )OC API 命名注意事项

--------------------------------------------------------------------------------



OC API 必须符合如下签名:



1.  同步API.  

    **`(id) handler:(id) msg`**  

    参数可以是任何类型, 但是返回值类型不能为 **void。** **如果不需要参数,也必须声明**,声明后不使用就行。

    

    > 如果同步API返回值类型为void,调用时则会导致Crash,请务必遵守签名规范。

    

2.  异步 API.  

    **`(void) handler:(id)arg :(void (^)( id result,BOOL complete))completionHandler)`**  

    `JSCallback` 是一个block类型:

    



typedef void (^JSCallback)(NSString * _Nullable result,BOOL complete);




> 注意:API名字**不能**以"init"开始,因为oc的类中是被预留的, 如果以"init"开始,执行结果将无法预期(很多时候会crash)。



[]( )在Swift中使用

----------------------------------------------------------------------------



在 Swift中,你应该按照如下方式声明APIs:



//必须给第一个参数前添加下划线"_"来显式忽略参数名。

@objc func testSyn( _ arg:String) -> String {

return String(format:"%@[Swift sync call:%@]", arg, "test")

}

@objc func testAsyn( _ arg:String, handler: (String, Bool)->Void) {

handler(String(format:"%@[Swift async call:%@]", arg, "test"), true)

}




有两点必须注意:



*   必须给Swift API添加 “@objc” 标注。

*   必须给第一个参数前添加下划线"\_"来显式忽略参数名



完整的示例在 [这里]( ) .



[]( )命名空间管理API

----------------------------------------------------------------------------



命名空间可以帮助你更好的管理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 :(JSCallback)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工程。



[]( )设置Javascript 弹出框样式

-------------------------------------------------------------------------------------



DSBridge已经实现了 Javascript的弹出框函数(alert/confirm/prompt),这些对话框按钮、标签文字默认都是中文的,如果你想自定义这些文本可以参考 `customJavascriptDialogLabelTitles` API,如果你不想使用DSBridge实现的对话框,你可以通过设置`DSUIDelegate` 属性(是WKUIDelegate的代理属性)完全自定义。  

另外注意,DSBridge实现的弹出框都是模态的,这会阻塞UI线程,如果你需要非模态的对话框,请参考`disableJavascriptDialogBlock` API.



[]( )使用DSUIDelegate

---------------------------------------------------------------------------------



在 `DWKWebView` 中,请使用 `DSUIDelegate` 代替 `UIDelegate` , 因为在`DWKWebView` 内部 `UIDelegate`已经设置过了,而 `DSUIDelegate` 正是 `UIDelegate` 的一个代理。



[]( )API 列表说明

---------------------------------------------------------------------------



### []( )Object-C API



在Object-c中我们把实现了供 javascript调用的 API类的实例 成为 **Object-c API object:**  

**`addJavascriptObject:(id) object namespace:(NSString *) namespace`**  

添加一个 Object-c API object 到DWKWebView,并为它指定一个命名空间. 然后,在 javascript 中就可以通过`bridge.call("namespace.api",...)`来调用Object-c API object中的原生API了。  

如果命名空间是空(nil或空字符串), 那么这个添加的 Object-c API object就没有命名空间。在 javascript 通过 `bridge.call("api",...)`调用。



示例:  

**In Object-c**



@implementation JsEchoApi

  • (id) syn:(id) arg {

    return arg;

}

  • (void) asyn: (id) arg :(JSCallback)completionHandler {

    completionHandler(arg,YES);

}

@end

// register api object with namespace “echo”

[dwebview addJavascriptObject:[[JsEchoApi alloc] init] namespace:@“echo”];




**In Javascript**



// call echo.syn

var ret=dsBridge.call(“echo.syn”,{msg:" I am echoSyn call", tag:1})

alert(JSON.stringify(ret))

// call echo.asyn

dsBridge.call(“echo.asyn”,{msg:" I am echoAsyn call",tag:2},function (ret) {

  alert(JSON.stringify(ret));

})




通过命名空间名称移除相应的 Object-c API object:  

**`removeJavascriptObject:(NSString *) namespace`**



OC调用JSAPI:  

1、调用 javascript API.`methodName` 为javascript API 的名称,可以包含命名空间;  

2、参数以数组传递,`argumentss`数组中的元素依次对应javascript API的形参; 3、`completionHandler` 用于接收javascript API的返回值,**注意: `completionHandler`将在主线程中被执行**。  

方法:  

**1、`callHandler:(NSString *) methodName arguments:(NSArray *) args`**  

**2、`callHandler:(NSString *) methodName completionHandler:(void (^)(id value))completionHandler`**  

**3、`callHandler:(NSString *) methodName arguments:(NSArray *) args completionHandler:(void (^ )(id value))completionHandler`**  

示例:



[dwebview callHandler:@“append” arguments:@[@“I”,@“love”,@“you”]

completionHandler:^(NSString * _Nullable value) {

   NSLog(@"call succeed, append string is: %@",value);

}];

// call with namespace ‘syn’, More details to see the Demo project

[dwebview callHandler:@“syn.getInfo” completionHandler:^(NSDictionary * _Nullable value) {

    NSLog(@"Namespace syn.getInfo: %@",value);

}];




**`disableJavascriptDialogBlock:(bool) disable`**: **小心使用**。  

如果你再javascript中调用弹窗函数(`alert`, `confirm`, 或 `prompt`), 那么APP将会挂起,因为这些弹窗都是**模态**的,会阻塞APP主线程,此时javascript执行流也会阻塞。如果你想避免阻塞,可以通过此API禁止,禁止后,一旦 javascript中调用了这些弹窗函数,APP将弹出**非模态**对话框,并立即返回,( `confirm` 会返回 `true`, `prompt` 返回空字符串)。  

如:



[dwebview disableJavascriptDialogBlock: true]




如果你想恢复**模态**对话框,传 `false` 调用即可.



**`setJavascriptCloseWindowListener:(void(^_Nullable)(void))callback`**。  

当 Javascript中调用`window.close`时,DWKWebView会触发此监听器:



[dwebview setJavascriptCloseWindowListener:^{

    NSLog(@"window.close called");

}];




**`hasJavascriptMethod:(NSString*) handlerName methodExistCallback:(void(^)(bool exist))callback`**:检测是否存在指定的 javascript API,`handlerName`可以包含命名空间.



**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/7693f9feaee916a7ee0ea19d7444f72c.png)
![img](https://img-blog.csdnimg.cn/img_convert/e21ea98a90a169e295fa4718e5e03b9e.png)
![img](https://img-blog.csdnimg.cn/img_convert/02add53e889449c6f210acad4df41e97.png)
![img](https://img-blog.csdnimg.cn/img_convert/c73220c983c99b89ff4c0deee35c02bd.png)
![img](https://img-blog.csdnimg.cn/img_convert/ad17d51d1f44e1c0265d679789b0d036.png)
![img](https://img-blog.csdnimg.cn/img_convert/f7bd2ed0253b7624d9436d056539282a.png)
![img](https://img-blog.csdnimg.cn/13f2cb2e05a14868a3f0fd6ac81d625c.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)**
![img](https://img-blog.csdnimg.cn/img_convert/21d742c5462111913dda8ac25d1db866.png)



### 总结

**其实上面说了这么多,钱是永远赚不完的,在这个知识付费的时代,知识技能提升才是是根本!我作为一名8年的高级工程师,知识技能已经学习的差不多。**在看这篇文章的可能有刚刚入门,刚刚开始工作,或者大佬级人物。

像刚刚开始学Android开发小白想要快速提升自己,最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以这里分享一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

**这么重要的事情说三遍啦!点赞+点赞+点赞!**
![](https://img-blog.csdnimg.cn/img_convert/0bf5f847f8ea7de314d545f5d55b6c48.webp?x-oss-process=image/format,png)

### 【Android高级架构师系统学习资料】高级架构师进阶必备——设计思想解读开源框架  

第一章、热修复设计
第二章、插件化框架设计
第三章、组件化框架设计
第四章、图片加载框架
第五章、网络访问框架设计
第六章、RXJava 响应式编程框架设计
第七章、IOC 架构设计
第八章、Android 架构组件 Jetpack

![](https://img-blog.csdnimg.cn/img_convert/d86347882f6100140493a686d1da0252.webp?x-oss-process=image/format,png)

> **本文已被[CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》]( )收录**

[**一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

**AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**

架设计
第三章、组件化框架设计
第四章、图片加载框架
第五章、网络访问框架设计
第六章、RXJava 响应式编程框架设计
第七章、IOC 架构设计
第八章、Android 架构组件 Jetpack

[外链图片转存中...(img-f0JREXRQ-1712132683064)]

> **本文已被[CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》]( )收录**

[**一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

**AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值