Skip to content

聊天室(開發文檔)

最後更新:2026-04-10

📖 功能說明請參考 聊天室


架構

相關檔案

Manager / ViewModel / API(4 個)
檔案說明
.../STChatView/STChatManager.swift聊天 Socket 核心
.../STChatView/VM/STChatViewModel.swift聊天 ViewModel
.../STChatView/STChatAPI.swift聊天 HTTP API
.../STChatView/M/STChatMessageModel.swift訊息 Model

基礎路徑:BBSport/Tab/广场/FullScreenLive/

View — 聊天(11 個)
檔案說明
.../STChatView/V/STChatView.swift聊天主視圖
.../STChatView/V/STChatHeaderView.swiftHeader
.../STChatView/V/STChatMarqueeView.swift跑馬燈
.../STChatView/V/STChatMoreMessageView.swift更多訊息
.../STChatView/V/STChatQuoteView.swift引用回覆
.../STChatView/V/STMarqueeLabel.swift跑馬燈 Label
.../ChatInputView/STChatInputView.swift聊天輸入框
.../ChatInputView/STEmojiView.swift表情選擇
.../Gift/STGiftListView.swift禮物列表
.../Gift/STGiftListViewController.swift禮物列表 VC
.../Gift/STGiftInputViewController.swift禮物輸入 VC

基礎路徑:BBSport/Tab/广场/FullScreenLive/

Cell — 訊息(9 個)
檔案說明
.../Cell/STTextChatMessageTableViewCell.swift文字訊息
.../Cell/STImageChatMessageTableViewCell.swift圖片訊息
.../Cell/STChatOrderShareTableViewCell.swift曬單訊息
.../Cell/STAutoMessageTableViewCell.swift自動訊息
.../Cell/STChatMessageBaseTableViewCell.swift訊息基底
.../Cell/STChatSystemMessageTableViewCell.swift系統訊息
.../Cell/STGiftMessageTableViewCell.swift禮物訊息
.../Cell/STReplyChatMessageTableViewCell.swift回覆訊息
.../Cell/STLiveBetGameMessageTableViewCell.swift競猜訊息

基礎路徑:BBSport/Tab/广场/FullScreenLive/STChatView/

禮物排行 / 競猜(6 個)
檔案說明
.../Gift/GiftRank/STGiftRankView.swift禮物排行
.../Gift/GiftRank/VM/GiftRankViewModel.swift排行 ViewModel
.../Gift/GiftRank/V/STGiftRankTopThreeView.swift前三名
.../LiveBetGame/LiveBetGameView.swift競猜遊戲
.../LiveBetGame/LiveBetGameViewModel.swift競猜 ViewModel
.../LiveBetGame/Cell/LiveBetGameCell.swift競猜 Cell

基礎路徑:BBSport/Tab/广场/FullScreenLive/

Socket 底層(2 個)
檔案說明
.../Socket/SocketServices.mSocket 連線(OC)
.../Socket/BBSocketServices.mSocket 管理單例(OC)

基礎路徑:BBSport/Tools/UtilityToolComponentOC/Classes/Helper/

API Request(30 個)
檔案說明
.../STAPI+GetChatTokenRequest.swift聊天 Token
.../STAPI+LiveGiftListRequest.swift禮物列表
.../STAPI+LiveEmojiListRequest.swift表情列表
.../STAPI+SendGiftRequest.swift送禮物
.../STAPI+GetTopRankGiftListRequest.swift禮物排行
.../STAPI+RedPacketRequest.swift紅包狀態
.../STAPI+RainRedPacketRequest.swift紅包雨狀態
.../STAPI+ReceiveRedPacketRequest.swift領取紅包
.../STAPI+ReceiveRainRedPacketRequest.swift領取紅包雨
.../STAPI+ChatReportListRequest.swift舉報類別
.../STAPI+SendChatReportRequest.swift送出舉報
.../STAPI+GetLiveActivityRequest.swift直播活動
.../STAPI+LiveActivityJoinRequest.swift加入活動
.../STAPI+GetVoteInfoRequest.swift投票資訊
.../STAPI+SubmitVoteInfoRequest.swift提交投票
.../STAPI+GetApprovalInfoRequest.swift支持率資訊
.../STAPI+GetPushOrderApprovalInfoRequest.swift推單支持率
.../STAPI+SubmitApprovalInfoRequest.swift提交支持率
.../STAPI+LuckyDrawStartInfoRequest.swift抽獎資訊
.../STAPI+ActivityWinResultRequest.swift抽獎結果
.../STAPI+ActivityWinUserListRequest.swift中獎名單
.../STAPI+TurnTableGameInfoRequest.swift轉盤資訊
.../STAPI+LargeOrderShareConfigRequest.swift大額曬單設定
.../STAPI+ReportOrderShareRequest.swift曬單上報
.../STAPI+FetchChatAutoMessageRequest.swift自動推訊息
.../STAPI+UploadSTWatchManRequest.swift上報觀看人
.../STAPI+UserEnterAnimationRequest.swift進入動畫
.../STAPI+HomeChatListRequest.swift首頁聊天紀錄
.../STAPI+GetLiveBetGameRequest.swift骰寶競猜
.../STAPI+GetMatchIDLiveStatusRequest.swift賽事直播狀態

基礎路徑:BBSport/API/STAPI/Chat/


API

聊天初始化


取得聊天 Token

GET api/forehead/user/chat/token/v2 — urlForm — STAPI.GetChatTokenRequest

參數型別必填說明
liveHostTypeInt主播類型

Response:

欄位型別說明
tokenString聊天室 Token
chatBanInfoSTChatBanInfoModel禁言資訊(見下方展開)
chatRuleSTChatRuleModel發言規則(VIP/充值/投注限制,見下方展開)
specialChIds[String]特殊頻道(不受限制)

STChatBanInfoModel(禁言資訊):

欄位型別說明
banTextString禁言提示文字
isBanBool是否被禁言
isPermissionBool是否有超管權限
ttlConfig[STChatTTLConfigModel]超管禁言配置(id/ttl/unit/value)

排查「為什麼不能發言」:先看 isBan 是否為 true,再看 chatRule 是否符合條件。

STChatRuleModel(發言規則):

欄位型別說明
isAvailableBool規則是否啟用
vipLimitValIntVIP 等級門檻
vipCurrentValInt使用者當前 VIP 等級
vipLimitIsAccordBoolVIP 是否符合要求
vipLimitTextStringVIP 限制說明文字
betLimitRuleSTChatBetLimitRuleModel投注限制(coin/cond/currentVal/limitIsAccord/limitText/limitVal)
rechargeLimitRuleSTChatRechargeLimitRuleModel充值限制(coin/rechargeCurrentVal/rechargeLimitIsAccord/rechargeLimitText/rechargeLimitVal)

betLimitRule.cond:0=未設置, 1=並且(投注+充值都要達標), 2=或是(任一達標即可)。


禮物


禮物列表

POST api/forehead/live/load/gift — urlForm — STAPI.LiveGiftListRequest

參數型別必填說明
matchTypeString"体育""娱乐"

Response:

STGiftModel 欄位(16 個)
欄位型別說明
idInt禮物 ID
nameString禮物名稱
photoIdString禮物圖片 ID
fullScreenPhotoIdString全螢幕動效圖片 ID
amountDoubleFloat禮物價格(API 欄位 amount
typeInt禮物類型(0=現金, 1=金幣)
goldAmountInt金幣額度
giftLevelInt禮物級別(0=平庸, 1=普通, 2=全螢幕炫酷)(API 欄位 level
giftDurationFloat顯示時間(API 欄位 showDuration
landscapeBool是否橫屏
giftNumberInt禮物數量
userIdString使用者 ID
userIconString使用者頭像
userNameString使用者名稱
isSelectBool是否被選中
isBeSelectedBool是否選中

表情列表

POST api/forehead/live/emoji/list — urlForm — STAPI.LiveEmojiListRequest

參數型別必填說明
matchTypeString"体育""娱乐"

Response:

欄位型別說明
emojiGroupList[STEmojiListModel]表情群組列表

STEmojiListModel:

欄位型別說明
emojiList[STEmojiModel]表情列表
imageIdString群組圖片 ID

STEmojiModel(表情):

欄位型別說明
idInt表情 ID
imageIdString表情圖片 ID
nameString彈幕字串(用於顯示名稱)
imgString表情圖片 URL
typeSTEmojiType0=Normal(內建), 1=Custom(自定義)
groupIdInt所屬表情組 ID
sortInt排序
statusInt狀態

發送禮物

POST api/forehead/live/submit/gift/present — urlForm — STAPI.SendGiftRequest

參數型別必填說明
liveRoomIdString直播間 ID
giftIdString禮物 ID
giftCountString禮物數量

Response: 成功 code=1/429。code=300000 金幣不足。


禮物排行榜

POST api/forehead/live/room/gift/top5 — urlForm — STAPI.GetTopRankGiftListRequest

參數型別必填說明
liveRoomIdInt直播間 ID

Response:

欄位型別說明
cashGiftTop5[STGiftRankTableCellModel]現金禮物前 5
goldGiftTop5[STGiftRankTableCellModel]金幣禮物前 5

STGiftRankTableCellModel:

欄位型別說明
indexInt排名序號
nickNameString暱稱
userNameString使用者名稱
headUrlString頭像 URL
amountDouble贈送金額
userTitleIdInt使用者稱號 ID
userTitleString使用者稱號
userTitleImageString稱號圖片
vipLeveIntVIP 等級
customAvatarBool是否自訂頭像

紅包


紅包狀態

POST api/forehead/live/get/room/redEnvelope — urlForm — STAPI.RedPacketRequest

參數型別必填說明
LiveRoomIdInt(字串傳送)直播間 ID

Response: STRedPacketInfoModel?


紅包雨狀態

POST api/forehead/live/get/room/redEnvelope/template — urlForm — STAPI.RainRedPacketRequest

參數型別必填說明
liveRoomIdInt(字串傳送)直播間 ID
sendRecordIdInt(字串傳送)紅包記錄 ID(>0 時才帶入)

Response: STRedPacketInfoModel?


領取紅包

POST api/forehead/live/submit/receive/redEnvelope — urlForm — STAPI.ReceiveRedPacketRequest

參數型別必填說明
LiveRoomIdInt(字串傳送)直播間 ID
sendRecordIdString紅包記錄 ID

Response: Double?(領取金額)


領取紅包雨

POST api/forehead/live/submit/receive/redEnvelope/template — urlForm — STAPI.ReceiveRainRedPacketRequest

參數型別必填說明
liveRoomIdInt(字串傳送)直播間 ID
sendRecordIdInt(字串傳送)紅包記錄 ID
catchTimesInt(字串傳送)抓取次數

Response:

欄位型別說明
indexInt下標
amountInt價值
awardIdInt獎品 ID
awardTypeInt獎品類型
countInt獎品數量
awardNameString獎品名稱
imgUrlString圖片 URL

舉報


舉報類別列表

POST api/forehead/live/chat/report/cate — urlForm — STAPI.ChatReportListRequest

無參數。Response: [String]


送出舉報

POST api/forehead/live/chat/report/add — urlForm — STAPI.SendChatReportRequest

參數型別必填說明
account / uid / nickString舉報者資訊
targetAccount / targetUid / targetNick / targetTypeString/Int被舉報者資訊
cateString舉報類別
msgBody / msgTimeString/Int被舉報訊息
matchId / homeTeam / guestTeam / gameString賽事資訊

Response: 無 data。


活動


活動列表

POST api/forehead/live/activity/selectapi/forehead/live/match/activity/select — urlForm — STAPI.GetLiveActivityRequest

參數型別必填說明
liveRoomIdInt直播間 ID(!=0 時用 match 路徑)

Response:

STChatEventModel 欄位(16 個)
欄位型別說明
idDecimal記錄 ID
activityIdDecimal活動 ID
activityTypeString活動類型
matchIdDecimal賽事 ID
nameString活動名稱
introduceString活動介紹
pictureString活動圖片地址
entrancePicString入口圖片
h5UrlStringH5 頁面 URL
typeString1=文字, 2=圖片
clickEffectInt點擊效果(0=無, 1=連結, 2=Popup 大圖, 3=跳 App 頁面)
isJoinString是否可參與(顯示參與按鈕)
joinString參與活動與否
firstJumpWordString第一次報名問候語
secondJumpWordString第二次報名問候語
liveAppConfigStringApp 頁面參數

加入活動

POST api/forehead/live/activity/join/record/add — urlForm — STAPI.LiveActivityJoinRequest

參數型別必填說明
roomId / activityId / chatRoomIdString房間/活動/聊天室 ID

Response: 無 data。


投票 / 支持率


投票資訊

POST api/forehead/live/lottery/vote/info — urlForm — STAPI.GetVoteInfoRequest

參數型別必填說明
roomIdInt房間 ID

Response: id, status, voteTitle, userVoteResult, optionBody([VoteOption]), displayType, isChange


提交投票

POST api/forehead/live/lottery/vote/submitInfo — urlForm — STAPI.SubmitVoteInfoRequest

參數型別必填說明
voteResultString投票結果
recordId / roomIdInt(字串傳送)記錄/房間 ID

Response: 無 data。


支持率資訊

POST api/forehead/live/lottery/approval/info — urlForm — STAPI.GetApprovalInfoRequest

參數型別必填說明
roomIdInt(字串傳送)!=0 時帶入
matchIdString非空且不為 "0" 時帶入

Response: sum, homeSum, awaySum, tieSum, home, away, userApprovalResult


提交支持率

POST api/forehead/live/lottery/approval/submitInfo — urlForm — STAPI.SubmitApprovalInfoRequest

參數型別必填說明
approvalResultString投票結果
roomId / matchId / messageId / orderId有值時才帶入

Response: 無 data。


抽獎 / 轉盤


抽獎資訊

POST api/forehead/live/lottery/startInfo — urlForm — STAPI.LuckyDrawStartInfoRequest

參數型別必填說明
matchIdString賽事 ID
hostIdInt主播 ID

Response: STLuckDrawModel?


抽獎結果

POST api/forehead/live/lottery/win — urlForm — STAPI.ActivityWinResultRequest

參數型別必填說明
lotteryId / userId / lotteryTypeInt抽獎/使用者/類型

Response: lotteryId, userId, isWin, awardInfo(STActivityAwardModel)


主播轉盤資訊

POST api/forehead/live/lottery/big/spin/info — urlForm — STAPI.TurnTableGameInfoRequest

參數型別必填說明
matchIdString賽事 ID
hostIdInt主播 ID

Response: lotteryId, alreadyPrize, bigSpinCountdownTime, achieveRequire, prizePool(JSON) 等


其他


自動推訊息

POST api/forehead/live/match/message/select — urlForm — STAPI.FetchChatAutoMessageRequest

參數型別必填說明
matchId / platformId / hostIdString賽事/平台/主播 ID
messageTypeString"1"=有主播, "2"=無主播

Response:

欄位型別說明
idInt訊息 ID
messageString訊息內容
nicknameString發送者暱稱
sendTimeString發送時間
createTimeInt建立時間
isFromSocketBool是否來自 Socket 推送

曬單上報

POST api/forehead/live/showorder/report — urlForm — STAPI.ReportOrderShareRequest

參數型別必填說明
masterTeam / guestTeamString主/客隊
betAmount / orderId / matchIdString金額/單號/賽事
chIdString聊天室 ID
hostId / liveUserGroupIdInt主播/特權
sportBusinessString數據源

Response: Bool?


上報觀看人

POST api/forehead/live/submit/watch — urlForm — STAPI.UploadSTWatchManRequest

參數型別必填說明
liveRoomIdInt(字串傳送)直播間 ID
matchIdString有值時帶入

骰寶競猜

POST api/forehead/live-bet-game/rounds/current — JSON — STAPI.GetLiveBetGameRequest

參數型別必填說明
liveRoomIdInt直播間 ID

Response: odds([Odds]), round(Round?), settings([Setting]), roundBetAmountLimit(Decimal?)


WebSocket

連線架構

連線建立流程

  1. connectToSocket() → 檢查 eventId != "0" 且未連線
  2. fetchChatData() → 取公告、禮物、表情、紅包等
  3. fetchChatToken() → 取聊天 Token
  4. openSocket(withUrlStr:) → 建立 WebSocket
  5. 連線成功 → 發送 L01 訂閱歷史 → enterAnimation() → 啟動心跳

斷線重連

層級機制間隔
SocketServices(底層)非手動斷線自動重連5 秒
STChatManager(上層)關閉後重新走完整流程10 秒
Token 取得內建重試最多 3 次

關鍵數字

  • 心跳間隔:30 秒{"cmd": "ping"}
  • 底層重連:5 秒
  • 上層重連:10 秒
  • Token 重試:最多 3 次
  • Token 過期:伺服器推送 E04,客戶端重新取 Token
完整指令列表(18 個)
Command方向說明
L01發送訂閱歷史訊息
L03接收歷史訊息
M01雙向即時訊息
R03接收被禁言
R04接收充值/VIP 不足
R05接收發送太快
R06接收曬單上限
R09接收訪客發言上限
G01接收禮物
G02接收活動(紅包/投票)
G04 / G05接收主播推單/撤單
G06接收抽獎
G07接收中獎結果
P02接收使用者進入(歡迎動畫)
P001接收自動推訊息
P003接收骰寶競猜
E04接收Token 過期
ping發送心跳

L01 訂閱歷史(發送)

json
{
  "cmd": "L01",
  "data": {
    "chId": "fb12345|67",
    "isFirst": "1",
    "guestTeamId": "fb12345|67guest",
    "homeTeamId": "fb12345|67home",
    "nick": "暱稱",
    "uid": "123456",
    "vip": 3,
    "token": "chat-token",
    "version": "1.0.0",
    "platform": 1
  }
}
  • chId 格式:{gameType.chatIdPrefix}{eventId}|{hostId}(有主播時)

gameType.chatIdPrefix 對照表:

GameTypechatIdPrefix範例 chId
bbAmuse(娛樂)ylyl12345|67
fbSport(FB 體育)fbfb12345|67
dbSport(DB 體育)obob12345|67
upSport(UP 體育)stst12345|67
sicBo(骰寶)stst12345|67
其他""
  • isFirst:首次 "1",重連 "0"
  • platform:1=iOS, 2=Android, 3=Web

M01 即時訊息(發送)

json
{
  "cmd": "M01",
  "data": {
    "uid": "123456",
    "account": "user_account",
    "nick": "暱稱",
    "chId": "fb12345|67",
    "token": "chat-token",
    "vip": 3,
    "msg": "你好",
    "msgType": 1
  }
}

訊息類型

說明
0x01文字
0x02圖片/自訂表情
0x03富文本
0x04回覆
0x05曬單
0x07自動推送

實作重點

  • 聊天室切換changeChannel() 清空訊息 → 更新 ID → 若已連線直接發 L01(免斷線重連)
  • STChatManager 初始化參數eventId, hostId, liveRoomId, chatRoomType(.sport/.entertainment), gameType, liveHostType
  • 禮物級別:0=平庸, 1=普通, 2=全螢幕炫酷
  • 禮物類型:0=現金, 1=金幣