Appearance
Socket與推送(開發文檔)
最後更新:2026-04-10
📖 功能說明請參考 Socket與推送
架構
相關檔案
WebSocket 核心(6 個)
| 檔案 | 說明 |
|---|---|
.../Socket/IFSocketManager.m | 訊息分流處理 |
.../Socket/IFSocketManager.h | 訊息分流 Header |
.../Socket/BBSocketServices.m | 連線管理 |
.../Socket/BBSocketServices.h | 連線管理 Header |
.../Socket/SocketServices.m | SRWebSocket 底層 |
.../Socket/SocketServices.h | SRWebSocket Header |
基礎路徑:
BBSport/Tools/UtilityToolComponentOC/Classes/Helper/
PushEventManager(7 個)
| 檔案 | 說明 |
|---|---|
.../PushEventManager.swift | 推送事件管理器 |
.../GoalPushEvent/GoalPushEventModel.swift | 進球推送 Model |
.../GoalPushEvent/GoalPushEventView.swift | 進球推送 View |
.../StreamerLivePushEvent/StreamerLivePushEventModel.swift | 主播開播 Model |
.../StreamerLivePushEvent/StreamerLivePushEventView.swift | 主播開播 View |
.../LargeOrderSharePushEvent/LargeOrderSharePushEventModel.swift | 大額曬單 Model |
.../LargeOrderSharePushEvent/LargeOrderSharePushEventView.swift | 大額曬單 View |
基礎路徑:
BBSport/Tools/PushEventManager/
推送 / 通知 / 日誌(3 個)
| 檔案 | 說明 |
|---|---|
BBSport/AppDelegate/AppDelegate+JPPush.swift | 極光推送初始化 |
BBSport/Tools/Push/JPPService.h | 極光推送 Header |
BBSport/Tools/NotificationManager/STNotifyExtension.swift | STNotify 定義 |
站內信 API(7 個)
| 檔案 | 說明 |
|---|---|
.../STAPI+DeleteInboxMessageRequest.swift | 刪除站內信 |
.../STAPI+InboxNoticeRequest.swift | 站內信列表 |
.../STAPI+ReadInboxMessageRequest.swift | 已讀站內信 |
.../STAPI+ReadNoticeMessageRequest.swift | 已讀通知訊息 |
.../STAPI+UserNoticeInfoDetailRequest.swift | 通知詳情 |
.../STAPI+UserNoticeRequest.swift | 通知列表 |
.../STAPI+UserNoticeUnreadCountRequest.swift | 未讀通知數量 |
基礎路徑:
BBSport/API/STAPI/Notice/
日誌(1 個)
| 檔案 | 說明 |
|---|---|
BBSport/STUIKit/STFoundation/Utils/LogService/LogServiceManager.swift | 阿里雲 SLS 日誌上傳 |
API
WebSocket 通訊不經過 STAPI,由 BBSocketServices 直接維護連線。
chatToken API 完整規格
GET api/forehead/user/chat/token/v2 — urlForm — STAPI.GetChatTokenRequest
| 參數 | 型別 | 必填 | 說明 |
|---|---|---|---|
| liveHostType | Int | ✅ | 直播主類型 |
Response:(STChatInfoModel)
| 欄位 | 型別 | 說明 |
|---|---|---|
| chatBanInfo | STChatBanInfoModel | 禁言相關資訊(isBan、isPermission、banText、ttlConfig) |
| chatRule | STChatRuleModel | 聊天室規則(isAvailable、VIP 限制、充值限制、投注限制) |
| specialChIds | [String] | 特殊頻道 ID 列表 |
| token | String | WebSocket 連線用 chatToken |
WebSocket 連線
WebSocket 連線 URL 格式
連線 URL 由 IFCommonUtil.getSocketUrl 組裝:
- 優先:從域名探測結果取得推送 URL(
IFMainSwitch.getPushUrl,對應域名列表中type=UrlTypePushUrl的項目) - Fallback:取主域名 host,移除
m./www.前綴,拼接為wss://push.{host}:9102
wss://push.example.com:9102連線由
BBSocketServices管理,底層使用SRWebSocket。以域名為 key 管理多個SocketServices實例。
L01 訂閱訊息 JSON 格式
登入成功後,IFSocketManager 發送訂閱訊息:
json
{
"cmd": "subscribe",
"userId": "123456",
"channel": [102, 104, 204, 2301, 401, 402, 403, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 424, 425, 426, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 450, 451, 452, 453, 455, 460, 462, 514]
}登出時發送取消訂閱:
json
{
"cmd": "unsubscribe",
"userId": "123456",
"channel": [401, 402, 403, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 424, 425, 426, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 443, 444, 445, 450, 451, 452, 453, 455, 460, 514]
}WebSocket 訊息格式
json
{
"chId": "401",
"data": {
"title": "充值成功",
"content": "您的充值已到帳..."
}
}chId為字串型別,data為NSDictionary- 部分 chId(如 452 大額曬單)的
data為 JSON 字串需二次解析
chId 452 大額曬單二次解析
原始 Socket 訊息(data 為 JSON 字串而非物件):
json
{
"chId": 452,
"data": "{\"data\":{\"betAmount\":\"500.00\",\"chId\":\"st1010311\",\"guestTeam\":\"阿尔巴塞特\",\"hostId\":-1,\"liveRoomId\":-1,\"liveUserGroupId\":0,\"masterTeam\":\"格拉纳达\",\"matchId\":\"1010311\",\"orderId\":\"1252503071754289400\",\"showOrderType\":1,\"sportBusiness\":\"st\",\"userName\":\"no******1\",\"userVipLevel\":1}}"
}二次解析後(LargeOrderSharePushEventModel):
json
{
"betAmount": "500.00",
"chId": "st1010311",
"guestTeam": "阿尔巴塞特",
"hostId": -1,
"liveRoomId": -1,
"liveUserGroupId": 0,
"masterTeam": "格拉纳达",
"matchId": "1010311",
"orderId": "1252503071754289400",
"showOrderType": 1,
"sportBusiness": "st",
"userName": "no******1",
"userVipLevel": 1
}
showOrderType:1 = 普通曬單、2 = 串關曬單。liveUserGroupId > 0表示特權/樂享主播。
完整訂閱 chId 清單(44 個)
| chId | 說明 | 處理方式 |
|---|---|---|
| 102 | 足球即時比分 | 存入 socketDict,登出不取消 |
| 104 | 足球技術統計 | 存入 socketDict,登出不取消 |
| 204 | 籃球陣容 | 存入 socketDict,登出不取消 |
| 2301 | 電競列表 | 存入 socketDict,登出不取消 |
| 401 | 充值成功 | STPushToast + 震動 + 清除充值取消計數 |
| 402 | 提款成功 | STPushToast + 震動 |
| 403 | 用戶遊戲餘額變更 | 存入 socketDict + 通知 |
| 405 | 上分成功 | STPushToast + 震動 |
| 406 | 轉帳失敗 | STPushToast + 震動 |
| 407 | 充值失敗 | STPushToast + 震動 |
| 408 | 紅利 | letterType=1:禮物彈窗;其他:Toast + 震動 |
| 409 | 返水 | STPushToast + 震動 |
| 410 | 提現退回成功 | STPushToast + 震動 |
| 411 | 加幣 | STPushToast + 震動 |
| 412 | 減幣 | STPushToast + 震動 |
| 413 | 提現失敗 | STPushToast + 震動 |
| 414 | 提現退回失敗 | STPushToast + 震動 |
| 424 | 進球/開賽推送 | 浮動卡片 + SLS 日誌 |
| 425 | 平台維護狀態 | 更新 GameMaintenanceManager |
| 426 | 紅包通知 | 紅包浮動條 |
| 430 | 邀請好友 | 紅包浮動條 |
| 431 | 主播中獎 | STPushToast + 震動 |
| 432 | CTC 充值訂單付款提醒 | STPushToast + 震動 |
| 433 | CTC 充值訂單付款超時 | STPushToast + 震動 |
| 434 | CTC 提現訂單付款提醒 | STPushToast + 震動 |
| 435 | CTC 充值訂單收款超時 | STPushToast + 震動 |
| 436 | CTC 提現訂單收款提醒 | STPushToast + 震動 |
| 437 | CTC 提現訂單收款超時 | STPushToast + 震動 |
| 438 | 訂單確認 | STPushToast + 震動 |
| 439 | 彩蛋活動開啟 | Toast + 彩蛋浮動板 + 震動 |
| 440 | 彩蛋活動關閉 | STPushToast + 震動 |
| 441 | 賽事直播開播 | 浮動卡片 + SLS 日誌,登出不取消 |
| 442 | 主播直播開播 | 浮動卡片 + SLS 日誌,登出不取消 |
| 443 | C2C 提現訂單超時待撮合 | STPushToast + 震動 |
| 444 | C2C 提現訂單等待付款 | STPushToast + 震動 |
| 445 | C2C 提現訂單付款方取消 | STPushToast + 震動 |
| 450 | 直播狀態變更 | 重新取得主播列表 |
| 451 | 投票中獎通知 | 通知事件 |
| 452 | 大額曬單 | 浮動卡片 + SLS 日誌 |
| 453 | 轉盤中獎通知 | 轉盤頁顯示 |
| 455 | 關注後可跟單通知 | Toast(含關注用戶資訊) |
| 460 | 專屬客服新訊息 | 檢查紅包 + Toast |
| 462 | 體驗金推送 | 彈窗,登出不取消 |
| 514 | 新手轉盤充值/完成加碼 | 通知事件(過濾非本人) |
登出訂閱管理
登出時取消 37 個 chId。不取消的 7 個:102/104/204/2301(賽事數據)、441/442(直播)、462(體驗金)。chId 477(體育賽事陣容開關)不在訂閱清單中,由其他來源觸發。
PushEventType 枚舉
| 類型 | rawValue | 說明 |
|---|---|---|
goal | 424 | 進球通知 |
streamerLive | 442 | 主播開播通知 |
largeOrderShare | 452 | 大額訂單分享通知 |
推播點擊路由
| type | 跳轉目標 |
|---|---|
| 1 | 活動 H5 頁 |
| 2 | 賽事詳情 |
| 3 | 直播間 |
| 4 | 福利中心 |
| 8 | 娛樂主播 |
| 9 | 福利客服 |
| 10 | 關注通知 |
關鍵數字
- 浮動推送同時最多:3 個
- 每個浮動顯示:5 秒
- 推送事件有效期:10 秒
- 斷線重連等待:5 秒
實作重點
- chId 分流:
IFSocketManager.m依chId字串比對分流,不同 chId 走不同處理邏輯 - 充提類統一處理:chId 401~414 + 431~445 走同一條路(Toast + 震動),僅 408 紅利和 439 彩蛋有額外邏輯
- STNotify 命名慣例:camelCase,與功能模組對應(如
userLoginUP→ UP 體育登入) - 阿里雲日誌:chId 424/441/442/452 上傳 SLS 日誌,進球推送每道攔截判斷都記錄原因
- 重連機制:連線異常 → 等待 5 秒 → 重新連線 → 成功後重新訂閱