Appearance
維護模式(開發文檔)
最後更新:2026-04-10
📖 功能說明請參考 維護模式
架構
相關檔案
維護核心(3 個)
| 檔案 | 說明 |
|---|---|
BBSport/Tools/MaintenanceManager/GameMaintenanceManager.swift | 維護管理器(核心) |
BBSport/Tools/MaintenanceManager/GameMaintenanceStatusModel.swift | 維護狀態 Model |
BBSport/API/STAPI/STAPI+ProductConfigRequest.swift | 維護狀態 API 定義 |
維護頁面(2 個)
| 檔案 | 說明 |
|---|---|
.../BBMaintain/BBMaintainView.swift | 維護 UI |
.../BBMaintain/BBMaintainViewController.swift | 維護頁面控制器 |
基礎路徑:
BBSport/Tab/我的/Mine/Login_Register/登录注册/Maind/
體育相關(3 個)
| 檔案 | 說明 |
|---|---|
BBSport/Tab/体育/Sport/Common/GameStatusManager/GameStatusManager.swift | 場館登入管理 |
BBSport/Tab/体育/Sport/HomePage/Adapter/SportMaintenanceAdapter.swift | 體育首頁維護適配 |
BBSport/Tab/体育/Sport/Common/GameStatusManager/Provider/SportStatusProvider.swift | 場館登入協定 |
API
維護狀態查詢
取得平台維護資訊
POST api/forehead/gamebet/product/productConfig — urlForm — STAPI.ProductConfigRequest
| 參數 | 型別 | 必填 | 說明 |
|---|---|---|---|
| type | Int | 非遊戲維護查詢時傳 2;查詢遊戲維護時不傳(isGame=true 時 parameters 為空) |
Response: JSON String → [[String: Any]],每個元素為一個維護項目:
| 欄位 | 型別 | 說明 |
|---|---|---|
| startDate | Int | 維護開始時間(timestamp) |
| endDate | Int | 維護結束時間(timestamp) |
| reason | String | 維護原因 |
| status | Int | 1 = 維護中 |
| maintenFlag | Int | 維護旗標 |
| itemList | String | 平台 channelId(逗號分隔),空值 = APP 級別維護 |
| transferList | String | 轉帳列表 |
itemList 對應
| 值 | 含義 | 說明 |
|---|---|---|
0(或空值) | APP 整體維護 | itemList 為空且 status=1 時視為 APP 級別維護 |
1 | FB 體育 | 對應 GameType.fbSport.sportChannelId |
2 | 體育端-iOS 維護 | Socket chId 425 data 中 key "2" 表示體育端 iOS 維護狀態(見下方 chId 425 說明) |
3 | DB 體育 | 對應 GameType.dbSport.sportChannelId |
4 | UP 體育 | 對應 GameType.upSport.sportChannelId |
注意:
itemList中的值為動態 channelId,上表為常見預設值。實際比對邏輯在GameMaintenanceManager.loadData()中使用GameType.xxx.sportChannelId進行 switch。
Socket chId 425 data 格式
chId 425 推送的 data 為字典結構,以平台 ID 為 key:
json
{
"2": {
"children": [
{
"startDate": 1700000000,
"endDate": 1700100000,
"reason": "系統維護中",
"status": 1,
"maintenFlag": 1,
"itemList": "1,3",
"transferList": ""
}
]
}
}- key
"2"表示體育端-iOS 維護狀態 children陣列結構同ProductConfigRequestResponse- 收到後呼叫
updateMaintenanceStatus→ 取出children→STNotify.maintainID.post→receiveSocketMaintenanceInfo→ 共用setUpMaintainData+loadData解析邏輯
維護恢復流程
| 觸發方式 | 說明 |
|---|---|
| Socket 推送(chId 425) | 即時推送,status != 1 時自動恢復。無需額外 API 請求 |
| API 主動查詢 | App 啟動時 GameMaintenanceManager.addObservers() → checkStatus() → requestMaintenanceInfo() |
維護恢復的完整流程:
- 收到 chId 425 推送(
status不為 1 或itemList中移除了對應平台) loadData重置所有維護狀態(app/fb/db/up.isGameMaintenance = false)- 重新解析當前維護項目,只有
status=1的才設回維護中 maintenanceResultHandler回調通知 UIupdateAppMainTainView:若app.isGameMaintenance == false,將tempRootVC恢復為window.rootViewController
維護模式沒有輪詢機制,依賴 Socket 即時推送 + App 啟動時的一次性 API 查詢。
GameMaintenanceStatusModel
| 屬性 | 說明 |
|---|---|
isGameMaintenance | 是否維護中(@objc dynamic,可 KVO 觀察) |
isShowH5 | 是否顯示 H5 連結(APP 級別維護 = true) |
isShowBackBtn | 是否顯示返回按鈕(遊戲 IP 限制 = true) |
各平台存取
swift
GameMaintenanceManager.shared.app // APP 級別
GameMaintenanceManager.shared.fb // FB 體育(極速體育)
GameMaintenanceManager.shared.db // DB 體育
GameMaintenanceManager.shared.up // UP 體育實作重點
- 雙重資料來源:API 主動查詢 + Socket 被動推送,共用同一套解析邏輯
- 快取優先策略:
checkStatus()先用上次快取立即回調,再發 API 請求,避免畫面閃爍 - 回調機制:
maintenanceResultHandler為覆蓋式閉包,回傳(app, fb, db, up, isFromNetWork)五參數 - APP 維護替換 rootVC:直接替換
window.rootViewController,維護結束用tempRootVC恢復 - 全部維護時:
isAllSportMaintenance = true→ 自動切換到娛樂 Tab - channelId 為動態值:透過
IFCommonUtil.fbSportChannelID()等取得 - 防重複客服:
openCustomerService旗標防止在 IP 限制畫面上重複疊加客服 - 夜間模式:
BBMaintainView監聽夜間模式通知,動態切換背景圖和 Logo