離線推送
使用者的 App 不在前臺時,新訊息、好友和群的通知、音影片來電會經 Apple、Google 和各手機廠商的推送通道送到裝置的通知欄,使用者點選通知後回到 App。App 在前臺、保持著長連線時,訊息由長連線實時送達,不再推送。
接入離線推送分三步:
- 上傳推送憑據:在控制檯為應用上傳各通道的憑據(如 APNs 的
.p8金鑰、FCM 的服務賬號),每份憑據有一個名稱,見推送配置; - 客戶端登記推送令牌:使用者登入後,App 向系統或廠商申請推送令牌,連同憑據的名稱登記到本服務,見客戶端登記推送令牌;
- 按需定製:服務端傳送訊息時用
push欄位指定通知的標題和內容、關閉推送或強制推送;用推送裝置與設定的介面為使用者設定免打擾,或排查使用者的推送裝置。
推送盡力而為
離線推送只是提醒:裝置關機、通道擁堵、使用者關閉了通知許可權時都可能收不到,訊息本身不受影響,使用者開啟 App 後由訊息同步補齊。沒有上傳憑據的應用不會發出離線推送。
推送通道
| 通道 | channel | 裝置平臺 | 需要在控制檯配置的憑據 |
|---|---|---|---|
| Apple 推送(APNs) | apns | ios、macos | .p8 金鑰(推薦,不會過期,同一個金鑰也用於 VoIP 推送),或 .p12 證書;分生產和開發環境 |
| Google FCM | fcm | android | Firebase 專案的服務賬號 JSON |
| 華為 | huawei | android、harmony | App ID、App Secret |
| 鴻蒙 | harmony | harmony | 專案 ID、服務賬號金鑰 JSON |
| 榮耀 | honor | android | App ID、Client ID、Client Secret |
| 小米 | xiaomi | android | App Secret |
| OPPO | oppo | android | App Key、Master Secret |
| vivo | vivo | android | App ID、App Key、App Secret |
| 魅族 | meizu | android | App ID、App Secret |
各通道還可以填寫訊息分類、通知渠道等引數。每項材料在哪裡獲取、怎樣測試,見推送配置。
- 一個客戶端 App 一份憑據:每個應用最多 20 份憑據,同一個通道可以有多份。一個 IM 應用對應多個客戶端 App(如主 App 和極速版、不同的包名)時,或者 iOS 的生產版和開發版,各上傳一份,App 登記令牌時用憑據的名稱指明是哪一份。
- Web、Windows、Linux 和小程式沒有離線推送,只依賴長連線。
- 國內廠商的訊息分類:國內廠商要求按內容申請訊息分類(如即時通訊),沒有申請或分類不對的推送會被限量甚至拒收。請在廠商後臺申請後,把分類、通知渠道填寫在憑據中。
各通道的能力不同:
| 通道 | 撤回後更新通知 | App 角標 | 來電 |
|---|---|---|---|
apns | 支援 | 支援 | 登記了 VoIP 令牌的裝置發 VoIP 推送,App 向 CallKit 報告來電,顯示系統的來電介面;沒有的發高優先順序通知 |
fcm | 支援 | 支援(桌面是否顯示由啟動器決定) | 發高優先順序的資料訊息,由 App 自行顯示來電介面和通知 |
huawei、xiaomi | 支援 | 不帶角標 | 高優先順序通知,點選後進入 App |
honor、harmony、oppo、vivo、meizu | 不支援 | 不帶角標 | 高優先順序通知,點選後進入 App |
哪些裝置會收到推送
- 登記了推送令牌的裝置:使用者登入後,App 在這臺裝置上登記推送令牌。沒有登記的裝置(包括 Web 等平臺)收不到離線推送。
- 此刻不在前臺的裝置:沒有長連線的,或者長連線還在、但 App 已經切到後臺的(由客戶端上報)。App 在前臺的裝置由長連線收到訊息,不推送,統計為
skipped_online。一個使用者的幾臺裝置分別判斷:電腦在前臺時,後臺的手機照常收到推送。 - macOS:桌面端保持長連線時一直算在前臺,不推送,由 App 收到訊息後自行顯示本地通知;電腦休眠、App 退出、連線斷開後才推送。
- 令牌跟隨登入:退出登入、被踢下線或被擠下線、修改密碼、封禁、刪除使用者、控制檯要求全部使用者重新登入後,這次登入登記的令牌隨即解綁,這臺裝置不再收到這個使用者的推送。使用者再次登入後由 App 重新登記。
- 一臺裝置可以有多個令牌:最多 3 個普通令牌,按登記的順序優先,如 Android 手機把本機廠商的通道放在第一個、FCM 作為備用。傳送時使用第一個可用的:憑據被停用、刪除或暫停,或者令牌失效時,改用下一個,同一條推送不會在一臺裝置上彈出兩次。iOS 裝置另外可以登記 1 個 VoIP 令牌,只用於來電。
- 一個令牌只屬於一次登入:同一臺手機上換了一個賬號登入並登記同一個令牌,前一個賬號在這臺手機上的登記隨即作廢,即使它沒有正常退出,也不會再收到它的推送。
- 失效的令牌:通道報告令牌無效(App 被解除安裝、令牌過期等)時,令牌約 1 分鐘後刪除。App 每次啟動時重新登記,令牌沒變時不受影響。
推送的內容
訊息
| 訊息 | 推給 |
|---|---|
| 單聊訊息 | 接收者。傳送者本人的其他裝置不推送 |
| 群訊息 | 除傳送者以外的群成員。訊息發出之後才入群的成員、已經被移出的成員不推送 |
以下訊息不推送,即使設定了 push.force 也不推送:
- 群提示(成員變化、群資料變化等系統訊息);
exclude_from_unread為true的訊息;push.disabled為true的訊息;- 只推線上的訊息。
聊天室訊息沒有離線推送。訊息發出 30 分鐘之後才處理到的(如服務端積壓)不再推送;已經交給通道的推送在通道中保留 24 小時,裝置關機或沒有網路期間的推送在恢復聯網後送達。
合併:同一個會話在 1 秒內的多條訊息合併為一條通知。第一條訊息立即推送,之後 1 秒內到達的合在一起推送一次,顯示其中最新的一條,正文前加上條數,如群訊息的正文“[5條] 張三: 收到”;其中有 @ 本人的訊息時,顯示最新的一條 @ 本人的訊息。群裡刷屏時,每個離線的成員每秒大約只收到一條通知。
好友和群的通知
應用的執行策略 push_notice_enabled 關閉時(預設開啟),以下通知都不推送;平臺在平臺控制檯關閉了廠商離線推送(全域性開關)時,本節的通知和來電的離線推送都停止。
| 通知 | 推給 | 內建的標題 | 內建的正文 |
|---|---|---|---|
| 收到好友申請 | 被申請的人 | 申請人 | 請求新增你為好友(不含申請附言) |
| 好友申請被同意 | 發出申請的人 | 同意的人 | 已同意你的好友申請 |
| 被對方直接新增為好友(本人的加好友方式為“允許任何人”) | 被新增的人 | 新增的人 | 已新增你為好友 |
| 有人申請入群 | 群主和管理員 | 群名稱 | 李四 申請加入群聊 |
| 成員邀請他人入群,等待審批 | 群主和管理員 | 群名稱 | 李四 邀請 王五 加入群聊,等待審批 |
| 收到入群邀請 | 被邀請的人 | 群名稱 | 李四 邀請你加入群聊 |
| 被移出群(包括移出並拉黑) | 被移出的人 | 群名稱 | 你已被移出群聊 |
| 群解散 | 解散時的群成員,群主自己解散時不含群主 | 群名稱 | 群聊已解散 |
你的服務端或控制檯新增的好友、本人同意的申請、本人退群和被刪除的賬號,都不推送:當事人自己知道,或不需要知道。
來電
音視訊通話的來電推給被叫(群通話為被邀請的成員),通話被取消或沒有接聽時,用“對方已取消通話”或“[未接來電]”替換裝置上的來電通知。不支援按通知 ID 覆蓋的通道(見推送通道中“撤回後更新通知”一列)不能替換,會另外顯示一條。
- 來電通知的有效期是剩餘的振鈴時間,過期沒有送達的由通道丟棄,不會在通話結束後才響鈴;
- 使用者在一臺裝置上接聽或拒絕後,他其他裝置上的來電通知隨之清除。鴻蒙、OPPO、vivo、魅族通道不支援清除,由 App 下次開啟時清除;
- 來電不受會話免打擾影響,遵守全域性免打擾和夜間免打擾,不計入應用的推送額度;
- 通話結束後寫入會話的通話記錄訊息不再推送。
通知的標題和內容
通知的標題和正文由模板生成。模板按“模板鍵 + 語言”區分,內建簡體中文(zh-CN)、繁體中文(zh-TW)和英文(en),可以在控制檯中覆蓋任意模板鍵在任意語言下的內容,見通知模板。訊息的內建模板(簡體中文):
| 情況 | 標題 | 正文 |
|---|---|---|
| 單聊訊息 | 傳送者 | 訊息摘要 |
| 單聊,合併了多條 | 傳送者 | [5條] 訊息摘要 |
| 群訊息 | 群名稱 | 傳送者: 訊息摘要 |
| 群訊息,合併了多條 | 群名稱 | [5條] 傳送者: 訊息摘要 |
| 群訊息 @ 了本人(包括 @ 全體成員) | 群名稱 | [有人@我] 傳送者: 訊息摘要 |
| 以系統身份傳送的群訊息 | 群名稱 | 訊息摘要 |
- 傳送者:傳送者的暱稱,沒有暱稱時為使用者名稱;不使用接收者設定的好友備註和群暱稱。已刪除的使用者顯示為“已刪除的使用者”,以系統身份傳送的顯示為“系統”。
- 群名稱:沒有名稱的群顯示為“群聊”。
- 訊息摘要:文字訊息取前 100 個字元,換行替換為空格;圖片、語音、影片分別為“[圖片]”“[語音]”“[影片]”;檔案為“[檔案] 檔名”;位置為“[位置] 位置名稱”;自定義訊息和其他型別為“[訊息]”。
- 長度:標題最長 64 個字元,正文最長 256 個字元,超出的截斷並在末尾加“…”;部分通道的上限更小,由通道再截斷。控制字元一律去掉。
- 語言:按裝置登記的語言依次查詢,找到即用:完全相同的語言;同一種語言的預設寫法(
zh-TW、zh-HK、zh-MO和繁體中文取zh-TW,其他中文取zh-CN,其他語言取主語言,如en-GB取en);應用執行策略的push_default_language(預設zh-CN);內建的zh-CN。每一步都先找控制檯中覆蓋的模板,再找內建模板。例如覆蓋了日語(ja)的單聊模板後,日語裝置的單聊訊息使用日語,其他推送仍使用預設語言。
預覽方式
使用者可以選擇通知中顯示的內容,沒有選擇時使用應用執行策略的 push_default_preview(預設 full):
| 預覽方式 | 顯示 | 單聊訊息的標題 | 單聊訊息的正文 |
|---|---|---|---|
full | 傳送者和內容 | 張三 | 晚上一起吃飯嗎? |
sender_only | 只顯示傳送者 | 張三 | 發來一條新訊息 |
none | 都不顯示 | 空,由系統顯示 App 名稱 | 你收到了一條新訊息 |
- 預覽方式優先於服務端在
push中給出的標題和正文:使用者選擇了sender_only或none,服務端給出的內容同樣不顯示。 - 好友和群的通知、來電不含訊息內容,
sender_only與full相同;none時分別顯示“你收到了一條新通知”“你有一個新的來電”“你有一個未接來電”。 - 推送的內容會經過 Apple、Google 和手機廠商的伺服器。對隱私要求高的應用(如醫療、金融),建議把
push_default_preview設為none。
傳送訊息時的 push 欄位
服務端傳送訊息時可以在請求體中帶 push 物件,控制這條訊息的離線推送:
| 欄位 | 型別 | 說明 |
|---|---|---|
disabled | Boolean | 為 true 時這條訊息不推送,預設 false |
force | Boolean | 為 true 時不受接收者的免打擾限制(會話免打擾、全域性免打擾和夜間免打擾),預設 false。不能與 disabled 同時為 true |
title | String | 通知的標題,1 到 64 個字元,原樣顯示,不套用模板,也不替換其中的佔位符 |
body | String | 通知的正文,1 到 256 個字元,規則同 title |
ext | Object | 隨通知交給 App 的自定義資料,如點選通知後要開啟的頁面,JSON 編碼後最多 512 位元組 |
push中只能有以上欄位,字串中不能有控制字元;整個push按 JSON 編碼不超過 2 KB。不符合時返回400 invalid_argument,details.reason為invalid_push,details.field指出欄位。- 只給出
title或body其中一個時,另一個仍按模板生成。接收者的預覽方式不是full時,title和body不生效,見預覽方式。 force只讓訊息不受免打擾限制,不會讓不提醒的訊息變成提醒:同時設定了exclude_from_unread的訊息仍然不推送。賬戶安全、訂單異常這類必須送達的通知,請不要設定exclude_from_unread。title、body和ext原樣交給通道和 App,不經過內容安全的檢查,請自行確保內容合規。- 使用者在客戶端傳送訊息時,
push中只能設定disabled,以免使用者在對方的鎖屏上偽造系統通知。
以系統身份向群裡傳送一條必須送達的維護通知:
curl -X POST "$IM_API/$ORG/$APP/messages" \
-H "Authorization: Bearer $APP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to_group": "100311272729346048",
"client_msg_id": "notice-20261005-01",
"type": "text",
"body": { "text": "今晚 23:00 至 24:00 系统维护,期间无法下单" },
"push": {
"force": true,
"title": "系统维护通知",
"body": "今晚 23:00 至 24:00 系统维护",
"ext": { "page": "notice", "notice_id": "N1001" }
}
}'push 不符合要求時:
{
"error": {
"code": "invalid_argument",
"message": "push 不符合推送模块的规则",
"details": { "field": "force", "reason": "invalid_push" },
"request_id": "TNDNXP7E23UBI3SARLL7P52XGP"
}
}免打擾
| 免打擾 | 說明 |
|---|---|
| 會話免打擾 | 對一個單聊或一個群設定:none 不推送這個會話的訊息;mention_only 只用於群,只在有人 @ 本人時推送。應用執行策略的 push_mention_all_breaks_mute 開啟時(預設開啟),@ 全體成員也算 @ 本人。可以設定時長,到期自動恢復,也可以一直有效 |
| 全域性免打擾 | 一段時間內(如“8 小時內不打擾”)或一直不推送任何訊息和通知 |
| 夜間免打擾 | 每天的一個時段(如 22:00 到次日 07:30)不推送,可以跨過午夜,開始時刻算在時段內、結束時刻不算。按設定時提交的時區計算,時區不隨裝置變化:使用者出差換了時區,需要重新設定 |
各類推送與免打擾:
| 推送 | 會話免打擾 none | 會話免打擾 mention_only | 全域性免打擾 | 夜間免打擾 |
|---|---|---|---|---|
| 單聊訊息 | 不推 | — | 不推 | 不推 |
| 群訊息,沒有 @ 本人 | 不推 | 不推 | 不推 | 不推 |
| 群訊息,@ 了本人 | 不推 | 推 | 不推 | 不推 |
設定了 push.force 的訊息 | 推 | 推 | 推 | 推 |
| 好友的通知 | — | — | 不推 | 不推 |
| 入群申請和邀請 | 對這個群不推 | 推 | 不推 | 不推 |
| 被移出群、群解散 | 推 | 推 | 不推 | 不推 |
| 來電 | 推 | 推 | 不推 | 不推 |
| 撤回後更新通知 | 照常更新 | 照常更新 | 照常更新 | 照常更新 |
- 免打擾隻影響離線推送,不影響訊息的接收和未讀數。會話列表中是否顯示免打擾圖示、免打擾的會話是否計入角標,由 App 按同步到的設定決定。
- 使用者在客戶端設定自己的免打擾,你的服務端可以用推送裝置與設定的介面替使用者設定,如與自己 App 中的“訊息提醒”開關同步。設定在使用者的全部裝置間同步。
- 使用者退出或被移出群后,他對這個群的會話免打擾隨之刪除,重新入群時從正常推送開始。每個使用者最多 10000 個會話免打擾。
App 角標
App 圖示上的角標數按裝置計算,同一個使用者的 iPhone 和 iPad 各有自己的角標:
- App 切到後臺時,由 App 上報當前應該顯示的角標數(通常是未讀總數,是否計入免打擾的會話由 App 決定),之後每推送一條訊息或一個好友和群的通知,這臺裝置的角標加一併隨通知下發,合併推送時加上合併的條數;
- 來電、撤回後的更新和測試推送不帶角標,被免打擾擋住、裝置在前臺、超出推送額度而沒有推送的不計入;推送發出後沒有送達的不會回退;
- App 回到前臺後自行更新圖示上的角標,下次切到後臺時重新上報。使用者在其他裝置上讀了訊息,這臺裝置的角標要等 App 下次開啟時才更新;
- 應用執行策略的
push_badge_enabled關閉時(預設開啟),推送中不帶角標,由 App 自行處理;不支援角標的通道(見推送通道)不帶角標。
撤回後更新通知
訊息被撤回(包括被群主、管理員、你的服務端或平臺撤回)後,裝置上這條訊息的通知被替換,原來的內容不再留在鎖屏和通知欄上:傳送者本人撤回的,替換為“張三 撤回了一條訊息”;被其他人撤回的,或者接收者的預覽方式為 none 的,替換為“一條訊息已被撤回”。
- 只更新推送後 24 小時內撤回的訊息,並且只經當時發出推送的那個令牌更新;通道需要支援按通知 ID 覆蓋(APNs、FCM、華為、小米),其他通道上的原通知保留;
- 替換的通知不改變角標,儘量不響鈴:APNs 不帶聲音;Android 由通知渠道決定,憑據中配置了靜默渠道的使用靜默渠道,沒有配置的可能再響一次。使用者已經劃掉了原通知的,替換的通知會重新出現在通知欄中;
- 撤回時推送還沒有發出的,不再發出;
- 撤回後的更新不受免打擾、應用停用和推送額度的限制:違規內容被撤回後,鎖屏上的內容也要隨之消失。例外是平臺關閉了廠商離線推送(全域性開關)時不再傳送:停用期間不發任何廠商推送。
客戶端登記推送令牌
推送令牌只能由 App 登記,你的服務端不能代使用者登記。以下是客戶端介面,使用者以 User Token 呼叫,操作的是當前登入的裝置,SDK 釋出後由 SDK 封裝:
| 方法 | 路徑 | 說明 |
|---|---|---|
| PUT | /client/v1/push/device | 登記本裝置的推送,整體替換:tokens 為普通令牌,最多 3 個,按順序優先,每項為 credential(憑據名稱)和 token;voip_token 為 VoIP 令牌,只用於 iOS,可選;language 為通知使用的語言(BCP 47,最長 16 個字元),可選;badge 為當前的角標數(0 到 99999),可選。返回推送裝置物件,另帶 changed |
| GET | /client/v1/push/device | 查詢本裝置的登記,沒有登記過返回 404 not_found |
| DELETE | /client/v1/push/device | 登出本裝置的推送,用於使用者在 App 內關閉通知;沒有登記過同樣返回 204 |
| PUT | /client/v1/push/device/badge | 上報角標,請求體為 {"badge": 3};保持長連線時隨長連線的狀態上報即可 |
| GET、PATCH | /client/v1/push/settings | 本人的推送設定,格式同推送設定物件 |
| GET | /client/v1/push/conversations | 本人的會話免打擾,引數同查詢會話免打擾 |
| PUT、DELETE | /client/v1/push/conversations/single/{username}、/client/v1/push/conversations/group/{group_id} | 設定、取消會話免打擾 |
登記的請求示例:
curl -X PUT "$IM_API/client/v1/push/device" \
-H "Authorization: Bearer $USER_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tokens": [
{ "credential": "xiaomi-main", "token": "Lx9Qw2Er5Ty8Ui1Op4As7Df0Gh3Jk6Zx9Cv2Bn5Mq8We1Rt4Yu7Kd3P" },
{ "credential": "fcm-global", "token": "cR5tY8:APA91bF2gH4jK6lZ8xC0vB2nM4qW6eR8tY0uI2oP4aS6dF8gH0jK2lZ4xC6vB8nM0q" }
],
"language": "zh-CN",
"badge": 0
}'App 登記時注意:
- 何時登記:登入成功後、每次冷啟動時、廠商的令牌重新整理時,提交完整的登記。令牌和語言沒有變化時
changed為false,可以放心重複呼叫。退出登入時呼叫退出介面即可,不需要另外登出推送,同時請清除 App 已經顯示的通知,以免下一個登入的使用者看到。 - 通道與平臺:裝置的平臺取登入時提交的
platform。apns只用於ios、macos;huawei用於android、harmony;harmony只用於harmony;其他通道只用於android。VoIP 令牌只能登記在 iOS 裝置上、能發 VoIP 推送的 APNs 憑據下。 - 令牌的格式:1 到 512 個可見 ASCII 字元;APNs 的令牌為 64 到 200 位十六進位制。
- 系統通知許可權:使用者在系統設定中關閉了 App 的通知時,APNs 和 FCM 仍然接受推送(統計為
sent),只是裝置不顯示。請在每次冷啟動和回到前臺時檢查通知許可權,關閉時登出本裝置的推送,重新開啟後再登記。 - 前後臺狀態:App 切到後臺時,隨長連線上報後臺狀態和角標數;上報送達之前,服務端仍把這臺裝置當作在前臺,不推送。
- Android 通知渠道:Android 8 以上,App 啟動時建立憑據中配置的通知渠道(訊息的渠道,以及低重要級別的靜默渠道),渠道 ID 與憑據中的一致。
- 頻率限制:每臺裝置每分鐘登記和登出合計 10 次、上報角標 60 次;每個使用者每分鐘讀取、修改推送設定和會話免打擾各 60 次。
登記失敗時返回 400 invalid_argument,details.reason 說明原因:
details.reason | 原因 |
|---|---|
unknown_credential | 憑據名稱不存在或已刪除,details.credential 為名稱 |
platform_mismatch | 憑據的通道不適用於這臺裝置的平臺;或 VoIP 令牌不在 iOS 裝置上、憑據不是 APNs 或不能發 VoIP 推送 |
platform_not_supported | 登入時的平臺是 Web、Windows、Linux 或小程式,不能登記推送 |
duplicate_credential | 兩個普通令牌屬於同一份憑據,或同一個令牌出現了兩次 |
invalid_token | 令牌的格式不對,或普通令牌超過 3 個 |
no_token | 沒有任何令牌。登出請用 DELETE |
invalid_language | 語言不是 BCP 47 的寫法 |
invalid_badge | 角標不是 0 到 99999 的整數 |
unknown_credential 和 platform_mismatch 是 App 的配置錯誤,重試也不會成功;登入已經失效時返回 401 session_revoked,按下線原因處理。
點選通知:每條推送都帶一個交給 App 的 JSON 物件,放在通道的自定義資料中,鍵為 im。訊息的通知中有會話型別 conversation_type、會話 ID conversation_id、訊息序號 seq、訊息 ID message_id、傳送者的使用者名稱 sender(預覽方式為 none 時不帶),以及服務端在 push.ext 中給出的內容 ext,App 據此開啟會話、定位訊息或跳轉到自己的頁面。
執行策略
以下執行策略控制應用的離線推送,見執行策略:
| 欄位 | 說明 | 預設值 | 取值範圍 |
|---|---|---|---|
push_default_preview | 使用者沒有選擇時通知的預覽方式 | full | full、sender_only、none |
push_default_language | 裝置沒有登記語言、或登記的語言沒有對應的模板時,通知使用的語言 | zh-CN | BCP 47 語言標籤,最多 16 個字元 |
push_badge_enabled | 推送中是否帶 App 角標 | true | true、false |
push_notice_enabled | 是否推送好友和群的通知 | true | true、false |
push_mention_all_breaks_mute | 群設為只在 @ 本人時推送(mention_only)時,@ 全體成員是否也推送 | true | true、false |
這幾專案前不在控制檯的策略頁面中顯示,取預設值,需要修改時請聯絡我們。此外還有廠商離線推送的全域性開關:平臺管理員在平臺控制檯的「推送」頁可以一次性停用或恢復全部應用的廠商推送,關閉後訊息的統計為 skipped_disabled,控制檯的測試推送返回錯誤;重新開啟後照常推送,停用期間沒有推送的不再補發。
此外,應用每分鐘的推送次數受平臺設定的配額 push_per_min_limit 限制,預設每分鐘 60000 次,按裝置計:訊息和好友、群的通知計入,來電、撤回後的更新和測試推送不計入。超出的裝置這次不推送,統計為 rate_limited。全域性開關與它的區別:額度按應用處置濫用,只停訊息和通知;全域性開關面向整個部署,停掉包括來電和測試在內的全部廠商推送。
應用狀態的影響
| 狀態 | 離線推送 |
|---|---|
| 應用停用、被暫停服務,租戶暫停或處於登出冷靜期 | 不推送訊息、通知和來電,撤回後的更新照常傳送;令牌、設定和憑據保留,恢復後照常推送,期間沒有推送的不再補發 |
| 平臺關閉了廠商離線推送(全域性開關) | 不推送訊息、通知和來電,撤回後的更新也不傳送(與平臺停用單個應用不同);客戶端 API 照常,測試推送返回錯誤,重新開啟後恢復推送,期間沒有推送的不再補發 |
| 只讀(平臺設定或租戶欠費) | 照常推送,客戶端可以照常登記令牌、修改免打擾 |
| 應用刪除、租戶登出 | 不再推送,資料隨之刪除 |
推送統計與排查
控制檯的“推送統計”按日期、通道、類別和結果統計推送的次數,保留 180 天,見推送統計。服務端不儲存每一條推送的記錄,也不提供廠商的送達和點選回執;排查某個使用者收不到推送時,請按排查收不到推送的步驟檢視他的裝置和設定,併發一條測試推送。
推送的類別:message(訊息)、notice(好友和群的通知)、call(來電、未接來電和取消)、dismiss(清除來電通知)、recall(撤回後的更新)、test(測試推送)。
推送的結果:
| 結果 | 含義 | 計數單位 |
|---|---|---|
sent | 通道已接受。只表示通道收下了這條推送,不表示裝置已經顯示 | 裝置 |
failed | 通道拒絕了這條推送(如內容超長、這臺裝置當天的條數已滿),或網路錯誤重試後仍失敗,或憑據出錯且裝置沒有其他可用的令牌 | 裝置 |
invalid_token | 通道報告令牌無效,令牌已刪除,且裝置沒有其他可用的令牌 | 裝置 |
credential_unavailable | 裝置的令牌所屬的憑據都已停用或刪除 | 裝置 |
channel_paused | 憑據因通道限額、每日額度已滿、連續鑑權失敗等原因暫停中,裝置沒有其他可用的令牌 | 裝置 |
rate_limited | 超出應用的推送額度 push_per_min_limit | 裝置 |
queue_full | 服務端的傳送佇列已滿,推送被丟棄 | 裝置或事件 |
expired | 超過了時效:訊息發出 30 分鐘後才處理到,或在傳送佇列中等待超時 | 事件或裝置 |
unsupported | 裝置使用的通道不支援這種推送,如撤回後更新通知 | 裝置 |
recalled | 推送發出之前訊息已被撤回 | 使用者或裝置 |
skipped_online | 裝置在前臺線上,不需要推送 | 裝置 |
skipped_dnd | 被免打擾擋住 | 使用者 |
skipped_disabled | 平臺關閉了廠商離線推送(全域性開關),全部廠商推送停發 | 事件或裝置 |
no_device | 接收者沒有登記推送的裝置 | 使用者 |
統計中的通道為最後使用的令牌所屬的通道;沒有選出令牌的(如 skipped_online、skipped_dnd、no_device、credential_unavailable),通道為空字串。
上限
| 專案 | 上限 |
|---|---|
| 每個應用的推送憑據 | 20 份 |
| 每臺裝置的推送令牌 | 普通令牌 3 個、VoIP 令牌 1 個 |
| 每個使用者的會話免打擾 | 10000 個 |
| 會話免打擾、全域性免打擾的時長 | 1 秒到 10 年,或一直有效 |
| 通知的標題、正文 | 64 個字元、256 個字元 |
push.ext | 512 位元組 |
整個 push | 2 KB |
| 每個應用的模板覆蓋 | 300 條 |
| 應用每分鐘的推送次數 | 預設 60000 次,按裝置計,平臺配額 push_per_min_limit |
| 訊息的推送時效 | 訊息發出後 30 分鐘 |
| 推送在通道中的有效期 | 24 小時,來電為剩餘的振鈴時間 |
| 推送統計 | 保留 180 天,一次最多查詢 92 天 |
