一、2.0时代
1.经历的坑
- 交易流水列表“/app/200/trade/gettradedetail_all”筛选时间查询返回速度过慢
- 订单查询不能扫条形码
- 交易流水列表显示了“交易失败”状态订单
- 订单详情“交易失败”订单优惠金额显示信息错误
- 覆盖安装概率性无法及时获取device_token,导致收不到推送。
- iOS12.1以上系统无法语音播报
- 新款手机XR尺寸问题,导致导航栏实际位置不匹配
- 终端管理新终端类型无法及时更新
2.做过的有效优化策略
- 接口需要针对优化
- 放开扫条形码限制
- 默认不查询“交易失败”状态订单
- “交易失败”订单优惠金额逻辑优化(之前使用字段错误)
- 覆盖安装会马上调用登录接口,加上从友盟推送换为阿里推送导致,偶发性时间,从2.0升级版本到3.0不会有这种问题。
- app本地存有大量音频文件,iOS12.1以上系统语会根据金额获取对应音频文件,通过sounds字段发送给手机,让手机捕获对应音频进行语音播报
- 新款手机样式尺寸问题只能通过适配处理
a.框架
MVC
b.组件
- 阿里云HTTPDNS
AlicloudHTTPDNS
- 阿里云推送
AlicloudPush
- 网络加载库
AFNetworking
- 页面布局
Masonry
- 网络图片
SDWebImage
- 模型对象库
JSONModel
- 调试工具
FLEX
- 二维码条形码
LBXScan
- 表格刷新
MJRefresh
- 数据库
FMDB
3.非业务场景
1 阿里云统计 AlicloudMAN
二、3.0时代
1.针对2.0时代的填坑策略
- UI和UE的革新
- 模型类的严格封装,减轻
Controller
压力 - 将版本适配提高至
iOS9.0
使用 - 优化覆盖安装处理
- 优化消息推送策略
2.继续挖坑
a.框架
MVC --- RxSwift+Moya+HandyJSON
Swift
-
Swift
注重安全性,OC
注重灵活性。 -
Swift
更易于维护,文件分离后结构更清晰。 -
Swift
更加安全,它是类型安全的语言。 -
Swift
代码更少,简洁的语法,可以省去大量冗余代码 -
Swift
速度更快,运算性能更高。 -
Swift
是静态类型语言,而OC是动态类型语言。
MVC
- 控制器(Controller)--> 负责转发请求,对请求进行处理。
- 视图(View) --> 界面设计人员进行图形界面设计。
- 模型(Model) --> 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。
RxSwift
-
RectiveX
机制(由RxSwift
基于Swift
实现)的出现,让程序里的事件传递响应方法做到统一。将之前那些常用的事件传递方法(比如:delegate
、notification
、target-action
等等),全部替换成Rx
的“信号链”方式。 - 如果使用
MVVM
开发模式话,通过RxSwift
可以获得更加方便的数据绑定的方法,使得MVVM
开发更加如虎添翼。
//数据绑定
musicListViewModel.data
.bind(to: tableView.rx.items(cellIdentifier:"musicCell")) { _, music, cell in
cell.textLabel?.text = music.name
cell.detailTextLabel?.text = music.singer
}.disposed(by: disposeBag)
//点击列表
tableView.rx.modelSelected(Music.self).subscribe(onNext: { music in
print("你选中的歌曲信息【\(music)】")
}).disposed(by: disposeBag)
Moya
Moya
是一个基于Alamofire
(Swift
语言中的AFNetworking
) 的更高层网络请求封装抽象层。它可以对我们项目中的所有请求进行集中管理,方便开发与维护。同时Moya
自身也提供了对RxSwift
的扩展。首先定义一个 provider,即请求发起对象。往后我们如果要发起网络请求就使用这个 provider。
接着声明一个 enum 来对请求进行明确分类,这里我们定义两个枚举值分别表示获取频道列表、获取歌曲信息。
-
最后让这个 enum 实现 TargetType 协议,在这里面定义我们各个请求的 url、参数、header 等信息。
let DouBanProvider = MoyaProvider<DouBanAPI>() //请求分类
public enum DouBanAPI {
case channels //获取频道列表
case playlist(String) //获取歌曲
}
//请求配置
extension DouBanAPI: TargetType {
//服务器地址
public var baseURL: URL {
switch self {
case .channels:
return URL(string: "https://www.douban.com")!
case .playlist(_):
return URL(string: "https://douban.fm")!
}
}
//各个请求的具体路径
public var path: String {
switch self {
case .channels:
return "/j/app/radio/channels"
case .playlist(_):
return "/j/mine/playlist"
}
}
//请求类型
public var method: Moya.Method {
return .get
}
//请求任务事件(这里附带上参数)
public var task: Task {
switch self {
case .playlist(let channel):
var params: [String: Any] = [:]
params["channel"] = channel
params["type"] = "n"
params["from"] = "mainsite"
return .requestParameters(parameters: params,
encoding: URLEncoding.default)
default:
return .requestPlain
}
}
}
`HandyJSON`
- `HandyJSON` 是一个用于 `Swift` 语言中的 `JSON` 序列化/反序列化库。
- 将`JSON`映射到对象
- 将对象映射到`JSON`
- 嵌套对象(独立,在数组或字典中)
- 映射期间的自定义转换
class Channel: HandyJSON {
var name: String?
var nameEn:String?
var channelId: String!
var seqId: Int?
var abbrEn: String?
required init(){}
func mapping(mapper: HelpingMapper) {
mapper <<< self.channelId <-- "channel_id"
}
}
`RealmSwift `
- `RealmSwift`是基于`Realm`对`RxSwift`扩展
- `Realm` 不是基于 `Core Data`,也不是基于 `SQLite` 封装构建的。它有自己的数据库存储引擎。
- `Realm` 还提供了一个轻量级的数据库查看工具(`Realm Browser`)。可以用它进行一些简单的编辑操作(比如插入和删除操作)
`Base`
- `BaseModel` 基于 `HandyJSON `将基础返回类和请求类进行封装
- `RxNetworkService` 基于 `Moya`将网络请求封装处理
class RxNetworkService {
//获取频道数据
func loadChannels() -> Observable<[Channel]>{
return EPOSProvider.rx.request(.channels)
.mapJSON()
.asObservable()
.mapObject(type: Douban.self)
.map{$0.channels ?? []}
}
}
- `BaseViewController` 基础控制器类,将常用功能封装,例:页面统计等
### b.组件
1. 阿里云HTTPNS
- 官方`Demo`对`iOS`使用`HTTPDNS`的例子是基于`OC`的,介绍过于简单,目前还无结合`Swift`的网络请求库`Moya`一起配合使用。
2. 阿里云推送 `AlicloudPush`
3. 页面布局 `SnapKit`
4. 网络加载 `Moya`
5. `Swift` 中响应式编程 `RxSwfit`
6. 请求网络图片 `Kingfisher`
7. 模型库 `ObjectMapper`
8. 调试工具 `FLEX`
9. 扫码工具 `swiftScan`
8. 其它...
## 3.非业务场景
1 阿里云统计 `AlicloudMAN`