Appearance
場館登入
最後更新:2026-04-07
功能說明
本平台登入成功後,系統自動啟動體育場館登入流程:
- 場館登入觸發 — 本平台登入成功後自動啟動體育場館登入
- SportStatusProvider 登入 — 三場館(FB/UP/DB)各自取得 Token
使用者流程
- 主畫面載入後 → 系統自動登入上次使用的體育場館(FB/UP/DB)
- 場館登入成功 →
STNotify.userLoginFB/UP/OB→ 體育首頁開始載入賽事資料 - 切換場館時 → 觸發新場館的
SportStatusProvider.connect()
頁面跳轉
- 場館登入成功 →
STNotify.userLoginFB/UP/OB→ 體育首頁開始載入賽事資料
技術視角(開發看這裡)
相關檔案
| 類型 | 檔案路徑 |
|---|---|
| GameStatusManager | /Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Common/GameStatusManager/GameStatusManager.swift |
| SportStatusProvider(協議) | /Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Common/GameStatusManager/Provider/SportStatusProvider.swift |
| FBSportStatusProvider | /Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Common/GameStatusManager/Provider/FB/FBSportStatusProvider.swift |
| UPSportStatusProvider | /Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Common/GameStatusManager/Provider/UP/UPSportStatusProvider.swift |
| DBSportStatusProvider | /Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Common/GameStatusManager/Provider/DB/DBSportStatusProvider.swift |
| GameType | /Users/user/Work/bbsport-new/BBSport/Tab/体育/Sport/Common/GameStatusManager/GameType.swift |
| 維護管理 | /Users/user/Work/bbsport-new/BBSport/Tools/MaintenanceManager/GameMaintenanceManager.swift |
| API(代理跳轉) | /Users/user/Work/bbsport-new/BBSport/API/STAPI/STAPI+ProxyJumpRequest.swift |
API
| 功能說明 | Namespace | Endpoint | Method | 主要參數 |
|---|---|---|---|---|
| 場館登入(三場館共用) | STAPI | STAPI.GameJumpRequest | POST | gameId = channelId,回傳含 token + apiSrc 的 URL |
資料模型
三場館對照表
| 項目 | FB 極速體育 | UP/BB 體育 | DB 體育 |
|---|---|---|---|
| Provider | FBSportStatusProvider | UPSportStatusProvider | DBSportStatusProvider |
| 登入成功通知 | STNotify.userLoginFB | STNotify.userLoginUP | STNotify.userLoginOB |
| Token 失效通知 | STNotify.reLoginFB | STNotify.reLoginUP | STNotify.reLoginOB |
| 維護判斷 | GameMaintenanceManager.shared.fb | GameMaintenanceManager.shared.up | GameMaintenanceManager.shared.db |
getDefaultGameType() 預設場館選擇邏輯
| 條件 | 返回值 |
|---|---|
savedGameType == .bbAmuse(上次在娛樂) | .bbAmuse |
所有體育都維護(isAllSportMaintenance) | .bbAmuse |
| FB 維護 + 上次是 FB | 優先 UP,UP 也維護則 DB |
| DB 維護 + 上次是 DB | 優先 FB,FB 也維護則 UP |
| UP 維護 + 上次是 UP | 優先 FB,FB 也維護則 DB |
| 其他 | savedGameType(上次選擇的場館) |
GameJump 多平台登入
App 內嵌入多個第三方體育平台(FB / DB / UP),各平台使用 GameJump 機制取得帶 token 的 URL 進行登入。
架構
SportStatusProvider (protocol)
├── FBSportStatusProvider (FB 體育)
├── DBSportStatusProvider (DB 體育)
└── UPSportStatusProvider (UP 體育)由 GameStatusManager 統一管理各平台登入狀態。
流程
- 觸發時機:使用者進入體育 Tab 或切換體育平台時,
SportStatusProvider.connect()被呼叫 - 前置檢查:確認本平台已登入(
isLoginThisPlatform)且該平台未維護(isMaintenanceFactory),且非正在登入中(loginStatus != .logging) - 請求 GameJump:呼叫
STAPI.GameJumpRequest(gameId: channelId)→ 後端回傳帶 token 的 URL - 解析 URL:從回傳 URL 中解析
token和域名(FB/UP 解析apiSrc,DB 解析apiDomain),存入 Provider 的token和gameJumpURL屬性,同時更新UserDefaults(如fbSportPath、upSportPath) - 驗證:URL 不能包含
//localhost:或game_error.html,且必須包含token和對應域名欄位 - 失效重連:監聽
STNotify.reLoginFB/reLoginOB/reLoginUP,失效後呼叫reconnect()→ 重新fetchGameJumpURL,最多重試 5 次,超過則觸發onLogout()登出
GameJump 預檢
STAPI.GameJumpPreCheckRequest 在跳轉遊戲前檢查:
transferAvailable:是否可轉帳(false 時彈窗提示)userHasAwardAmount:使用者是否有獎金餘額userHasRecharge:使用者是否有充值記錄
GameJump 配置
登入成功時,logonDataProcessing 會呼叫 IFMainSwitch.updateGameJumpConfig(response["data"]["gameJumpConfig"]),將後端下發的各遊戲 jump path 配置快取至 IFMainSwitch.gameJumpConfigs。
實作重點
- 三場館共用同一 API:
STAPI.GameJumpRequest(body: .init(gameId: channelId)),差異僅在 channelId - 場館登入是自動的:本平台登入成功後
STNotify.logged→GameStatusManager.start()自動啟動場館登入,使用者無需手動操作 - 只登入當前場館:
start(by: currentGameType)只登入上次使用的場館,切換場館時才觸發其他場館登入 - 維護優先於登入:
connect()判斷維護中直接 return,不嘗試登入 - 重連上限 5 次:Token 失效後最多重連 5 次,超過直接登出整個 App 回到登入頁
- BB = UP 別名:
GameType.bbSport = GameType.upSport,typealias BBSportAPI = UPSportAPI,所以場館實際上是 FB/UP/DB 三個
API 呼叫流程
場館登入序列
STNotify.logged 觸發
└─ GameStatusManager.start(by: currentGameType)
└─ SportStatusProvider.connect()
├─ 前置檢查: isLoginThisPlatform + !isMaintenanceFactory + loginStatus != .logging
└─ STAPI.GameJumpRequest(gameId: channelId)
├─ 成功 → 解析 token + 域名 → STNotify.userLoginFB/UP/OB
└─ 失敗 → reconnect() (最多 5 次) → 超過則 onLogout()場館選擇
5 個 Tab: 廣場 / 遊戲 / 體育 / 注單 / 我的
└─ 預設場館: savedGameType (上次選擇)
└─ 若維護: 自動切換至可用場館 (FB 優先)