Skip to content

域名總覽

為什麼需要域名探測?

App 的域名隨時可能被封鎖或無法訪問。為了讓用戶始終能正常使用,App 內建了一套域名探測機制:啟動時同時嘗試多個候選域名,誰先回應就用誰。如果全部候選都掛了,還有 OSS 兜底地址作為最後防線。

這份文件盤點 App 裡所有域名的來源、替換機制、和 fallback(備用值)

排查線上問題看哪份?

st_domain_config.json。線上(Release)環境的域名探測流程全部走這份檔案。domain.json 只影響開發人員本地 DEBUG 模式,與線上用戶無關。詳見 App 啟動 — 域名探測流程


域名來源總覽

App 裡用到的域名來自四種不同來源,不要搞混:

來源API / 機制涵蓋範圍
domain/list/v2api/forehead/system/domain/list/v2下面 UrlType 表格的 16 個 type,是主要的域名系統
getXJConfig小金配置 APIFB 體育 (fbSportPath)、UP 體育 (upSportPath)
場館登入回應OB 登入 APIOB 體育 (apiDomain)
外部 SDK / 寫死無 API,純寫死在 codeJPush 推送、阿里雲日誌、備用 IP

來源一:domain/list/v2(UrlType 體系)

來源

api/forehead/system/domain/list/v2 回傳的 data 陣列,每個物件有 type 欄位。App 用 BBUrlListModel 解析後存入對應 array,再由 IFMainSwitch.m 的 getter 取用。

API Request / Response 格式

RequestPOST /api/forehead/system/domain/list/v2(無 Body)

關鍵 Header:pid: bbapp-type: 1os-type: 3signtimestampdevice-id

Response

json
{
  "code": 1,
  "data": [
    { "type": 1, "domain": "https://...", "serviceType": 0, "clientType": 0 }
  ]
}

所有 type 都是取 domain 欄位。type 15、16 額外用 serviceType 判斷客服種類:

serviceType含義存入值
1智齒客服存入實際 domain URL
2LiveChat存入 "LiveChat" 標記
3ST 客服存入 "SDK" 標記
4ST 客服 SDK存入 "SDK" 標記(與 3 行為相同,code 註解不同但結果一樣)
實際 API 回應範例(2026-04-13 Proxyman 抓包)

從模擬器實際抓到的回應,6 個候選域名同時發出請求,最快的 106ms 勝出:

候選域名回應時間
m-ygha39p0x3.dpaw63qmfd14.com106ms(勝出)
m-ovnq29u5b3.wejaazhp47.com231ms
m-suxn33i1i0.vafrazwu44.com234ms
m-uthb76i2c2.zljzazmm59.com277ms
m-djwn09z3m2.vshwazor54.com317ms
m-ayhc45u7p3.iabf52qmhg7.com2909ms

回應 data 陣列包含以下 type(部分):

typedomainserviceType
0https://m.bbtyv33.com0
14 個主域名(如 m-c66a025qc1sfbx5h4.dfvfxolj102.com0
2wss://pushi32e54ih.bbpushl1ooe.com0
3https://eacjxoip129.com0
4https://m.iballbet.com0
6wss://chat-i5gfn52ai5sc.sldd28qmzs18.com0
7https://chat.abywxodlchat6.com0
9https://20.24.110.650
12https://mf.bbtyv3.com0
13https://23.97.72.178/login3
14https://23.97.72.178/login3
15"1"4(ST客服SDK → 存入 "SDK" 標記,domain 值不使用)
16https://23.97.72.178/login3
17SEO 域名0
18PXDD 域名0
21https://api.asia-fb.com0
30activity-h5 域名0
31https://23.97.72.1780
35sport-info-h5-1c5a6x(subdomain 片段,非完整 URL)0
36activity-h5-3aceg36k(subdomain 片段,非完整 URL)0

觀察重點

  • Type 1 回傳多筆,存入 appMainUrlArray 後寫入 BTHostList.plist
  • Type 13、14、31 伺服器有下發但 App 不處理(見下方「伺服器有下發但 App 不處理」段落)
  • Type 15 的 domain 是字串 "1",因為 serviceType = 4 會存入 "SDK" 標記,domain 值被忽略
  • Type 35、36 回傳的不是完整域名,是 subdomain 片段,需要跟主域名拼接

有在用的 UrlType(16 個)

Type名稱用途本地 fallback
1AppMainUrl手機主域名realese_domains 第一個
2PushUrl推送域名空(伺服器 → 從主域名拼接 → 寫死值,三層 fallback)
4SportUrl體育 Node 服務https://www.fldsj.cc
5MatchImageUrl球隊圖標http://teamicon.jswswl.com/
6ChatSocketUrl聊天室wss://chat.uubody.com:9507
7ChatReportUrl聊天舉報https://ws2-newchat.bbtstxqm7.com
8MatchResultUrl賽果http://matchresult.jswswl.com
9ZhiChiUrl智齒客服https://103.74.194.51/chat/h5/index.html
10LiveChatUrlLiveChat 客服https://103.74.194.51/chat/h5/index.html
11SportInformationUrl體育資訊https://sport-info-h5.bbmobilepro01.com(伺服器 → type 35 拼接 → 寫死值)
12ProxyUrl代理域名
15ServiceMainLine主線客服client_domain.json
16ServiceMinorLine次線客服client_domain.json
17SEOUrlSEO 域名
18PXDDUrl雷速 PXDD
30ActivityUrl活動跳轉https://activity-h5.bbmobilepro01.com
開發者參考:Model Property 與 Getter 對照
Type存入 Model PropertyGetter 方法
1appMainUrlArraygetUrlStrWithType:
2pushUrlArraygetPushUrl()
4sportUrlArraygetNodeServiceHost()
5mathchImageUrlArraygetTeamIconHost()
6chatSocketUrlsArraygetChatSocketUrl1/2()
7chatReportUrlArraygetChatReportUrl()
8matchResultUrlArraygetMatchResultHost()
9zhiChiUrlArraygetZhiChiKefuUrl()
10liveChatUrlArraygetLiveChatKefuUrl()
11sportInformationUrlArraygetSportInformationUrl()
12procyUrlArraygetProcyUrl()
15chatMainUrlArray + serviceType寫入 AppDomain.shared.serviceDomain
16chatMirrorlArray + serviceType存入 BBUrlListModel
17seoUrlArraygetSEOUrl()
18pxddUrlArraygetPXDDUrl()
30activityUrlArraygetActivityUrl()

間接使用的 UrlType(2 個)

這些 type 沒有獨立的 getter,但會被其他功能內部讀取:

Type名稱存入 Model Property誰在用
21SpeedSportUrlspeedSportArrayFB/UP 體育競速探測時,從這裡取備用域名列表
35PiazzaUrlpiazzaUrlArraygetSportInformationUrl() 內部拼接用

沒有使用的 UrlType(3 個)

Type名稱存入 Model Property備註
0PcUrlPC 域名,App 裡完全沒引用
3AppDownLoadUrlappDownLoadUrlArrayApp 下載域名,code 註解「不需要」
36H5Urlh5UrlArrayH5 拼接,有存入 model 但無人使用

伺服器有下發但 App 不處理的 UrlType(3 個)

伺服器有回傳,但 App code 裡沒有對應的解析邏輯,會被靜默忽略

從 Proxyman 實際抓包觀察到伺服器確實有下發這些 type:

Type實際回傳的 domainserviceType推測用途
13https://23.97.72.178/login3(ST客服)可能是其他平台(PC/H5)的客服入口
14https://23.97.72.178/login3(ST客服)同上
31https://23.97.72.1780用途不明

未定義的 UrlType(10 個)

type 19, 20, 22~29, 32~34 — 目前伺服器未下發,App 也無對應處理。


來源二:getXJConfig API(體育域名)

來源

小金配置 API (getXJBetConfig) 回傳的 response 中包含 fbSportPathupSportPath,App 存入 UserDefaults。

域名(fallback)用途API 欄位替換機制
https://api.inf18.comFB 體育 APIfbSportPathAPI 下發 → 存 UserDefaults + 競速探測
https://api.nsvip7.comUP 體育 APIupSportPath同上

FB / UP 優先順序:property(記憶體)→ UserDefaults(API 下發存的)→ 寫死值

競速探測(為什麼需要?):當 FB/UP 體育的 API 請求失敗時(域名可能被封),App 不會直接報錯,而是自動從 domain/list/v2 回來的 UrlType 21(SpeedSportUrl)備用域名列表中,同時探測所有域名,第一個回應的就作為新域名寫入 property + UserDefaults,後續請求自動切過去。10 秒內只觸發一次,避免重複探測。


來源三:場館登入回應(OB 體育)

來源

OB 體育場館登入成功後,從回應的 OBDomainModel 取得 apiDomain,寫入 IFMainSwitch.obSportHost

域名(fallback)用途替換機制
https://api.sportxxx278gwf4.comOB 體育 APIOB 登入回應 apiDomain → 寫入 property

OB 優先順序:property(登入回應寫的)→ 寫死值


來源四:寫死在 code(無法動態替換)

以下域名掛了只能發版

域名用途原因
http://push.bbtstxqm7.com:9101測試推播 HTTP測試環境專用,無 UrlType 對應
cn-guangzhou.log.aliyuncs.com阿里雲日誌基礎設施配置,純寫死
https://34.96.197.27:8802備用 IPgetIPList() 純寫死回傳

域名探測配置(st_domain_config.json)— 正式發布用

檔案路徑BBSport/Tools/STDomainListManager/st_domain_config.json

Release 模式下的域名探測完全依賴這份配置。

Release 候選域名(realese_domains

線上用戶域名探測的候選清單,首次安裝時是唯一的域名來源。

https://m-nu42sdu3xfca6.kzpw72mndq19.com
https://m-ayhc45u7p3.iabf52qmhg7.com
https://m-4ytsuxn33i1i0ca3.vafrazwu44.com
https://m-djwnsdfs09a6z3m2.vshwazor54.com
https://m-5xov436trc5b0j.wejaazhp47.com
https://m-uthb76i2c2.zljzazmm59.com

Debug 候選域名(debug_domains

定義在配置中但 code 裡未讀取 debugHosts,實際 DEBUG 模式用的是 AppDomain.shared.root

https://m.bbmobileproaz.com
http://m.bbtstxqm7.com
https://m.bbuat2021.com
http://m.bbgamedev.com
http://m.bbsama.com
http://www.bbdev.com
http://www.seeknewt.com

OSS 兜底地址(aliyun_oss_url

寫死且無法被伺服器更新

所有候選域名都掛時的最後防線,App 會去這些 OSS 地址拿一份新的域名清單再試。這 3 個地址全掛 = App 完全無法聯網,只能發版。

https://ui26ftj02lvf.qodmazcn53.com/bb99/bbpub.json
https://cu02ftj02lvf3.pukyazpv57.com/bb99/bbpub.json
https://ou34ftj02lvf2.qkdoazbi55.com/bb99/bbpub.json

探測 API 路徑

/api/forehead/system/domain/list/v2

主域名入口(domain.json

檔案路徑BBSport/Tools/Domain/M/domain.json

App 啟動 Step 1 讀取,設定 AppDomain.shared.root 的初始值。DEBUG 模式下直接用這個不探測。

域名環境
https://m.bbtyv16.com正式
https://m.bbuat2021.comUAT
http://m.bbtstxqm7.com測試

AppDomain 在 Release 也有人用

AppDomain.shared.root 不是只給 DEBUG 用。以下 Release code 也直接讀它:

  • CustomerChatManager.swift:210, 819 — 客服 URL 拼接
  • ExponentView.swift:27 — 體育指數

AppDomain.shared.serviceDomain 會被伺服器回應的 UrlType 15 動態更新。


客服域名(client_domain.json

檔案路徑BBSport/Tools/ClientDomain/client_domain.json

可被伺服器 UrlType 15(主線客服)和 16(次線客服)動態替換。

測試環境

用途域名
Domainhttps://domain.bbkefutest.com
APIhttp://api.bbkefutest.com
Socketwss://server.bbkefutest.com
Loggerhttps://logger.bbkefutest.com

UAT 環境

用途域名
Domainhttps://domain.uatbbkf.com
APIhttps://api.uatbbkf.com
Socketwss://chat.bbkefu88.com/ws
Loggerhttps://logger.bbkefu88.com

正式環境

用途域名
Domainhttps://47.243.66.137:8080(IP 直連)
APIhttps://api.bbkefu88.com
Socketwss://chat.bbkefu88.com/ws
Loggerhttps://logger.bbkefu88.com

JPush 極光推送(AppDelegate+JPPush.swift

檔案路徑BBSport/AppDelegate/AppDelegate+JPPush.swift

外部 SDK 管理,不走 UrlType 體系,無法被伺服器替換

用途
conn.bwqh56sxfz19.com推送連線 Host
54.46.41.147推送連線 IP
5000推送連線 Port
https://report.bwqh56sxfz19.com/v3/report推送回報 URL
https://report.bwqh56sxfz19.com/v1/userBadge 回報 URL

三方服務金鑰(寫死在 IFMainSwitch.m

注意:以下為寫死在 code 裡的金鑰

金鑰用途
Aliyun AccessKeyIDLTAI5t****U2a7阿里雲日誌服務
Aliyun AccessKeySecrethwNNU****5u6U阿里雲日誌服務
NetEase Verify Code IDdeca7****9591網易驗證碼
NetEase Product NumberYD001****5826網易驗證碼
Aliyun EMS AppKey3355****9260阿里雲郵件服務
Aliyun EMS AppSecret937dd****dcb0阿里雲郵件服務

完整值請查看 BBSport/Tools/RouterComponent/Classes/Main/IFMainSwitch.m