Skip to content
BB9z edited this page Nov 6, 2023 · 30 revisions

关于本模版

CI Demos

强烈推荐优先阅读使用指南中的框架介绍部分和演示注解

历史

有时间听我讲讲这个模版的历史,这是抓住事物来龙去脉比较好的方法。

我从 2011 年末开始做 iOS 的外包项目直到 2014 年中,项目月均一个,本项目模版起源于此。这时期的模版主要提供项目起始的架子,上层功能很弱。

之后我加入了初创公司,开始近三年 996 的战斗模式,持续打磨一个 App,见证它从一个简单的社区应用,变成一个有着过百接口、超两百页面、包体积膨胀到 80 MB 的庞然大物。这时期的积累使得模版足以支撑中大型项目,功能也得到了极大的丰富,更重要的是树立正确的实现方式,这是模版描述中「iOS project done right」的根源。

在这两段工作经历中,都是小团队开发,iOS 团队从开始的一个人,到最后也不过四五人,不会涉及大厂完全隔离的模块模式。

2018 年至今,我又回到了外包的老路,但时间自由多了,可以花更多时间完善组件,让自己日后可以更懒。

现状

经过多年的积累,模版包含的内容很多,有方方面面成体系的解决方案,大量可以拆成一个个三方库的组件,数量在一百左右。但东西多了理解就有难度了,随组件的文档不一定够,demo 仍不足。

从项目页看过去,Objective-C 占比很高,这是历史原因。核心业务组件已经基本改写成 Swift 了,新增组件也基本是 Swift 的。

关于用 Interface Builder 还是用代码写界面,Storyboard 在这里是最优先支持的。大量的组件应该也支持代码创建,但从没这么做过。

使用

下载好后使用 bootstrap 脚本初始化,详见使用指南

UI 资源

模版中所用的图片素材的 Sketch 稿,可以在版本发布页下载,名称为 UI.Assets.sketch

版本变迁

只要我还在做 iOS 开发,模版会保持维护的,但对于外部使用者,跟随升级不太容易。推荐的做法是用支持目录比较的工具,手动、挑有用的部分进行更新,我对旧项目就是这么做的。

更新的细节可看提交记录,每条日志我尽量写清楚。下面只列更新会影响使用,涉及兼容性的变更,并提供升级建议。另外 demo 分支可以看到版本更新做迁移的实例。

Latest

  • HasItem、ThrowExceptionToPause() 移入独立的包,需显式引入,用法没有变化;
  • AppEnv 被 Swift 重写后的 AppCondition 替代,定义方式、方法均有调整;
  • MBControlGroup 被 Swift 重写后的 MBGroupSelectionControl 替代,selectIndex 属性变为 selectedIndex,不再具有任何布局能力;
  • 账户系统重做,MBUser 从实体变为 IAAccount 界面,AccountManager 负责管理;
  • MBBuildConfiguration 宏定义移除,新增 Swift 中的 ALPHA 作为替代;
  • UserDefaults 存储定义升级为 Swift 写法,需要重写定义;
  • debugCommands() 定义方式变化,需要导入 Debugger 包、声明 vc 符合 DebugActionSource、方法更名为 debugActionItems
  • 旧脚本系统重写替换,脚本目录名从 Scripts 更名为 ci_scripts
  • 一些更名:
    • NSAccountDefaults 变为 AccountDefaults
    • StoryboardCreation identifierInStroyboard => identifierInStoryboard
    • MBHightlightTintImageView => MBHighlightTintImageView,属性 hightlightTintColor => highlightTintColor
    • ListStateView,属性 stautsLabel => statesLabel

6.0

  • newFromStoryboard() 方法改为 Swift 实现,所有需要用的 vc 必须显示声明符合 StoryboardCreation 协议并设置 storyboardID;
  • APIErrorDomain 更名为 API.errorDomain
  • 一些错误的 complation 拼写被修正为 completion;
  • MBFormFieldVerifyControl 的 invaild 属性、方法因修正更名;
  • 通过 InterfaceBuilder 设置 UIViewController 样式的 IBInspectable 属性名全部去除 rf 前缀; * ViewController 朝向控制升级,字段名和取值都变了。

5.0

  • Xcode 需求提升为 12+;
  • 除个别例外,业务主要模块均改写为 Swift;
  • MBCollectionView,底部刷新的加载方式变了,之前是定义在外部 xib 中,现在推荐在 Storyboard 中启用 setcion footer 将 footer 作为刷新指示器,supplementary view 的定制有更完善的 API 支持;
  • MBCollectionView,不再设置 delegate 为自身;
  • Xcode 12 IBDesignable 终于稳定可用了,涉及 UIEdgeInsets 的 IBInspectable 属性进行了重命名,影响到 MBButton、MBControlGroup、MBTextField;
  • MBENVFlag 类型进行了调整,便于 Swift 中使用,现在是 OptionSet,可直接进行扩展,旧的地方全部需要调整;Objective-C 代码不能访问新的标志位,需重写或写死;
  • 导航 URL 跳转 Swift 重写后,AppNavigationJump() 需替换为 NavigationController.jump(url:context:);pageURL 的隐式声明不再支持,需要的页面现在必须用 AppPageURL 显式声明;
  • ZY 前缀的组件全部改为 MB;
  • 一些不常用或过时的组件被移除;
  • 颜色素材 Color 命名空间去除。

4.1

  • API 用 Swift 重写了,APIURLAssetsBase 常量去掉了,有需要重新定义即可,APIErrorDomain 更名为 API.errorDomain,图片加载的扩展去掉了,可直接用 SDWebImage 或 ZYImageView;
  • MBCollectionView 得到了完善,更接近 MBTableView。底部刷新采用安全的实现,不自动加载,需要在 IB 中自定义 section footer;
  • MBControlGroup 及其子类的选中通知现在默认只在用户触发时调用(通过调整 selectionNoticeOnlySendWhenButtonTapped 的默认值);
  • MBFormSelectButton 支持 generics,在 Swift 中使用需修改声明;
  • MBSearchTextField,doSearch 回调增加了用于区分是否自动搜索的参数;
  • MBSearchViewController 不再设置默认的导航和状态栏样式;
  • MBShareManager,现支持 WeChat SDK 1.8.6+;
  • MBTableView fetchItems(withPageFlag:) 重命名为 fetchItems(nextPage:)
  • NSMilliDate 被移除,在整个应用中,如果日期格式一致,统一修改 JSONValueTransformer 实现即可;如果有多种日期格式,建议在模型上解析少见的格式;
  • 代码组件、UI 素材的组织有调整;
  • 颜色管理全面转用 asset catalog 管理,旧的颜色分类被移除。

4.0

  • API 请求组件底层大升级,API 类提供了兼容接口,除了完成回调增加一个完成参数外基本无需修改,但建议尽快升级到新版接口;
  • 导航样式默认无阴影,隐藏返回按钮标题。
Clone this wiki locally