iOS Collection学无止境App架构师之路

iOS项目架构设计

2016-08-17  本文已影响1683人  js丶

前言

参考资料

饿了么移动APP的架构演进

猿题库 iOS 客户端架构设计

客户端动态化系列之——URLRoute

iOS移动端架构的那些事

iOS关于架构的那些事

总结:一个iOS项目的代码组织架构

浅谈Hybrid技术的设计与实现之一

浅谈Hybrid技术的设计与实现之二

如何打造一个高性能Hybrid App

iOS应用架构谈(一):架构设计的方法论

接口编程那些事

谈谈依赖注入与面向接口编程思想

MVVM With ReactiveCocoa

**... 未完待续 **

其他信息

项目整体架构

整体项目架构图 整体项目架构图之二

下面项目设计中暂时没有设计到RN相关内容,参考了饿了么架构博客,暂时先这么画

模块化技术分析:

MVVM变种 ViewModel产生联动处理 BaseViewController BaseViewController--2
* 使用Aspects来hook系统的函数,实现一些动态加入的一些代码(日志、统计..)
* 结构化、步骤化的模板方法
* 统一push管理
* 统一的拦截处理

NetWork网络数据交互

步步为营----选择网络请求与响应框架

步步为营----网络层数据传输优化

** 1.网络请求为什么使用delegate而非block?**
答:(1)block很难追踪,难以维护 (2)block会延长相关对象的生命周期,会造成引用循环 (3)delegate效率比block高

核心功能类最好使用delegate回调,至于上层业务、UI事件等等可以使用block.

** 2.还有哪些可以进行网络传输优化? **
答:(1)直接使用ip地址,减少dns域名解析
(2)使用缓存手段减少请求的发起次数(规定几秒内连续网络请求,只使用本地缓存response data数据)
(3)每次App启动从服务器拿一份IP列表并缓存,这些IP是所有提供API的服务器的IP(NSURLProtocol)
(4)对传输的数据进行压缩,减小传输数据的体积

Data Storage本地数据存储

NSKeyedArchiver:存储实体类模型对象和Foundation对象数据

Keychain:通常要管理多个账户,需要登录用户id密码

NSUserDefaults:NSUserDefaults存储的数据类型有NSNumber、NSString、NSDate、NSArray、NSDictionary、BOOL、
NSInteger、float、double

Core Data:Core Data是一个框架,用于在应用程序中管理对象模型层。

** CoreData的使用,如何处理多线程问题?**
答:

** 如何进行Core Data版本迁移?**

**当我们仅仅是对数据模型增加实体或者可选属性时可以使用迁移准备(轻量级迁移) **

官方文档中介绍如下的改变支持轻量级迁移:

** 迁移过程**

** 如何自定义 Core Data 迁移? **

** 如何进行大数据集迁移? **

MVVM业务架构模式

ViewModel封装网络请求、步骤化逻辑代码、输入校验等UI逻辑等步骤

为什么要用objection将一组相关的协议与实现类的module绑定?

答:使用的具体类的所有细节只有module类知道,外界调用者一概不知,尽可能减少耦合

Base公共类

全局UIViewController公共的父类BaseViewController.

编写全局UITableViewController的公共父类BaseTableViewController

编写全局Cell的公共父类BaseCell

App的crash,跟踪log

Hot fix热修复

这样一来就通过下载脚本的方式临时对发出版本完成了热修复,注意这只是iOS运行时的特性在App启动的时刻完成的临时修复,但实际产生bug的代码仍然还是在App中,只有通过下次发版本才能彻底修复.

**JSPatch是如何使用js脚本文件去替换objc的实现(JSPatch内部对js补丁文件的使用过程)? **

对App中的产生bug、crash的函数进行运行时的的修复(替换),归根结底就是利用了iOS的runtime特性对objc_method_t函数对于的IMP指针的指向进行替换。

PushNotification推送通知

极光:基于Binary Interface V2协议

APNs 推送原理及问题

Binary Interface V1

v1协议有几个问题

** APNs 丢失消息的原因? **

** v2协议解决v1的几个问题?**

** JPush iOS 推送相比直接向 APNs 推送有什么好处呢? **
1.减少开发及维护成本
2.减少运营成本:

融云:提供开源服务器端,灵活性较好,文档齐全

1.融云不维护好友关系,只负责转发消息(可以从web后台(也就是服务器端)可以直接调用融云提供的接口发送消息,消息从fromUserId转发到toUserId,那么用户的好友关系和群组是保存在公司的服务器的)

2.发送消息是走融云的服务器(token)fromUserId(自己的id)走到融云的服务器,然后融云服务器转发到好友toUserId那里,因为消息体中含有很多的属性,消息体本身可以附带信息,比如targetId(就是toUserId,这里两者一样),extra附加信息,功用于提供给开发者拓展能,可以使消息附带信息,但是大小有限制,一般附带字符串或json数据,字段解决了好友头像的及时更新功能,这个字段的用法放开发篇章中细细讲解。

3.每个APP的注册用户都会被分配一个userId,分配userId这个任务还是要我们后台自己来搞,当用户A注册的时候,后台分配给A一个userId并且返回给前端开发人员使用,前端开发人员拿到A的userId之后,就要用这个A用户的唯一的userId去登录融云的服务器,融云只负责转发消息,注意点不是任何人有个userId都可以随便连接融云的服务器,UserId经过Token验证的,有这个Token就让你连接,没有token的话,滚蛋

4.如何获取token?
token的获取是要自己公司的后台提供一个获取融云token的专门接口,自己的后台开发人员去看文档做接口,获取到token后,就可以拿一个用户A的userId去连接融云的服务器了,融云的方法叫connectWithToken

5.客户端appkey对应服务器端appSecret,例如注册用户使用A服务器,此时客户端B登陆想要登陆只能对应服务器端B,因为appkey与appSecret是一一对应的

6.实现单聊、群聊、聊天室conversationType设置对应类型

7.RCIMFriendsFetcherDelegate,RCIMUserInfoFetcherDelegagte:这个代理方法是提供好友信息的,enableMessageAttachUserInfo:默认NO,如果YES,发送消息会包含自己用户信息。

融云推送图(消息远程推送的流程):

APP为前台状态和后台活跃状态 APP处于后台暂停状态 服务器端开源项目
上一篇 下一篇

猜你喜欢

热点阅读