---
# System prepended metadata

title: 打造你的 App 架構 - iOS 模塊化及路由方案
tags: [iPlayground2020]

---

---
title: "打造你的 App 架構 - iOS 模塊化及路由方案"
tags: "iPlayground2020"
---

# 打造你的 App 架構 - iOS 模塊化及路由方案

{%speakerdeck wchuang/da-zao-ni-de-app-jia-gou-ios-mo-kuai-hua-ji-lu-you %}

# 打造你的 App 架構 - iOS 模塊化及路由方案
Frank 17LIVE/ 前滴滴出行 iOS

模塊化和路由，在兩三年前就已經在大陸很紅(火)了
字節跳動有分團隊，有基礎架構和業務，基礎架構有涵蓋到這個部分

## 模塊化/模組化
### SDK 設計
- 讓每個功能獨立存在，減少耦合
- 把 App 裡每個功能都當作 SDK 來設計
- 將 App 內核心功能進行分類

### 設計原則
- 定義易用穩定的公開接口
- 封裝不必要的細節
- SOLID 準則

### 大型專案可能會面臨的問題
- 業務界線不明確
- 通用功能與業務功能耦合
- 重複的輪子太多
- 一堆詭異的常數定義
- 無法快速產生 B 專案

### 如何開始
熟悉業務邏輯（頁面的跳轉和商業邏輯）看程式碼或是文件，整理出流程圖

### 分層架構
- Modules (Login/ Product/ ...)
- ServiceManager (Auth/ Common Model)
- AppKit (Router/ ImageManager/ ThemeManager/ UIComponents)
- Foundation (Network/ DB/ Utilities/ Others)

### 路由
蘋果有提供 OpenURL
App 內路由，讓 VC 之間可以互相溝通

#### 常見的解決方案 Objc
- JLRoutes
- MGJRouter
- routable-ios
- CTMediator

### 設計思路
- 定義每個頁面的 URIs 規則
- 路由內部維護 mapping table
- 註冊每條 URIs 對應的頁面、參數、行為
- 傳入 URI
- 解析

### MGJrouter
- URI 有相同的前綴 `mgj://`
- 註冊所有的 URIs
- 在某個 VC 呼叫 `[MGJRouter openURL:userProfileURL withUserInfo:userInfo completion:^(id result) {}];`
- 處理呼叫後的邏輯

`userInfo` 中可以放需要的 `data`，例如 `userID`，以及 `sourceViewController`，讓新的頁面可以加在 `sourceViewController` 上

## 總結
- 模塊化對專案的影響
- 開發者思維轉變
- 有層次的架構
- 路由解耦頁面跳轉、溝通
- 沒有最好的，只有最適合的

###### tags:`iPlayground2020`