iOS 项目技术选型

  • 暗黑模式方案

    • 明确需求: 不会增加除系统暗黑模式外的其他模式
    1. 系统暗黑模式方案:
      • 优点:
        • 系统Assets资源支持动态色,动态图,原生支持,代码侵入性最小
        • 默认支持系统更换模式时已经创建的页面实时刷新效果,不需要销毁根控制器重新创建
        • Assets创建动态色,动态图完美支持xib,不需要额外适配
      • 缺点:
        • 仅支持iOS 13+系统
        • 仅支持日间暗黑两种模式,无法新增其他主题
        • layer层级需要自己控制刷新粒度
    2. SwiftTheme方案:
      • 优点:
        • 可以服务器动态下发个性化主题,方便增加除暗黑模式外的其他主题
        • 不受系统版本限制
      • 缺点:
        • 系统控件的color,image等相关属性全都不能用,必须全部替换成theme_color,theme_image等扩展属性,才能实现更换主题时已经创建的页面实时刷新效果,否则必须销毁根控制器重新创建
        • xib适配方案有两种:
          1. 通过扩展给xib扩展新属性设置color,image等相关,设置扩展属性时通过选中主题设置对应颜色,不能直接设置控件的color,image等原生属性
          2. 将xib中的控件关联到代码中,通过代码设置theme_color,theme_image等扩展属性
        • 代码侵入性太强
    • 最终方案选择: 系统暗黑模式方案(需求明确不会新增除暗黑模式外的其他模式更优)
  • 多语言国际化方案

    • 明确需求: app内提供更换语言功能, 在app内更改语言后,已经创建的页面及时刷新,不能销毁根控制器重新创建。
    • 难点:
      • 跟app关联的语言国际化,只能通过代码控制,xib怎么国际化?
      • 不销毁根控制器重新创建,已经创建的页面怎么刷新?如果是每个页面加通知,那每个页面需要刷新的部分怎么抽取?对业务代码逻辑影响多大?是否有明确规范,新人接替是否好维护?
      • 跟语言关联的有静态页面控件刷新,业务逻辑刷新(如banner图上有文字,语言改变后banner图也需要刷新)
      • 怎么控制刷新粒度,如果栈里的静态控件太多,业务逻辑刷新太多,一次性全部刷新是否会影响性能?还是分批刷新?
    1. 切换根控制器方案: 切换语言直接重新创建根控制器
      • 优点:
        • 逻辑简单,代码0浸入
      • 缺点:
        • 必须退回根控制器重新加载,不能停留在当前页面实时刷新
    2. 通知方案: 每个页面监听语言改变来刷新需要刷新的控件和逻辑
      • 优点:
        • 已经创建的页面能实时刷新
      • 缺点:
        • 每个页面都需要监听通知
        • 语言改变时所有创建的页面控件和逻辑都同时刷新,会影响一定性能
        • 写业务代码需要关心哪些控件需要刷新,剥离出来刷新,不太友好
    3. i18n自定义方案: 向每个控件注入一段block,语言改变时调用,也可以在改变时做标记,在页面将要出现的时刷新
      • 优点:
        • 已经创建的页面能实时刷新
        • 写业务代码不需要关心哪些控件需要刷新
        • 静态控件统一规范,统一写法,业务逻辑刷新单独控制
      • 缺点:
        • 代码中设置text,title,attributedText等文本的地方都需要加前缀.i18n.text来设置,浸入性较大
    4. 触发生命周期函数: 语言改变时将当前栈里的控制器销毁并替换新的,让控制器重新走生命周期函数
      • 优点:
        • 已经创建的页面能实时刷新
        • 逻辑简单,代码0浸入
      • 缺点:
        • 需要明确当前栈结构,遍历移除旧的,创建新的替换,需要明确创建新控制器依赖的参数,绝对不能更改栈层级结构和控制器类型,
        • 如果每个控制器的子控制器太多,怎么处理?如果子控制器也重新创建,那么子控制器布局呢?
        • 没有好的思路明确上述依赖
    • 最终方案选择: i18n自定义方案
  • 资源管理方案(R.swift)

    • 优点:
      • 解决图片名称,国际化key,字体名称等字符串硬编码问题,转成强类型方便排错,方便写代码联想
    • 缺点:
      • 为了保持统一性,都在R结构体文件中生成对应字符串映射的值,导致R文件过大,打开反应迟钝
  • 模块解耦方案

    • 明确需求: 后续进行组件化
    1. 路由方案(URLNavigator):

      • 优点:

        • 极高的动态性,适合h5跳转
        • 方便地统一管理多平台的路由规则
        • 易于适配 URL Scheme
        • 因为路由表存在,结构清晰
      • 缺点:

        • 传参方式有限,无法利用编译器进行参数类型检查,所有的参数都只能从字符串中转换而来
        • 依赖于字符串硬编码,难以管理
        • url 的"注册"、"使用"必须用相同的字符规则
    2. Target-Action方案(CTMediator): 利用分类为路由工具添加新接口,在接口中通过字符串获取对应的类,再用runtime创建实例,动态调用实例的方法

      • 优点:
        • 利用分类可以明确声明接口,进行编译检查
        • 实现方式轻量
      • 缺点:
        • 需要在 mediator 和 target 中重新添加每一个接口,模块化时代码较为繁琐
        • 在分类中仍然引入了字符串硬编码,内部使用字典传参,一定程度上也存在和 URL 路由相同的问题
        • 无法保证所使用的模块一定存在,target 模块在修改后,使用者只有在运行时才能发现错误
        • 过于依赖 runtime 特性, 在 Swift 中扩展 mediator 时,无法使用纯 Swift 类型的参数
        • 创建过多的 target 类
    3. protocol 匹配方案(BeeHive): 将 protocol 和对应的类进行字典匹配,之后就可以用 protocol 获取 class,再动态创建实例

      • 优点:

        • 利用接口调用,实现了参数传递时的类型安全
        • 直接使用模块的 protocol 接口,无需再重复封装
      • 缺点:

        • 由框架来创建所有对象,创建方式有限,例如不支持外部传入参数,再调用自定义初始化方法
        • 用 OC runtime 创建对象,不支持 Swift
        • 只做了 protocol 和 class 的匹配,不支持更复杂的创建方式和依赖注入
        • 无法保证所使用的 protocol 一定存在对应的模块,也无法直接判断某个 protocol 是否能用于获取模块
    • 最终方案选择: 路由(URLNavigator)方案
  • 空页面占位视图方案

    • 明确需求: 空数据,页面加载失败默认展示占位视图
    1. DNZEmptyDataSet:
      • 优点:
        • tableView,collectionView自动显示隐藏
      • 缺点:
        • 不支持普通view
        • 不能覆盖父视图,如果父视图有其他控件,需要单独隐藏
        • 网络加载失败时不能显示
    2. 自定义YLEmptyDataSet:
      • 优点:
        • 支持普通view, 覆盖父视图, 不需要对父视图的其他控件进行单独隐藏
        • tableView,collectionView自动显示隐藏 - 提供网络加载失败默认视图
        • 缺点:
          - 加到普通view上必须手动隐藏
    • 最终方案选择: 自定义YLEmptyDataSet
  • 状态管理方案

    • ReactorKit
  • 网络层方案

    • Moya/RxSwift + HandJson
  • App缓存方案

    • 基于缓存库再次封装Cache
  • Loading+Toast方案

    • 自定义HUD
  • 代码格式化

SwiftLint (程序静态分析)方案
安装:可以使用homebrew进行全局安装:
需要在已经安装了homebrew 前提下:
打开终端输入: brew install SwiftLint

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容