Appearance
App啟動(開發文檔)
最後更新:2026-04-10
📖 功能說明請參考 App啟動
架構
相關檔案
AppDelegate / SceneDelegate(4 個)
| 檔案 | 說明 |
|---|---|
AppDelegate.swift | App 初始化入口 |
AppDelegate+JPPush.swift | 極光推送初始化 |
AppDelegate+SDK.swift | 三方 SDK 初始化 |
SceneDelegate.swift | 場景管理 + 登入判斷 |
基礎路徑:
BBSport/AppDelegate/
Service / Manager(6 個)
| 檔案 | 說明 |
|---|---|
BBSport/Tab/我的/Mine/Login_Register/IFLoginService.m | OC 登入核心 |
BBSport/Tab/我的/Mine/Login_Register/IFLoginService.h | 登入服務 Header |
BBSport/Tools/MaintenanceManager/GameMaintenanceManager.swift | 維護管理 |
BBSport/Tools/Domain/M/AppDomain.swift | 域名管理 |
BBSport/Tools/STDomainListManager/STDomainListManager.swift | 域名探測核心 |
BBSport/Tab/我的/Mine/Login_Register/ModuleApi.m | 路由註冊(OC) |
三方 SDK / 推送(3 個)
| 檔案 | 說明 |
|---|---|
BBSport/Tools/STThirdPartyManager/STThirdPartyManager.swift | 三方 SDK 初始化 |
BBSport/Tools/STThirdPartyManager/ThirdPartyKey.swift | 三方 SDK Key 定義 |
BBSport/Tools/Push/JPPService.h | 極光推送 Header |
Helper(1 個)
| 檔案 | 說明 |
|---|---|
BBSport/Tools/NotificationManager/STNotifyExtension.swift | 通知定義 |
API
啟動時載入
投注自訂參數
POST api/forehead/system/config/get/common/config — urlForm — STAPI.XJBetConfigRequest
無參數,靠 Header token/uid 認證。
Response: JSON String,動態解析為字典(無強型別 Model),內容為投注自訂參數配置。常用 Key:
| Key | 說明 |
|---|---|
OBAccept | DB 賠率接受策略(1/2/3) |
STAccept | BB 賠率接受策略(0/1/2) |
UPAccept | UP 賠率接受策略(0/1/2) |
game | 上次遊戲類型(GameType rawValue) |
handicap | 盤口類型(1=歐洲盤, 2=香港盤) |
push_event | 推送事件配置 |
push_notice | 推送通知開關 |
vibrate | 是否震動 |
pattern | 日/夜模式(0=夜間, 1=日間) |
bet_pattern | 投注模式 |
呼叫路徑
路由 WL://BetListParameter → IFLoginService.getXJConfigWithHander → HttpService.getXJBetConfig。
充值運營圖
POST api/forehead/system/config/images/query — urlForm — STAPI.RechargeOperatePicRequest
| 參數 | 型別 | 必填 | 說明 |
|---|---|---|---|
| categoryId | String | ✅ | 運營位分類 ID,固定值 "20401,20402,...,20415" 多個逗號分隔 |
Response: JSON String,結構同 [STQueryResponseModel](見分享螢幕圖 Response)。
分享螢幕圖
POST api/forehead/system/config/images/query — urlForm — STAPI.OperatePicRequest
| 參數 | 型別 | 必填 | 說明 |
|---|---|---|---|
| categoryId | String | ✅ | 運營位分類 ID,傳入 "20304" |
共用 Endpoint
與充值運營圖共用同一 endpoint,差異僅在 categoryId。回傳中過濾 imageKey == "mem-app-gc-jpfx" 的圖片。
Response:([STQueryResponseModel])
Response 完整欄位(16 個)
| 欄位 | 型別 | 說明 |
|---|---|---|
| actionContent | String | 動作內容(如跳轉 URL) |
| actionTitle | String | 動作標題 |
| actionType | STQueryActionType | 動作類型 |
| categoryId | Int | 運營位分類 ID |
| content | String | 內容描述 |
| endTime | Int | 結束時間(timestamp) |
| id | Int | 記錄 ID |
| imageId | Int | 圖片 ID |
| imageKey | String | 圖片 Key(用於過濾) |
| images | String | 圖片 URL |
| name | String | 名稱 |
| sort | Int | 排序值 |
| sourceType | Int | 來源類型 |
| startTime | Int | 開始時間(timestamp) |
| status | Int | 狀態 |
| text | String | 文字內容 |
登入成功後載入
好友域名
POST api/forehead/user/domain/friend/domain — urlForm — STAPI.FriendDomainRequest
無參數,靠 Header token/uid 認證。
Response: String — 好友推薦域名字串。
邀請碼
POST api/forehead/activity/rmd/getInviteCode — urlForm — STAPI.InviteCodeRequest
無參數,靠 Header token/uid 認證。
Response:(InviteCodeModel)
| 欄位 | 型別 | 說明 |
|---|---|---|
| code | String | 推廣碼 |
| createTime | Int | 創建時間(timestamp) |
| status | Bool | 是否有效(0=無效, 1=有效) |
| updateTime | Int | 更新時間(timestamp) |
| userId | Int | 使用者 ID |
| username | String | 脫敏使用者名稱 |
產品配置 / 維護狀態
POST api/forehead/gamebet/product/productConfig — urlForm — STAPI.ProductConfigRequest
| 參數 | 型別 | 必填 | 說明 |
|---|---|---|---|
| type | Int | 非遊戲維護查詢時傳 2;查詢遊戲維護時不傳 |
Response: JSON String → [[String: Any]],每個元素為一個維護項目:
| 欄位 | 型別 | 說明 |
|---|---|---|
| startDate | Int | 維護開始時間(timestamp) |
| endDate | Int | 維護結束時間(timestamp) |
| reason | String | 維護原因 |
| status | Int | 1 = 維護中 |
| maintenFlag | Int | 維護旗標 |
| itemList | String | 平台 channelId(逗號分隔),空值 = APP 級別維護 |
| transferList | String | 轉帳列表 |
AppDelegate 初始化順序
| 順序 | 操作 | 說明 |
|---|---|---|
| 1 | 音訊類別設定 | AVAudioSession.setCategory(.playback) |
| 2 | 忽略 SIGPIPE | signal(SIGPIPE, SIG_IGN) |
| 3 | Firebase 初始化 | FirebaseApp.configure() |
| 4 | 阿里雲日誌設定 | setAliyuanLogConfig() |
| 5 | 設定預設域名 | AppDomain.shared.setDefaultUrls() |
| 6 | 獲取設備號 | getDeviceId()(優先啟動) |
| 7 | OC 顏色管理初始化 | STColorManager.sharedInstance().start() |
| 8 | 三方 SDK 初始化 | Bugly + 熱修復 + 極光推送 + LiveChat + 阿里雲 APM |
| 9 | 本地 URL 列表載入 | IFMainSwitch.getURLListFromLocal() |
| 10 | 域名探測配置 | registerDomainList 讀取 st_domain_config.json |
| 11 | 尋找最快域名 | 異步,成功後觸發投注參數、運營圖、視頻動畫、分享螢幕圖 |
| 12 | 添加通知監聽 | 登入、登出、客服退出等 |
| 13 | 路由服務註冊 | SportManager + UserInfoManager + LotteryConfigManager |
| 14 | SDWebImage 設定 | 快取 Key 過濾主機地址、1 個月快取、WebP 支援 |
| 15 | DD 客服域名設定 | DDConfigManager.configLocalDomain + configHost |
| 16 | 客服 SDK 初始化 | 阿里雲 OSS 客服域名 → DDConfigManager.registerServices |
| 17 | 熱修復任務檢查 | STHotFixTaskManager.shared.checkHotfixTask() |
| 18 | 資料庫初始化 | DBEngine.shared |
| 19 | 語言強制簡中 | Bundle.setLanguage(lang: .chinese(.simplified)) |
Token 自動登入
切換到主畫面邏輯
情境 A:從已有頁面 push 出的登入頁
- dismiss 登入頁
- 已登入 → 延遲 0.1s → 發送登入成功通知
情境 B:冷啟動的登入頁
- 檢查 APP 級別維護 → 維護中直接 return(停在維護頁)
- 切換 rootViewController 至主畫面
- 已登入 → 延遲 0.2s → 發送登入成功通知
實作重點
- 域名探測詳細機制:
- 候選域名來源:① 本地檔案
BTHostList.plist(上次成功保存)→ ② 內建st_domain_config.json中的realese_domains→ ③UserDefaults快取的上次最快域名 → 去重後並行探測 - 探測方式:對每個候選域名發送
POST {domain}{api_domain_path},攜帶device-id、os-type、timestamp、version、sign等 Header - 超時時間:單次請求 10 秒;全局超時 10 秒(
DispatchQueue.main.asyncAfter 10s) - Fallback 機制:所有域名失敗 → 從阿里雲 OSS(
aliyun_oss_url,Base64 解碼)取得 IP 列表 → 以 IP 重跑一次startFindFastDomain;IP 也失敗 →completion(nil)+ 通知findFastHost(0) - 成功後處理:保存最快域名至
UserDefaults;解析 response 中的data陣列寫入IFMainSwitch;將appMainUrlArray域名寫入BTHostList.plist
- 候選域名來源:① 本地檔案
- 域名探測是前置條件:探測成功後才觸發核心業務請求,失敗則後續請求無法進行
- Token 自動登入:判斷 Token 存在且未過期,直接免登入進入
- 前後台輪詢管理:進入背景暫停、回到前台恢復,避免背景無效請求
- 登出統一收口:手動登出、被踢、平台失效、重連失敗,都走統一登出流程
啟動失敗排查清單
| 現象 | 排查方向 |
|---|---|
| 白屏卡在啟動 | 域名探測全部失敗 → 檢查 st_domain_config.json 中的 realese_domains 和 aliyun_oss_url 是否可用 |
| 10 秒無回應 | STDomainListManager 10 秒超時觸發 → 檢查網路環境或 DNS 解析 |
| 域名探測成功但 API 失敗 | api_domain_path 路徑配置錯誤,或域名返回的 data 格式異常 |
| 客服不可用 | OSS 客服域名取得失敗 → 檢查 aliyun_oss_url 中的 kfUrl |
| Token 免登入失敗 | Token 過期或格式異常 → SceneDelegate 跳轉登入頁 |
| 路由跳轉無效 | Swift 模組需手動呼叫 registerService(),確認 SportManager / UserInfoManager / LotteryConfigManager 已註冊 |
| 推送不工作 | 極光推送 Key 配置錯誤,或 AppDelegate+JPPush 初始化失敗 |