Hybrid 框架介绍



Hybrid 交互设计
Native调用前端页面的JS方法,或者前端页面经过JS调用Native提供的接口,二者交互的桥梁皆Webview:
① NativeUI组件,header组件、消息类组件
② 通信录、系统、设备信息读取接口
③ H5与Native的互相跳转,好比H5如何跳到一个Native页面,H5如何新开Webview作动画跳到另外一个H5页面

资源访问机制
Native首先须要考虑如何访问H5资源,作到既能以file的方式访问Native内部资源,又能使用url的方式访问线上资源;须要提供前端资源增量替换机制,以摆脱APP迭代发版问题,避免用户升级APP。这里就会涉及到静态资源在APP中的存放策略,更新策略的设计,复杂的话还会涉及到服务器端的支持。
帐号信息设计
帐号系统是重要而且没法避免的,Native须要设计良好安全的身份验证机制,保证这块对业务开发者足够透明,打通帐户信息。
Hybrid开发调试
功能设计完并非结束,Native与前端须要商量出一套可开发调试的模型,否则不少业务开发的工做将难以继续,这个不少文章已经接受过了,本文不赘述。
至于Native还会关注的一些通信设计、并发设计、异常处理、日志监控以及 安全模块 由于不是我涉及的领域便不予关注了(事实上是想关注不得其门),而前端要作的事情就是封装Native提供的各类能力,总体架构是这样的:

遇到的几个问题
  1. shouldStartLoadWithRequest网页即将加载拦截url变化 
          解析出须要的参数
       function      ---> 须要触发的事件名
  args           ---> 上面方法需传入的参数
  callBackId   ---> 执行方法后的回调ID,会做为回传参数的一部分
  统一处理方法:
  handleEvent ---> 根据function判断须要触发的事件

2. 方法注入对象
func webViewDidFinishLoad(webView: UIWebView) {
self.context = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as? JSContext
self.context.setObject(unsafeBitCast(##需注入的方法##, AnyObject.self), forKeyedSubscript: ##注入方法对应名称##)
self.myWebView.stringByEvaluatingJavaScriptFromString("Hybrid.ready();")
 }

通常都在webViewDidFinishLoad中获取context并注入对象,但didCreateJavaScriptContext方法中,拿到JSContext注入对象,能解决加载过程当中注入对象

//注入对象
@protocol JSObjcDelegate <JSExport>
- (void)callCamera;
- (void)share:(NSString *)shareString;
@end

js调用oc获取数据以后,oc调用js须要在当前线程操做
// 这里经过此方法 在当前线程操做才不会形成卡死的现象 [self performSelector:@selector(callQWSJSWithArgument:) onThread:webThread withObject:@[callback, @(result), newToken, property] waitUntilDone:NO];


3. 请求回调方式
  在以前的项目中使用JSBridge,经过给web端注入session的方式来传递用户信息,web端拿着session本身去请求信息。现采用web端下达指令让Native去请求而后将数据回传的方式

4. 页面跳转
web页面跳转,pop和push动画,侧拉返回手势

5. 加载本地资源
加载本地资源,经过NSURLProtocol拦截请求,并处理加载逻辑
1.canInitWithRequest//判断请求是否为须要拦截的请求
2. startLoading//对需求拦截的请求进行处理
// 先在DocumentDirectory中查找,若是不存在再在NSBundle.mainBundle()中查找, 由于NSBundle.mainBundle()是应用打包时就打入app中的资源,而DocumentDirectory是后来下载的资源,因此优先使用Document路径下的资源


iOS7 以后苹果推出了 JavaScriptCore 这个框架, Android 那边和 iOS 相对统一