主頁 > 移動端開發 > 手機訊息推送方案綜述

手機訊息推送方案綜述

2021-10-25 07:16:12 移動端開發

一、前言

本文要分享的是訊息推送是指手機APP被關倍訓者處于后臺時,還能收到訊息的能力,這種訊息已經廣泛應用在以下場景,

  1. IM即時通信應用,比如微信切后臺了依然能收到訊息,
  2. 新聞資訊應用,
  3. 安防APP的報警應用,比如螢石APP切后臺后依然可以收到視頻報警訊息,
  4. 等等其他應用,

二、原生訊息推送

目前移動端絕大部分都是基于兩套系統,安卓和IOS,兩者都有系統級的推送方式,IOS對應的是APNS,安卓對應的是FCM(之前是GCM,18年已廢棄),以APNS推送為例,訊息的推送鏈路圖2-1所示:移動端與APNS保持長連接,即使APP切后臺了,推送服務端可以將訊息推送到APNS服務器,APNS服務器再將訊息推送到手機端,這樣手機端不管裝多少個app,有多少個app在后臺,都只有一條長連接,但是卻能收到各種訊息,低功耗的同時也保障了功能性,

https://static.oschina.net/uploads/img/201508/19175942_bHsb.jpg

圖2-1 APNS訊息推送程序

三、國內訊息推送現狀

3.1 面臨的挑戰

IOS和安卓在國外利用系統原生的推送機制就能滿足需求(除了華為,由于貿易戰,近兩年部分華為手機在國外也不能使用FCM了),但是到了國內,手機訊息推送就受到了許多挑戰,

首先是IOS,如圖3-1所示,APNS服務器全部在國外,所以國內的服務器向APSN推送訊息的延時、帶寬等就會受到很大的限制,而安卓這邊就更慘了,由于眾所周知的原因,FCM在國內直接無法使用,

圖 3-1

3.2 解決方案

3.2.1 IOS

由于IOS的封閉性,不管什么樣的方案,都無法繞過APNS,所以IOS的推送方法相對比較純粹,主要有以下幾種,

1.推送服務直接與APNS通信

應用的推送服務直接將訊息推送到APNS,開發者自行對接APNS的API,

缺點是推送服務器如果跟APNS服務器之間的網路不暢,可能會有性能問題,不過對小型應用來講是夠用的,

2.推送服務建立與APNS的中間站點實作高速推送

當推送訊息比較多且頻率比較高的時候,簡單的推送服務器可能就難以滿足需求了,此時就需要擴展推送服務器,或者將推送服務器部署到境外,建立一條訊息高速通道,

缺點是成本比較高,開發成本、維護成本以及服務器成本都比較高,適合應用已經有穩定的盈利能力且對訊息推送要求較高的場景,比如微信這種IM應用,

3.使用第三方SDK

方案1需要直接與APNS通信,開發者需要考慮各種實作細節以及處理略顯復雜的網路環境,處理不好性能可能會有問題,方法2的性能較好,但是成本略高,

集成第三方SDK的話一般會簡化開發成本,拆箱即用,而且第三方服務一般會自建與APNS的高速通道,會比自己開發的推送性能更高一些,而且第三方服務一般還會提供一些有用的資料統計功能,比如訊息到達率、打開率等,有利于運營自己的應用,這種方案適用于應用剛生產時能夠快速迭代應用,或者對訊息推送的需求比較弱,不想花費太多成本在這些功能,

但是這種方案也有缺點:開箱即用意味著靈活性不佳,可能有一些特殊的推送需求無法滿足,而且第三方服務一般免費的服務會進行限流、限制部分功能等,而且一旦出了問題由于涉及到許多方面,比較難排查,隨著應用用戶量的增長和功能的迭代,將會與第三方服務產生系結,推送量一旦達到收費的閾值,成本會逐步增高,

3.2.2安卓

安卓系統比較開放,而且廠商也比較多,所以安卓的推送方案相對來說還是比較多樣的,

1.自建通道

雖然國內FCM不可用,但是由于安卓開放性比較高,所以在市場初期的時候許多APP選擇自建通道的方式來實作通信(這也是安卓初期續航不佳的原因之一),即:APP守護一個后臺服務push service,該服務始終與推送服務保持長連接,當有訊息推送過來時由有臺服務處理訊息并展示,這種方法不經過第三方服務,相當于只是簡單的客戶端與服務端的通信,訊息不經過第三方,安全的同時也更加自由靈活,

但是這種方案的缺點也是明顯的,首先是移動端常常是在弱網環境下,后臺服務與推送服務之間的心跳保活面臨很大的挑戰,然后是這種實作方法非常的耗電,用戶體驗不加,另外隨著安卓的權限控制越來越嚴格,而且用戶對后臺行程也越來越敏感,目前這種方法已經算是名存實亡了,

2.集成廠商通道

由于FCM在國內不可用,目前比較大的手機廠商如華為、小米、oppo、vivo、魅族等都自建了自己的推送通道,比如用戶用的是小米手機,那么一般使用小米推送就可以將訊息推送給用戶,其流程如下圖所示:

但是由于手機品牌比較多,意味著推送不同的手機需要走不同的推送通道,這會讓推送服務的設計變得復雜,其互動流程如下圖所示:

移動端開啟應用后,需要查詢本機的資訊并上報給服務端,當服務端需要給用戶推送訊息時,要查詢用戶使用的機器資訊,然后匹配到對應的推送通道,再向該通道推送訊息,由于各個廠商的API、證書、協議格式等不一樣,甚至同一家廠商不同手機型號之間也會存在差異,所以維護這一套推送機制還是比較復雜的,

3.使用第三方SDK

安卓推送使用第三方SDK的話可以很好地屏蔽掉不同廠商的差異,開發者只需要將各種廠商的認證資訊上傳到三方服務器的個人賬戶里即可,三方服務就會做好各個廠商的集成,開發者只需要關注業務本身,將訊息推送給三方服務,由三方服務根據用戶的特性走不同的推送通道,可以大大地減少開發成本,

當然是用三方SDK也會存在一些缺點,已經在IOS推送的章節中做了討論,此處不再贅述,

4、基于傳統SMS通道完成推送

這種方法是在有離線訊息的時候發送一條短信給用戶,APP在后臺攔截并決議短信內容,這種方式隨著安卓權限控制越來越嚴格,實際上也是名存實亡,但是統一推送聯盟基于運營商通道進行離線訊息推送,跟這種方法有著異曲同工之妙,

5、

四、第三方SDK原理

目前做的比較好的手機推送三方SDK的廠商有極光推送、友盟推送、個推、騰訊信鴿等等許多家,各家的實作細節和功能存在小的差異,但整體上原理是大差不差的,

根據上一章節的分析,第三方SDK的原理不言而明:主要就是集成了各種推送通道,然后向用戶提供統一的推送介面,從而屏蔽不同廠商的差異性,第三方SDK不僅僅做到了這些,而且還可以進行統一的認證資訊管理、推送資料分析等增值服務,可以說是對開發者非常友好了,

除了集成各種推送通道外,三方SDK服務還會自建通道,自建通道的原理前文已有介紹,但是三方服務做自建通道相比應用開發者自己做的自建通道還是有一定優勢的,原因在于自建通道在多個應用之間可以貢獻,比如應用A、B、C都集成了某三方的自建通道,此時即使B和C都被強殺了,只要A的通道還處于活躍狀態,那么B和C的訊息依然可以通過該通道推送到手機上,這樣當同一個手機安裝了多個APP都集成了某一通道時,通道保活的概率就大大增強了,

五、訊息推送系統技術選型

前面分析了各種推送方案的原理和優缺點后,技術選型也就比較明朗了,

如果產品初期比較趕工急于實作各種功能,那么選擇一個靠譜的第三方SDK可以大大地減少作業量,如果產品一開始就立志高遠想成為微信這樣的巨無霸,不想隨著推送量增長而修改方案,那么就一步到位直接自己做集成,還有一種情況是推送量雖然不大,但是推送的訊息非常重要,對于安全性要求較高,此時也需要自行集成各種通道來避免資訊泄露,

總而言之,技術選項就是成本與收益的平衡,沒有那種方案能夠適合所有場景,選擇適合自己產品的方案最重要,

六、參考實作方案

當產品越做越大,甚至同一家公司會有多個產品,一個產品有多個版本,都需要用到手機推送業務,如果每個應用都重新設計、實作各種推送細節,就太浪費成本了,所以業界一般會開發一個統一的訊息推送中間件,專注于訊息推送,為各種業務提供服務,讓業務與訊息推送解耦,各自專注在自己的核心業務上,

常見的推送服務具有以下特點:

【1】多點接入,可以同時接入多加第三方推送服務,多家廠商推送服務,

【2】服務端提供統一的推送介面,客戶端提供統一的SDK,業務端只需要呼叫統一的介面即可實作推送功能,推送服務在內部根據發來的訊息做具體的推送邏輯,

【3】訊息持久化,方便追溯和查看,

【4】有失敗重傳機制,提高訊息達到率,

【5】提供資料分析功能,可以分析推送的到達率,打開率等資料,方便運營和優化,

【6】提供推送配置平臺,多種SDK,多種廠商,多種APP的認證資訊可以統一管理,

參考的架構如下圖所示:

移動推送平臺提供統一的服務,對于應用層屏蔽推送服務介面,且實作推送服務可動態輪替,推送平臺將接收到的訊息持久化到資料庫中,方便進行訊息推送失敗后的重發,以及后續資料的統計分析,
客戶端 SDK 對 App 提供統一的使用介面,屏蔽推送服務 SDK 使用細節,且實作多種推送 SDK 可替換,隱藏 SDK 復雜的接入程序,方便使用,
應用管理系統面向 App 開發人員,實作應用申請,推送服務配置,訊息查詢與管理,資料統計與分析,

七、展望未來

2018年,有政府背景的“統一推送聯盟”成立了,致力于統一目前國內混亂的安卓推送現狀,將各個廠商聯合起來制定統一的標準規范,統一推送聯盟由工信部牽頭成立,主辦方為工信部旗下的中國資訊通信研究院泰爾終端實驗室,也許在不久的將來,開發者不再為了各種不同的推送API而犯難了,

八、參考資料

【1】2021年了統一推送聯盟爛尾了嗎?

【2】使用Pushy進行APNs訊息推送

【3】58同城高性能移動端訊息推送技術架構演進之路

【4】喜馬拉雅億級用戶量的離線訊息推送系統架構設計實踐

【5】iOS的推送服務APNs詳解:設計思路、技術原理及缺陷等

【6】實踐分享:如何構建一套高可用的移動端訊息推送系統?

【7】統一推送聯盟:OPPO 完成“推必達”能力適配

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/335189.html

標籤:其他

上一篇:Android R input (四) 之 InputChannel之發送事件處理反饋

下一篇:Android初學三之仿微信APP實作對有recycleView的頁面進行點擊跳轉設計

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more