Skip to content

Socket與推送(開發文檔)

最後更新:2026-04-10

📖 功能說明請參考 Socket與推送


架構

相關檔案

WebSocket 核心(6 個)
檔案說明
.../Socket/IFSocketManager.m訊息分流處理
.../Socket/IFSocketManager.h訊息分流 Header
.../Socket/BBSocketServices.m連線管理
.../Socket/BBSocketServices.h連線管理 Header
.../Socket/SocketServices.mSRWebSocket 底層
.../Socket/SocketServices.hSRWebSocket 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.swiftSTNotify 定義
站內信 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

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

Response:STChatInfoModel

欄位型別說明
chatBanInfoSTChatBanInfoModel禁言相關資訊(isBanisPermissionbanTextttlConfig
chatRuleSTChatRuleModel聊天室規則(isAvailable、VIP 限制、充值限制、投注限制)
specialChIds[String]特殊頻道 ID 列表
tokenStringWebSocket 連線用 chatToken

WebSocket 連線

WebSocket 連線 URL 格式

連線 URL 由 IFCommonUtil.getSocketUrl 組裝:

  1. 優先:從域名探測結果取得推送 URL(IFMainSwitch.getPushUrl,對應域名列表中 type=UrlTypePushUrl 的項目)
  2. 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 為字串型別,dataNSDictionary
  • 部分 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 + 震動
432CTC 充值訂單付款提醒STPushToast + 震動
433CTC 充值訂單付款超時STPushToast + 震動
434CTC 提現訂單付款提醒STPushToast + 震動
435CTC 充值訂單收款超時STPushToast + 震動
436CTC 提現訂單收款提醒STPushToast + 震動
437CTC 提現訂單收款超時STPushToast + 震動
438訂單確認STPushToast + 震動
439彩蛋活動開啟Toast + 彩蛋浮動板 + 震動
440彩蛋活動關閉STPushToast + 震動
441賽事直播開播浮動卡片 + SLS 日誌,登出不取消
442主播直播開播浮動卡片 + SLS 日誌,登出不取消
443C2C 提現訂單超時待撮合STPushToast + 震動
444C2C 提現訂單等待付款STPushToast + 震動
445C2C 提現訂單付款方取消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說明
goal424進球通知
streamerLive442主播開播通知
largeOrderShare452大額訂單分享通知

推播點擊路由

type跳轉目標
1活動 H5 頁
2賽事詳情
3直播間
4福利中心
8娛樂主播
9福利客服
10關注通知

關鍵數字

  • 浮動推送同時最多:3 個
  • 每個浮動顯示:5 秒
  • 推送事件有效期:10 秒
  • 斷線重連等待:5 秒

實作重點

  • chId 分流IFSocketManager.mchId 字串比對分流,不同 chId 走不同處理邏輯
  • 充提類統一處理:chId 401~414 + 431~445 走同一條路(Toast + 震動),僅 408 紅利和 439 彩蛋有額外邏輯
  • STNotify 命名慣例:camelCase,與功能模組對應(如 userLoginUP → UP 體育登入)
  • 阿里雲日誌:chId 424/441/442/452 上傳 SLS 日誌,進球推送每道攔截判斷都記錄原因
  • 重連機制:連線異常 → 等待 5 秒 → 重新連線 → 成功後重新訂閱