美文网首页
APP3.0技术方案

APP3.0技术方案

作者: 弡_Qin | 来源:发表于2019-05-08 11:52 被阅读0次

    一、2.0时代

    1.经历的坑

    1. 交易流水列表“/app/200/trade/gettradedetail_all”筛选时间查询返回速度过慢
    2. 订单查询不能扫条形码
    3. 交易流水列表显示了“交易失败”状态订单
    4. 订单详情“交易失败”订单优惠金额显示信息错误
    5. 覆盖安装概率性无法及时获取device_token,导致收不到推送。
    6. iOS12.1以上系统无法语音播报
    7. 新款手机XR尺寸问题,导致导航栏实际位置不匹配
    8. 终端管理新终端类型无法及时更新

    2.做过的有效优化策略

    1. 接口需要针对优化
    2. 放开扫条形码限制
    3. 默认不查询“交易失败”状态订单
    4. “交易失败”订单优惠金额逻辑优化(之前使用字段错误)
    5. 覆盖安装会马上调用登录接口,加上从友盟推送换为阿里推送导致,偶发性时间,从2.0升级版本到3.0不会有这种问题。
    6. app本地存有大量音频文件,iOS12.1以上系统语会根据金额获取对应音频文件,通过sounds字段发送给手机,让手机捕获对应音频进行语音播报
    7. 新款手机样式尺寸问题只能通过适配处理

    a.框架

    MVC

    b.组件

    1. 阿里云HTTPDNS AlicloudHTTPDNS
    2. 阿里云推送 AlicloudPush
    3. 网络加载库 AFNetworking
    4. 页面布局 Masonry
    5. 网络图片 SDWebImage
    6. 模型对象库 JSONModel
    7. 调试工具 FLEX
    8. 二维码条形码 LBXScan
    9. 表格刷新 MJRefresh
    10. 数据库 FMDB

    3.非业务场景

    1 阿里云统计 AlicloudMAN

    二、3.0时代

    1.针对2.0时代的填坑策略

    1. UI和UE的革新
    2. 模型类的严格封装,减轻Controller压力
    3. 将版本适配提高至iOS9.0使用
    4. 优化覆盖安装处理
    5. 优化消息推送策略

    2.继续挖坑

    a.框架

    MVC --- RxSwift+Moya+HandyJSON

    APP3.0.png

    Swift

    • Swift注重安全性,OC注重灵活性。
    • Swift更易于维护,文件分离后结构更清晰。
    • Swift更加安全,它是类型安全的语言。
    • Swift代码更少,简洁的语法,可以省去大量冗余代码
    • Swift速度更快,运算性能更高。
    • Swift是静态类型语言,而OC是动态类型语言。

    MVC

    • 控制器(Controller)--> 负责转发请求,对请求进行处理。
    • 视图(View) --> 界面设计人员进行图形界面设计。
    • 模型(Model) --> 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

    RxSwift

    • RectiveX 机制(由 RxSwift基于Swift 实现)的出现,让程序里的事件传递响应方法做到统一。将之前那些常用的事件传递方法(比如:delegatenotificationtarget-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`
    

    相关文章

      网友评论

          本文标题:APP3.0技术方案

          本文链接:https://www.haomeiwen.com/subject/tytxgftx.html