Skip to content

App 啟動

最後更新:2026-04-07


功能說明

App 從冷啟動到使用者可操作主畫面的完整流程,包含兩個階段:

  1. AppDelegate 初始化 — 域名探測、三方 SDK、路由註冊
  2. SceneDelegate 登入判斷 — Token 自動登入 or 顯示登入頁

使用者流程

  1. App 啟動 → 探測最快可用域名(異步)
  2. 若有有效 Token → 自動靜默登入(使用者不需操作)
  3. 若 Token 過期或無 Token → 顯示登入/注冊頁
  4. 登入成功 → 自動切換至主畫面
  5. 前後台切換:進入背景暫停所有輪詢,回到前台恢復

頁面跳轉

  • 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 初始化順序(關鍵步驟)

順序操作說明
4AppDomain.shared.setDefaultUrls()設定預設域名
10STDomainListManager.shared.startFindFastDomain尋找最快域名(異步,成功後觸發後續)
16DDConfigManager 客服 SDK 初始化客服域名設定 + 註冊服務

實作重點

  1. 域名探測是前置條件startFindFastDomain 成功後才觸發核心業務請求(投注參數、充值運營位等),域名探測失敗則後續請求無法進行
  2. Token 自動登入SceneDelegate 判斷 KEY_TOKEN 存在且 TOKENTIME 未過期,直接走 LoginByToken 免登入
  3. 前後台輪詢管理:進入背景 STPauseAllPolling()、回到前台 STResumeAllPolling(),避免背景無效請求
  4. 登出統一收口:無論手動登出、被踢、平台失效、重連失敗,都走 GameStatusManager.logout()resetProviders()STNotify.logout.post()

setUpChangeWindows() 切換到主畫面邏輯

情境 A:從已有頁面 push 出的登入頁(isShowingLoginVC = true

  1. dismiss 登入頁
  2. 已登入 → 延遲 0.1s → STNotify.logged.post()

情境 B:冷啟動的登入頁(isShowingLoginVC = false

  1. 檢查 APP 級別維護 → 維護中直接 return(停在維護頁)
  2. STNotify.changeKeyWindow.post() → SceneDelegate 收到 → window.rootViewController = MainViewController()
  3. 已登入 → 延遲 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() → 客服 SDK

Token 自動登入 (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