Yummypets iOS应用程序堆栈

今年即将结束,我们想为 Yummypets 应用程序 共享iOS堆栈 我们开始做吧!

该应用程序的97%是完全用Swift编写的。 总共46k行代码。

MVC

整个应用程序遵循good’ol MVC模式 。 当控制器太大时,我们会将它们重构为较小的控制器。

核心

我们所有的模型逻辑和网络代码都封装Core.framework中。 这迫使我们将逻辑和视图代码分开。 这也具有使我们能够在不启动完整应用程序的情况下处理纯逻辑的巧妙优势。

网络层

我们的网络层隐藏在Api界面后面。 这意味着我们的View控制器对我们的网络库一无所知。 这也意味着我们可以将api实现切换为返回虚拟数据以进行测试,而无需触摸控制器\ o /的任何一行

图像加载和缓存🖼

我们使用Kingfisher异步加载图像和缓存处理。 该api很简单,但是非常可定制。 我们以前使用AlamofireImage,但由于性能原因而切换到Kingfisher。

联网☁️

对于网络,我们使用ws☁️,这是一个简单的基于诺言的JSON网络库。

它具有打包3件东西的优点:

  • 出色的Alamofire库,用于网络请求
  • 一个简单的Promise库
  • 一个简单的JSON解析库

这种整洁的抽象层使我们能够有效地添加和维护路由。

异步🕐

我们严重依赖Promises来保持我们的异步代码清洁和可维护 。 为此,我们使用🎬

JSON解析⚙️

我们对JSON解析库有严格的要求:不应强迫我们对模型进行子类化,同时支持类和结构,并且要尽可能简单。 为此,我们使用Arrow🏹,它将为我们处理所有样板JSON解析代码,并保持模型映射的清洁和可维护。

布局🏝

我们不会使用StoryboardXibs ,原因是我们在此不做详细说明。 TLDR更容易维护 。 您可以在这里找到有关此问题的精彩文章。

是的,我们所有的视图和TableView单元格都在代码中! 这带来了巨大的好处!

如您所知,纯自动布局的代码非常冗长 ,这就是为什么我们使用Stevia🍃使其保持可读性可维护性

等一下,但是编码视图的代码很慢不是吗?

好的代码注入injection感谢injectionForXcode,我们可以比以往更快地编码视图

“害羞的”导航栏🙈

对于导航栏隐藏在滚动条上的沉浸式 Feed,我们使用andreamazz的AMScrollingNavbar实现。

图像选择器和滤镜📸

关于媒体捕获,我们有很多要求。

我们想要一个完整的Swift解决方案,支持照片视频图库 ,方形裁剪滤镜 ! 毫不奇怪,我们不得不编写自己的。 为此,我们推出了自己的Fusuma版本,该版本深受Instagram设计的启发,您可以在此处获取

部署🚀

持续整合🤖

比特升 显然这是发生在我们身上的最好的事情。 进行新构建需要2个小时到一分钟! 我们每天都使用它来运行单元测试 。 按下“ staging ”分支会自动触发TestFlight构建 。 更少的构建时间=更多的时间编码\ o /。 此外,它还具有持续集成的所有优势,例如确保应用程序在新机器上构建。

TestFlight✈️

我们使用Testfilght与内部和Beta测试人员共享构建。 是的,那里有很多替代方案,但是在大多数情况下,我们会努力成为好Apple公民,并使用Apple工具。 关于Testflight的最烦人的事情是,有时在没有明显原因的情况下,构建可能会挂起半小时到4个小时,然后再交付给测试人员。 令人敬畏的部分是它与iTunes connect 完全集成 ,使事情变得简单

it流

我们的git flow 非常 标准,我们在功能分支上开发功能,说“ 过滤器 ”,然后在“ dev ”上合并它。 完成后,我们通过合并“ 暂存 ”来测试结果,“ 暂存 ”会自动触发TestFlight部署。 一旦获得苹果公司的批准,我们将“ 标签 ”合并为“ 母版 ”。

工具🛠

依赖管理器🕸

迦太基 是我们依赖管理的首选方式。 比Cocoapods少为人知,但由于我们所有的选择都是出于简单性的考虑 ,因此迦太基是必经之路。

代码整理

我们使用SwiftLint 保持我们的代码库干净一致。

本地化🏁

我们使用Localize 它使我们的本地化文件保持整洁并按字母顺序排序。 它检查丢失,未翻译未使用的密钥,从而实现App的轻松本地化。

我们使用Laurine从我们的Localization.string文件生成类型安全的结构。 现在使用点语法(“ UserValidation.Popup.Title”)会生成一个不错的命名空间结构。 除了完美的自动补全功能之外如果缺少转换键 ,编译器现在也会中断

资产安全网👮

在设计趋势每年都在变化的世界中,我们需要一种方法来防止资产丢失。 虽然像Misen或SwiftGen这样的解决方案很棒,但它们会生成额外的快速结构,并使我们远离Apple解决方案 (即图像文字) 。 他们解决了一个问题:资产消失时代码会中断,因为相应的结构也是如此。

这正是AssetChecker👮所做的 同时使我们能够使用出色且易读的图像文字🙂另外,它还会在代码中未使用Asset时发出警告,非常适合清理持久项目。

推送通知📲

来自Parse Push( RIP ),我们仔细寻找了替代解决方案。 我们选择了Batch ,对此感到非常满意 。 他们的用户界面非常简单,其细分工具非常强大。 自动广告系列也非常适合消除保留\ o /

AB测试⚗️

优化地使我们能够以数据驱动的方式测试想法。

崩溃报告🐞

Crashlytics(现在是Fabric的一部分)是我们跟踪崩溃的首选工具。

分析📈

Google Analytics(分析)是我们分析的主要手段,但我们倾向于越来越多地使用Fabric,因为它提供了一口大小的分析,可以满足大多数基本需求(DNU,DAU,MAU等)。

深层链接🔗

即使在实际安装应用程序之前就检测出某人来自何处,这真是不可思议 。 为此,我们使用分支解决方案。

就是这样! 享受🙂