上一篇已经讲解了WKWebView与前端交互的基本使用,本文主要讲解自己设计方案,如何做到
- 耦合性
- 增加代码的复用率
- 减少重复代码
- 易维护
- 可扩展性强
demo下载地址
GitHub下载地址
首先思考一个问题:
一个项目中必定有很多URL请求如何如何在,每个页面必定有很多与客户端交互的是否每一次都要写一遍API当JS调用OC的时候
是否每次都要写一遍需要将被js调用的方法注册进去在代理中判断是否是那个函数?????
这个设计方案用了handle的注册的方式来进行管理,用了MVC和面向协议编程,无论增加多少JS把底层封装的WKWebView不要动,当有新的功能的时候,我们只需要新写一个codeHandle,然后注册一下,这样更加维护,可扩展性强,减少代码的复用
一:整体架构采用了MVC和工厂模式的面向协议
二:handle管理
2.1handle注册
注册 | 在ZMMWebAllCodeHandle 里面+ (void)registerCodeHandle:(nonnull Class)codeHandle |
---|---|
目的 | 当WLScriptMessageHandler执行代理的时候通过前端的函数《message.name》可以找到客户端约定的《message.name》在那个codeHandle的类里面,然后在对应的执行当前的codeHandle类的方法 |
1.2handle查询
原理:
遍历所有的 codeHandle 通过 runtime 的执行类的方法( class_getClassMethod 执行
每一个 handel[codeClass handleCodes];找到 每一个 handle 的所有 eventCode 去进
行对比 ,只要发现是这个eventCode 就确定是这个 Handle。
第一步:当拦截到 和message.name 的时候 执行(findRegisterCodehandle:)
第二步:开始在ZMMWebJspShareData 单例里面遍历所有的CodeHandle
通过每一个codeHandle 里面类方法+ (NSArray *)handleCodes 找每一个eventCode ,直到找到
当前的eventCode ,返回当前的 currentCodeHandle。
1.3 回调前端页面
-(void)callBackToJsp:(NSString*)json;
1.4 基类handle的功能接口(ZMMWebCodeBaseHandleInterface)
-(void)callBackToJsp:(NSString*)json | 数据回传jsp页面 |
---|---|
+(NSArray*)handleCodes | 处理code集合 |
-(NSArray*)setHandleCodesArray | 需要设置的code处理集合 |
-(void)handleWebMessageName:(NSString*)name messageBody:(NSString*)bod- | 用于浏览器监测调用code处理- |
- (UIViewController *)getCodeWebViewController | 获得getCodeWebViewController |
三.前端调用
var bankCards=["中国工商银行","中国农业银行","平安银行","建设银行","邮政银行"];
var sendStrs = {
"callback":"selectBankResult",
"title":"选择银行卡",
"cards":bankCards
};
var str = JSON.stringify(sendStrs)
window.webkit.messageHandlers.selectBank.postMessage(str);
四.新功能接入
步骤:
第一步:创建一个继承于ZMMWebCodeBaseHandle的类
第二步:CMBCWebAllCodeHandle类里面注册新建的的Handle
eg:[ZMMWebViewConfig registerCodeHandle::[新创建的handle class]];
第三步:实现ZMMWebCodeBaseHandle必须要实现的方法
1)-(NSArray*)setHandleCodesArray
2)+(NSArray*)handleCodes
3) -(void)handleWebMessageName:(NSString*)name
messageBody:(NSString*)body
第四步:数据回传jsp页面
1)callBackToJsp: