路線App HKTranApp

路線App / HKTranApp

系統設計規格 · System Design Specification · 系统设计规格

繁體中文 简体中文 English

1. 系統架構

HKTranApp 採用四層架構,各層職責分明:

層級職責關鍵元件
視圖層UI 渲染、用戶互動、導航DashboardView, SearchView, StopBrowserView
服務層業務邏輯、ETA 協調、搜尋ETARefreshEngine, RouteSearchEngine, NetworkMonitor
轉接器層各交通機構 API 通訊及數據標準化MTRAdapter, KMBAdapter, CitybusAdapter, FerryAdapter
數據層持久化儲存及記憶體模型SwiftData Entities, Canonical Models

2. 技術棧

項目技術
語言Swift 5.9+
UI 框架SwiftUI
持久化SwiftData
網絡URLSession + NWPathMonitor
並發Swift Concurrency(async/await, TaskGroup)
第三方依賴無(零第三方套件)

3. 數據模型

3.1 SwiftData 持久化實體

實體用途關鍵欄位
SavedCombinationEntity已收藏的路線+車站組合operatorType, routeNumber, rawStopId, groupID, cachedETAMinutes
WatchListGroup收藏清單分組name, sortOrder(最多 5 個)
RouteIndexEntry本地路線搜尋索引routeNumber, originTC, destinationTC, searchableText, direction
RouteIndexMeta索引下載狀態lastDownloadedAt, version, entryCount

3.2 標準化記憶體模型

模型用途
CanonicalRoute統一路線表示(跨交通工具)
CanonicalStop統一車站表示
UnifiedETA統一 ETA 表示(分鐘、時間、月台、是否即時)
RowETAState7 態 UI 狀態機

4. 轉接器層設計

每個交通機構的 API 格式各異,OperatorAdapter 協議將它們統一為標準模型。

4.1 各轉接器比較

項目MTRKMBCitybusFerry
API 來源rt.data.gov.hkdata.etabus.gov.hkrt.data.gov.hk靜態時間表
速率限制500ms不適用
方向值UP/DOWNO/IO/I靜態
月台資訊
即時數據✗(固定班次)

4.2 KMB 速率限制器

使用 Swift Actor 實現的 KMBRateLimiter,確保每次請求間隔不少於 500ms。多個組合共享同一車站時,會合併為單一 API 呼叫。

5. 服務層設計

5.1 ETA 刷新引擎(ETARefreshEngine)

參數
自動刷新間隔30 秒
API 超時10 秒
MTR/CTB 並發完全並行
KMB 並發按 stopId 批次(500ms 間隔)
離線行為跳過刷新,保留快取

5.2 網絡監控(NetworkMonitor)

5.3 路線搜尋引擎(RouteSearchEngine)

6. ETA 狀態機

每張路線卡片根據快取新鮮度及網絡狀態,顯示 7 種視覺狀態:

狀態觸發條件視覺效果
正常(Fresh)快取 < 90 秒正常透明度
稍舊(Stale)90 秒 – 5 分鐘80% 透明度,琥珀時鐘
離線(Offline)5–30 分鐘或無網絡60% 透明度,離線圖示
錯誤(Error)> 30 分鐘或 API 失敗紅色三角形
暫停服務API 回傳空陣列月亮圖示 +「暫停服務」
受限(Degraded)ETA > 120 分鐘「點擊查看站名」
載入中首次載入,無快取載入動畫

7. 離線與錯誤處理

8. 安全性

項目狀態
API 認證無需(全部使用公開開放數據 API)
傳輸安全僅使用 HTTPS
個人資料收集
位置追蹤
廣告 / 追蹤 SDK
數據儲存全部儲存在裝置本地
App Transport Security啟用(系統預設)

9. 效能設計

指標目標
12 個組合刷新時間< 2 秒
首個 ETA 回應< 200ms(漸進更新)
路線索引大小~463KB(~800-900 條記錄)
搜尋結果上限50 條
每卡片顯示 ETA最多 3 個
站點 ETA 預覽首 10 個站

10. 資料來源

交通工具API認證
港鐵 MTRrt.data.gov.hk(getSchedule.php)
九巴 KMBdata.etabus.gov.hk
城巴 Citybusrt.data.gov.hk(CTB ETA API v2)
渡輪 Ferry靜態時間表(運輸署公開資料)不適用

1. 系统架构

HKTranApp 采用四层架构,各层职责分明:

层级职责关键组件
视图层UI 渲染、用户交互、导航DashboardView, SearchView, StopBrowserView
服务层业务逻辑、ETA 协调、搜索ETARefreshEngine, RouteSearchEngine, NetworkMonitor
转接器层各交通机构 API 通讯及数据标准化MTRAdapter, KMBAdapter, CitybusAdapter, FerryAdapter
数据层持久化存储及内存模型SwiftData Entities, Canonical Models

2. 技术栈

项目技术
语言Swift 5.9+
UI 框架SwiftUI
持久化SwiftData
网络URLSession + NWPathMonitor
并发Swift Concurrency(async/await, TaskGroup)
第三方依赖无(零第三方包)

3. 数据模型

3.1 SwiftData 持久化实体

实体用途关键字段
SavedCombinationEntity已收藏的路线+车站组合operatorType, routeNumber, rawStopId, groupID, cachedETAMinutes
WatchListGroup收藏清单分组name, sortOrder(最多 5 个)
RouteIndexEntry本地路线搜索索引routeNumber, originTC, destinationTC, searchableText, direction
RouteIndexMeta索引下载状态lastDownloadedAt, version, entryCount

3.2 标准化内存模型

模型用途
CanonicalRoute统一路线表示(跨交通工具)
CanonicalStop统一车站表示
UnifiedETA统一 ETA 表示(分钟、时间、月台、是否实时)
RowETAState7 态 UI 状态机

4. 转接器层设计

每个交通机构的 API 格式各异,OperatorAdapter 协议将它们统一为标准模型。

4.1 各转接器比较

项目MTRKMBCitybusFerry
API 来源rt.data.gov.hkdata.etabus.gov.hkrt.data.gov.hk静态时间表
速率限制500ms不适用
方向值UP/DOWNO/IO/I静态
月台信息
实时数据✗(固定班次)

4.2 KMB 速率限制器

使用 Swift Actor 实现的 KMBRateLimiter,确保每次请求间隔不少于 500ms。多个组合共享同一车站时,会合并为单一 API 调用。

5. 服务层设计

5.1 ETA 刷新引擎(ETARefreshEngine)

参数
自动刷新间隔30 秒
API 超时10 秒
MTR/CTB 并发完全并行
KMB 并发按 stopId 批次(500ms 间隔)
离线行为跳过刷新,保留缓存

5.2 网络监控(NetworkMonitor)

5.3 路线搜索引擎(RouteSearchEngine)

6. ETA 状态机

状态触发条件视觉效果
正常(Fresh)缓存 < 90 秒正常透明度
稍旧(Stale)90 秒 – 5 分钟80% 透明度,琥珀时钟
离线(Offline)5–30 分钟或无网络60% 透明度,离线图标
错误(Error)> 30 分钟或 API 失败红色三角形
暂停服务API 回传空数组月亮图标 +「暂停服务」
受限(Degraded)ETA > 120 分钟「点击查看站名」
加载中首次加载,无缓存加载动画

7. 离线与错误处理

8. 安全性

项目状态
API 认证无需(全部使用公开开放数据 API)
传输安全仅使用 HTTPS
个人资料收集
位置追踪
广告 / 追踪 SDK
数据存储全部存储在装置本地
App Transport Security启用(系统预设)

9. 性能设计

指标目标
12 个组合刷新时间< 2 秒
首个 ETA 回应< 200ms(渐进更新)
路线索引大小~463KB(~800-900 条记录)
搜索结果上限50 条
每卡片显示 ETA最多 3 个
站点 ETA 预览首 10 个站

10. 数据来源

交通工具API认证
港铁 MTRrt.data.gov.hk(getSchedule.php)
九巴 KMBdata.etabus.gov.hk
城巴 Citybusrt.data.gov.hk(CTB ETA API v2)
渡轮 Ferry静态时间表(运输署公开资料)不适用

1. System Architecture

HKTranApp uses a four-layer architecture with clear separation of concerns:

LayerResponsibilityKey Components
ViewUI rendering, user interaction, navigationDashboardView, SearchView, StopBrowserView
ServiceBusiness logic, ETA orchestration, searchETARefreshEngine, RouteSearchEngine, NetworkMonitor
AdapterOperator-specific API communication & normalizationMTRAdapter, KMBAdapter, CitybusAdapter, FerryAdapter
DataPersistent storage & in-memory modelsSwiftData Entities, Canonical Models

2. Technology Stack

CategoryTechnology
LanguageSwift 5.9+
UI FrameworkSwiftUI
PersistenceSwiftData
NetworkingURLSession + NWPathMonitor
ConcurrencySwift Concurrency (async/await, TaskGroup)
Third-Party DependenciesNone (zero third-party packages)

3. Data Models

3.1 SwiftData Persistent Entities

EntityPurposeKey Fields
SavedCombinationEntitySaved route+stop combinationoperatorType, routeNumber, rawStopId, groupID, cachedETAMinutes
WatchListGroupWatch list groupname, sortOrder (max 5)
RouteIndexEntryLocal route search indexrouteNumber, originTC, destinationTC, searchableText, direction
RouteIndexMetaIndex download statelastDownloadedAt, version, entryCount

3.2 Canonical In-Memory Models

ModelPurpose
CanonicalRouteUnified route representation (cross-operator)
CanonicalStopUnified stop representation
UnifiedETAUnified ETA (minutes, time, platform, isLive)
RowETAState7-state UI state machine

4. Adapter Layer Design

Each transport operator has a different API format. The OperatorAdapter protocol normalizes them into canonical models.

4.1 Adapter Comparison

AspectMTRKMBCitybusFerry
API Sourcert.data.gov.hkdata.etabus.gov.hkrt.data.gov.hkStatic timetables
Rate LimitNone500msNoneN/A
Direction ValuesUP/DOWNO/IO/IStatic
Platform Info
Real-time Data✗ (fixed schedule)

4.2 KMB Rate Limiter

Implemented as a Swift Actor (KMBRateLimiter), ensuring ≥500ms between API requests. Multiple combinations sharing the same stop are batched into a single API call.

5. Service Layer Design

5.1 ETA Refresh Engine

ParameterValue
Auto-refresh interval30 seconds
API timeout10 seconds
MTR/CTB concurrencyFull parallel
KMB concurrencyBatched by stopId (500ms spacing)
Offline behaviorSkip refresh, preserve cache

5.2 Network Monitor

5.3 Route Search Engine

6. ETA State Machine

StateConditionVisual
FreshCache < 90sFull opacity
Stale90s – 5min80% opacity, amber clock
Offline5–30min or no network60% opacity, offline icon
Error> 30min or API failureRed triangle
No ServiceAPI returns empty arrayMoon icon + "No Service"
DegradedETA > 120min"Tap to view stop name"
LoadingFirst load, no cacheSpinner

7. Offline & Error Handling

8. Security

AspectStatus
API AuthenticationNone required (all public open-data APIs)
Transport SecurityHTTPS only
Personal Data CollectionNone
Location TrackingNone
Ads / Tracking SDKsNone
Data StorageAll stored locally on device
App Transport SecurityEnabled (system default)

9. Performance

MetricTarget
12 combinations refresh time< 2 seconds
First ETA response< 200ms (incremental updates)
Route index size~463KB (~800-900 entries)
Search results limit50 entries
ETAs per cardMax 3
Stop ETA previewFirst 10 stops

10. Data Sources

TransportAPIAuth
MTRrt.data.gov.hk (getSchedule.php)None
KMBdata.etabus.gov.hkNone
Citybusrt.data.gov.hk (CTB ETA API v2)None
FerryStatic timetables (Transport Department)N/A