58 同城 iOS 客户端组件化演变思路整理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yu_4074/article/details/74011137
2、标题:58 同城 iOS 客户端组件化演变历程
3、第一版App架构:功能比较简单,出发点是为了快速抢占市场,采取“短平快”的方式开发。
4、第二版架构:Hybrid框架:可以动态更新,中和苹果审核周期较长的问题
1)采取Native页面和H5页面 Hybrid框架
2)Hybrid框架:需要解决Web和Native交互问题
3)H5页面下载js、css、图片资源比较耗时,需要提高H5加载的速度
5、使用缓存来提升资源的加载和页面的渲染,解决4.3的问题
1)利用 cachedResponseForRequest方法进行拦截判断
2)如果需要缓存,获取URL和存储版本号去查询目标缓存
3)拿到目标缓存,判断目标缓存的版本是否比请求的版本新或相等,是则返回
4) 如果目标缓存的版本是否比请求的版本旧,再判断旧的程度 "复用缓存"
5)如果很旧,那么缓存响应为空,继续到网络请求数据,否则返回目标缓存,同时下载最新数据
6)如果拿到缓存,就取消请求,否则缓存响应为空,继续到网络请求数据,同时下载最新数据
7)显然请求数据和缓存的内置数据是两种格式,内置数据一个文件方便保存在本地
6、注意要在启动初始化时设置 [NSURLCache setSharedURLCache:hybridComp]//hybridComp是NSURLCache的子类
7、解决4.2的交互问题
1)Native调用Web,直接通过UIWebView的stringByEvaluatingJavaScriptString
2)Web调用Native的方式
8、基于AJAX来解决7.2的问题
0)首先事先把Navtive的代码,通过URL关联后,注册到UIWebViewController里
1)在Web里创建一个XMLHttpRequest对象,让其发起AJAX请求,然后想办法让Native用shouldStartLoadWithRequest 去拦截
2)而由于AJAX是进行页面局部刷新,所以不会走shouldStartLoadWithRequest方法
3)研究发现,UIWebView的所有请求包括AJAX都会走NSURLCache,那么考虑用NSURLCache子类拦截
4)拦截后根据URL找到Navite代码去执行
5)这个AJAX触发是H5页面触发来的
9、基于AJAX解决方案的缺点
1)在UIWebView中执行XMLHttpRequest异步请求时会有内存泄露
2)和NSURLCache的派生类有耦合
10、需要新方案解决9的问题
1)想办法走走shouldStartLoadWithRequest方法
2)向dom tree中添加iFrame元素,已触发请求
3)由于iframe方式是整个页面刷新,所以能执行UIWebView的回调方法shouldStartLoadWithRequest
11、把一些基础模块从App中独立出来进行多应用间的复用
1)可以将App拆分三层:从下至上:基础服务层、基础业务层、主业务层
2)基础服务层里的组件是与业务无关的,供上层调用,每个组件为一个工程,如网络、数据库、日志等。这里面有些组件是整个公司其他App也在使用。如乐高日志,对外提供一个SDK,与文档一起放在代码服务器上供其他团队使用。并将58 App中用到的所有第三方库都集中起来存放到一个专门的工程中,也便于更新维护
3)基础业务层里的组件是业务有关的,供主业务层使用,每个组件是一个工程,如登录、分享、推送、IM等。
4)主业务包括App首页、个人中心、各业务线业务和第三方接入业务,业务线业务主要包括发布、大类、列表、详情
12、工程拆分完后,就是工程集成了,我们用 Cocoapods 将各工程集成到一起编译运行和打包,对于每一个工程配置好.podspec 文件。
13、主业务层拆分:业务线和非业务线的划分
1)业务线:房产、二手、二手车、黄页、招聘等业务线
2)非业务线:列表、详情、首页、发布、发现、消息中心、个人中心及第三方业务
14、拆分原则
1)各业务线之间不肯能有依赖关系
2)非业务线工程不能对各业务线有依赖关系,即所有业务线都不继承App也能正常编译
3)各业务线对非业务线工程可以保留必要的依赖,如业务线对列表组件的依赖
15、拆分策略
1)将业务线非专用的文件或方法下沉到其他工程
2)Runtime,维护成本高
3)Category方式,如果非业务线依赖业务线中的某个方法,可以在非业务线中创建一个类A,方法实现为空;在业务线中创建这个A类的扩展A+a,实现这个方法;这样14.2原则成立。
16、总线
1)UI总线:处理组件间页面间跳转
2)服务总线:处理组件间服务的调用
17、跳转总线
1)主业务层每个组件内都有一个子分发中心,它的处理逻辑由各组件内来进行,但必须实现一些共同的接口,且这个子分发中心需要进行注册。
2)当组件内需要进行 UI 跳转时,调用总分发中心,将跳转协议传入总分发中心,总分发中心根据协议中组件标识(如业务线标识)找到对应的目标组件子分发中心,将跳转协议透传到对应的子分发中心。
3)接下来的跳转由子分发中心去完成。这样的方式极大降低了组件间的耦合度。
18、为了提高整个 App 的编译速度,我们为每个工程配置一个对应的库工程,里面预先由源码工程编译出来一个对应的静态库
19、对于 Jenkins 打包平台,我们也可以根据动态需求适当在源码和静态库之间做选择。
20、业务在不断变化,需求持续增多,技术也在不断地更新,我们的架构也需要不断进行调整和升级,架构的演进是一项长期的任务。

猜你喜欢

转载自blog.csdn.net/yu_4074/article/details/74011137