Appearance
App 啟動
最後更新:2026-04-07
功能說明
App 從冷啟動到使用者可操作主畫面的完整流程,包含兩個階段:
- AppDelegate 初始化 — 域名探測、三方 SDK、路由註冊
- SceneDelegate 登入判斷 — Token 自動登入 or 顯示登入頁
使用者流程
- App 啟動 → 探測最快可用域名(異步)
- 若有有效 Token → 自動靜默登入(使用者不需操作)
- 若 Token 過期或無 Token → 顯示登入/注冊頁
- 登入成功 → 自動切換至主畫面
- 前後台切換:進入背景暫停所有輪詢,回到前台恢復
頁面跳轉
- App 冷啟動(Token 有效)→ 自動登入 → 主畫面(
MainViewController) - App 冷啟動(Token 無效)→ 登入/注冊頁 → 登入成功 → 主畫面
- APP 維護中 → 停在
BBMaintainViewController(維護頁),不進入主畫面
技術視角(開發看這裡)
相關檔案
| 類型 | 檔案路徑 |
|---|---|
| AppDelegate | /Users/user/Work/bbsport-new/BBSport/AppDelegate/AppDelegate.swift |
| AppDelegate 推送擴展 | /Users/user/Work/bbsport-new/BBSport/AppDelegate/AppDelegate+JPPush.swift |
| AppDelegate SDK 擴展 | /Users/user/Work/bbsport-new/BBSport/AppDelegate/AppDelegate+SDK.swift |
| SceneDelegate | /Users/user/Work/bbsport-new/BBSport/AppDelegate/SceneDelegate.swift |
| 登入服務(OC) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Login_Register/IFLoginService.m |
| 登入服務 Header | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Login_Register/IFLoginService.h |
| 維護管理 | /Users/user/Work/bbsport-new/BBSport/Tools/MaintenanceManager/GameMaintenanceManager.swift |
| 域名管理 | /Users/user/Work/bbsport-new/BBSport/Tools/Domain/M/AppDomain.swift |
| 域名探測核心 | /Users/user/Work/bbsport-new/BBSport/Tools/STDomainListManager/STDomainListManager.swift |
| 三方 SDK 初始化 | /Users/user/Work/bbsport-new/BBSport/Tools/STThirdPartyManager/STThirdPartyManager.swift |
| 三方 SDK Key 定義 | /Users/user/Work/bbsport-new/BBSport/Tools/STThirdPartyManager/ThirdPartyKey.swift |
| 極光推送 Header | /Users/user/Work/bbsport-new/BBSport/Tools/Push/JPPService.h |
| 路由註冊(OC) | /Users/user/Work/bbsport-new/BBSport/Tab/我的/Mine/Login_Register/ModuleApi.m |
| 通知定義 | /Users/user/Work/bbsport-new/BBSport/Tools/NotificationManager/STNotifyExtension.swift |
資料模型
AppDelegate 初始化順序(關鍵步驟)
| 順序 | 操作 | 說明 |
|---|---|---|
| 4 | AppDomain.shared.setDefaultUrls() | 設定預設域名 |
| 10 | STDomainListManager.shared.startFindFastDomain | 尋找最快域名(異步,成功後觸發後續) |
| 16 | DDConfigManager 客服 SDK 初始化 | 客服域名設定 + 註冊服務 |
實作重點
- 域名探測是前置條件:
startFindFastDomain成功後才觸發核心業務請求(投注參數、充值運營位等),域名探測失敗則後續請求無法進行 - Token 自動登入:
SceneDelegate判斷KEY_TOKEN存在且TOKENTIME未過期,直接走LoginByToken免登入 - 前後台輪詢管理:進入背景
STPauseAllPolling()、回到前台STResumeAllPolling(),避免背景無效請求 - 登出統一收口:無論手動登出、被踢、平台失效、重連失敗,都走
GameStatusManager.logout()→resetProviders()→STNotify.logout.post()
setUpChangeWindows() 切換到主畫面邏輯
情境 A:從已有頁面 push 出的登入頁(isShowingLoginVC = true)
- dismiss 登入頁
- 已登入 → 延遲 0.1s →
STNotify.logged.post()
情境 B:冷啟動的登入頁(isShowingLoginVC = false)
- 檢查 APP 級別維護 → 維護中直接 return(停在維護頁)
STNotify.changeKeyWindow.post()→ SceneDelegate 收到 →window.rootViewController = MainViewController()- 已登入 → 延遲 0.2s →
STNotify.logged.post()
API 呼叫流程
App 啟動序列
AppDelegate.didFinishLaunchingWithOptions
├─ Audio session + Firebase 初始化
├─ 極光推送 initJPPush
├─ GuardianHelper → 取得裝置 ID
│
└─ STDomainListManager.startFindFastDomain() → 尋找最快域名
└─ 域名就緒後 (並行):
├─ [API 1] STAPI.BetListParameter → 自訂參數
├─ [API 2] POST api/forehead/system/config/images/query → 充值運營圖
├─ [API 3] POST api/forehead/common/pic/load → 分享螢幕圖
├─ LiveComponent.registerLiveServices()
├─ SportManager.registerServices()
├─ LotteryConfigManager.registerServices()
└─ DDConfigManager.registerServices() → 客服 SDKToken 自動登入 (SceneDelegate)
SceneDelegate.scene(willConnectTo:)
├─ 取得 KEY_TOKEN + TOKENTIME
│
├─ Token 有效 (未過期):
│ └─ MGJRouter.openURL(LoginByToken) → 無 API,直接進入
│ → LOGINBYTOKEN = true
│ → setUpChangeWindows() → MainViewController
│
└─ Token 無效/過期:
└─ 顯示登入頁登入成功後 (STNotify.logged)
MainViewController 收到 logged 通知
├─ [API 1] POST api/forehead/system/config/images/query → 充值運營圖
├─ [API 2] STAPI.FriendDomainRequest → 好友域名
├─ [API 3] STAPI.InviteCodeRequest → 邀請碼
├─ EventDetailChatService.updateEntertainmentsListWithPrivilege()
└─ GameMaintenanceManager.checkStatus()
└─ [API 4] POST api/forehead/gamebet/product/productConfig