Lint   Swift   Xcode   DocC   Genesis

Pages   Artifactory

Nodes 架构框架

大规模原生移动应用工程

概述

在 Tinder,我们创建移动应用程序通过让每个新一代单身人士更容易和更有趣地见面,来驱动和激发真实的连接。为了成功做到这一点,我们组建了一支庞大的移动工程师团队,他们不断交付大量并发项目,以增强、取悦和保护我们在全球无数的会员。

我们认为 Swift 和相关技术,包括 SwiftUISwift 并发,非常棒。然而,在 Tinder 的规模上创建移动应用程序也需要一个可扩展的应用程序架构。我们设计 Nodes 架构框架来专门解决如何构建一个复杂的应用程序,由一个大型团队,涉及许多同步计划。

Nodes 提供了一种模块化和基于插件的方法来组装一个具有无数屏幕和功能的应用程序。Nodes 利用反应式数据流进行状态管理,允许应用程序状态被分发,这在许多不同团队拥有代码库的不同部分时至关重要。但是,Nodes 不限定使用哪个反应式库,甚至不限定使用哪个 UI 框架,因为它与 SwiftUIUIKitAppKit 兼容。

Nodes 架构框架完全从头开始开发,旨在为 Tinder 提供独特的优势。虽然它受到 Uber 的跨平台移动架构框架 (RIBs) 中的概念和模式的启发,但没有源代码从 RIBs 复制到此项目中。 请注意,其他开源项目(如 NeedleMockolo)在创建带有 Nodes 的应用程序时被用作依赖项。

设计目标

可靠的可扩展性

一个大规模的应用程序必须尽可能接近 100% 的可靠性,同时进行变更和扩展,换句话说,当添加和测试新功能时。由于其设计,Nodes 架构允许每个功能实现非常高的测试覆盖率,并使应用程序的所有屏幕彼此完全分离。任何功能、任何屏幕、任何业务规则和任何底层服务都可以动态地替换为替代实现。 这种可扩展性允许安全地交付新功能和错误修复,以避免破坏现有功能。

功能实现一致性

Nodes 架构由 Nodes 框架支持,其中包括基类和伴随类型,以提供一种类似切饼干的方式进行功能开发。 应用程序的每个屏幕都使用完全相同的结构来实现。这种一致的可重复模式由 Nodes 的 Xcode 模板培养。

内存管理

原生移动应用程序需要在其宿主设备和操作系统中成为优秀的公民。必须仔细管理内存泄漏甚至正常的内存使用。这在一个小型应用程序中可能就足够具有挑战性了,而在一个大型代码库中,如果没有明确的计划,它可能会很快变得难以管理。Nodes 架构为应用程序中每个功能屏幕的生命周期提供了控制,从而可以回收每个体验的所有内存。

介绍

在基于 Nodes 的应用程序中,单个屏幕的代码实现被称为“节点”。可以将应用程序视为节点树,其中从一个屏幕导航到另一个屏幕会创建分支,称为将一个节点附加到另一个节点。

每个节点由几个预定义的类型组成,它们协同工作以驱动屏幕并提供清晰的关注点分离。屏幕的交互处理和业务逻辑包含在节点的 Context 中,而其 Flow 用于通过附加到应用程序中的其他节点来路由到其他屏幕。然后,每个节点的视图仅专注于演示。每个节点可以包含状态,该状态被转换为视图状态并提供给视图以进行显示。

Xcode 模板

需要 Nodes 的 Xcode 模板以确保正确使用 Nodes 框架并保证每个创建的节点都已正确定义。

通过 Xcode 模板生成器(Swift 包中的 nodes-xcode-templates-gen 可执行文件)执行模板的安装。 如果不自定义生成器,默认情况下会安装适用于 iOS 的 Xcode 模板,其中包含 UIKitSwiftUI。 如果需要,生成器支持 可选自定义

Xcode 模板安装

提示

完成 快速入门 设置(如下)后,Nodes 的 Xcode 模板将自动安装,因此这些手动安装 Xcode 模板的说明可以跳过,此处仅作为参考。

手动安装

要手动安装 Nodes 的 Xcode 模板,首先将 Nodes 作为依赖项添加到 Package.swift 文件。

将命令中的 <version> 替换为最新的 Nodes 版本。

.package(url: "git@github.com:Tinder/Nodes.git", from: "<version>")

然后运行以下 shell 命令

swift run -- nodes-xcode-templates-gen --id "Xcode Templates"

Xcode 模板将安装到以下位置,以便在 Xcode 的新建文件对话框中可用。

~/Library/Developer/Xcode/Templates/File Templates/Nodes Architecture Framework (Xcode Templates)

文档

文档可在线获取:https://Tinder.github.io/Nodes

提示

完成 快速入门 设置(如下)后,可以通过从 Product 菜单中选择 Build Documentation 在 Xcode 中查看文档。

快速入门

按照以下步骤将创建一个新的 iOS Xcode 项目,该项目已使用 Nodes、Needle 和 Mockolo 设置。

要求

安装依赖项

brew install mint xcodegen needle mockolo
mint install yonaskolb/genesis

克隆 Nodes 存储库

如果之前已克隆 Nodes 存储库,则可以跳过此步骤。

将命令中的 <version> 替换为最新的 Nodes 版本。

git clone -b <version> git@github.com:Tinder/Nodes.git

创建项目目录

重要提示: 请勿在克隆的 Nodes 存储库中创建新项目。

将命令中的 <path> 替换为新 iOS Xcode 项目将驻留的路径。

mkdir -p <path> && cd "$_"

生成项目文件

将命令中的 <path> 替换为克隆的 Nodes 存储库的路径。

mint run genesis generate <path>/genesis.yml --options "author:$(git config user.name), date:$(date +"%-m/%-d/%y")"

出现提示时,输入最新的 Nodes 版本、新 iOS Xcode 项目的名称和组织标识符(它是包 ID 前缀,例如 com.tinder)。

提示

此时不再需要克隆的 Nodes 存储库,如果没有创建其他项目的计划,则可以将其删除。

生成 Xcode 项目

xcodegen

只要 project.yml 文件发生更改或者添加或删除项目文件,就执行 xcodegen 命令。 有关更多信息,请参见 xcodegen 文档。

使用 Xcode 模板

Nodes 的 Xcode 模板将自动安装到

~/Library/Developer/Xcode/Templates/File Templates/Nodes Architecture Framework (Xcode Templates)

要将其他节点添加到项目,请在新文件对话框中滚动到 Nodes 模板。

已知问题

仅当在具有 Apple 芯片的 Mac 计算机上时,才创建以下符号链接以在 Xcode 使用的 $PATH 中配置这两个依赖项

ln -s /opt/homebrew/bin/needle /usr/local/bin/needle
ln -s /opt/homebrew/bin/mockolo /usr/local/bin/mockolo

仅当在执行 Mockolo 时遇到问题时,才从源代码构建

brew reinstall --build-from-source mockolo

可选自定义

UI 框架

默认情况下,Nodes 配置为用于 iOS 的 UIKitSwiftUI。 可以使用 自定义配置 启用用于 AppKit 或其他平台的 UI 框架。

观察框架

Nodes 与适用于较新操作系统版本的 Observation 框架兼容,或者可以配置为使用 ObservableObject 以实现向后兼容性。 其他观察库(例如 Perception)需要自定义设置

反应式框架

默认情况下,Nodes 配置为用于 Combine。 其他反应式框架(例如 RxSwift)需要 自定义配置和设置

参考资料

其他

Nodes Tree Visualizer 是一个 Swift 库和伴随的 Web 应用程序,用于树可视化。

贡献

虽然感谢对贡献此项目的兴趣,但它已完全开源,仅用于与社区分享。 这意味着我们目前无法接受外部贡献,并且不会审核或合并拉取请求。 要报告安全问题或漏洞,请提交 GitHub 问题。

许可证

根据 Match Group 修改的 3-Clause BSD 许可证获得许可。