APP消息推送方案调研

2024-09-02 15:03:18 浏览数 (1)

介绍

消息类型

推送服务支持通知栏消息和透传消息

通知栏消息

通知栏消息由系统通道直接下发,消息将在终端的通知中心下拉列表呈现,不需要应用进程驻留后台,用户点击通知栏消息后会触发相应的动作,如打开应用、打开网页等。

  • 消息样式:大文本样式、Inbox样式、消息按钮样式。
  • 通知提醒方式:通知栏消息固定会在通知栏显示,用户可感知的提醒方式还有状态栏图标、锁屏消息、熄屏图标、铃声、震动、呼吸灯等。
  • 常用场景:订阅内容、行程提醒、帐号动态等。

通过对消息样式和提醒方式的自定义可以帮助您的消息吸引用户,从而提高应用的日活跃用户数量。过对消息样式和提醒方式的自定义可以帮助您的消息吸引用户,从而提高应用的日活跃用户数量。

透传消息

透传消息是由客户端应用负责处理的消息,您可以自定义推送样式,从而助您更高效灵活地推送消息。终端设备收到透传消息后不直接展示,而是将数据传递给应用,由您的应用自主解析内容,并触发相关动作(跳转网页、deeplink等等)。

透传消息的到达率受Android系统和应用是否驻留在后台影响,推送服务不保证透传消息的高到达率。

透传消息的常用场景:好友邀请、VoIP呼叫、语音播报等。

由于通知栏消息的低功耗和高到达率特点,推送服务更推荐您使用通知栏消息。

  • 低功耗
  • 推送服务采用了统一消息中心(Notification Center,以下简称NC)的能力,华为终端设备收到通知栏消息时由NC统一展示消息,当用户点击通知栏消息时才会拉起目标应用进程,NC的能力减少了启动应用进程的频率从而降低终端设备的功耗。
  • 高到达率
  • 透传消息的送达依赖应用的常驻,而通知栏消息在华为手机上通过推送服务应用统一展示,即使应用没有启动,通知消息也能送

消息推送原理

APNs

Apns:Apple Push Notification service (APNs)

https://developer.apple.com/documentation/usernotifications/sending-notification-requests-to-apns

GCM

GCM全称是:Google Cloud Messaging for Android,是Google为android手机开发的类似于iOS的APNS后台消息推送机制。

使用GCM推送服务的whatsapp即使后台程序和服务都关闭掉,也依然可以在第一时间接收到新消息的推送(实测在国内whatsapp也的确可以在后台关闭的情况下正常通过GCM接受实时消息)。

推送流程

服务器如何先找到设备、再找到app?

每一个设备都有一个自己的设备号,而设备中的app又都有一个唯一的包名。所以服务器只需要找到设备号与包名就可以定位到某个设备的某个应用,而这设备号与包名会一起构成一个标识符,叫做device_token,因此问题就简化为把device_token与消息内容等信息交给服务器,服务器把内容发到唯一的device_token上。

iOS

iOS 系统的推送(APNS,即 Apple Push Notification Service)依托一个或几个系统常驻进程运作,是全局的(接管所有应用的消息推送),所以可看作是独立于应用之外,而且是设备和苹果服务器之间的通讯,而非应用的提供商服务器。

首先,作为设备标识的device-token是由APNs颁发的,App开发者或者第三方推送平台(图中的Provider)做的工作是收集这个device-token,APNs的推送是要求基于APNs颁发的device-token来推送的。只有正确的device-token会被APNs接受,如果是一个错误的、或者无效的device-token(比如App已经卸载了),APNs就不会接受。

接着,开发者使用第三方推送平台(图中的Provider)在将推送内容与范围选定之后进行推送,第三方推送平台将信息提交给APNs,剩下的操作全部都由APNs来进行完成,整个过程第三方推送平台就不能控制了。

例如,腾讯 QQ 的服务器(Provider)会给苹果公司对应的服务器(APNs)发出通知,然后再中转传送到你的设备(Devices)之上。当你接收到通知,打开应用,才开始从腾讯服务器接收数据,跟你之前看到通知里内容一样,但却是经由两个不同的通道而来。

优劣势

所以, iOS 的推送,可以不严谨的理解为:

1)苹果服务器朝手机后台挂的一个 IM 服务程序发送的消息;

2)系统根据该 IM 消息识别告诉哪个 Apps 具体发生了什么事;

3)系统分别通知这些 Apps ;

他们带给用户的好处是实实在在的:

1)安全:只有登录过的开发者可以通过苹果的服务器推送;

2)快速、稳定、可靠:苹果掌控推送服务器和 OS ;

3)更省电;

4)让整个系统的体验更统一和简单:不会出现杀后台这种脑残事。(不用大量 Apps / Apps 的服务为了推送挂后台)。也不会出现 Apps 被杀就收不到推送这种脑残事(早一点的新浪微博 Android 版仍然如此);

5)开发容易:当然,开发者还是要做些事情,比如维护个服务器什么的。但是复杂度无疑降低很多了。

Android

Android更像是传统桌面电脑系统做法。每个需要后台推送的应用有各自的单独后台进程,才能和各自的服务器通讯,交换数据。另外其实 Android 也有类似 APNS 的 GCM(Google Cloud Message),属于开发者可选,非强制。

Android平台在不使用GCM的情况下就需要将自己的服务器或是第三方推送服务提供商的服务器与设备建立一条长连接,通过长连接进行推送。

开发者通过第三方推送服务提供商将信息直接下发给需要的设备,第三方推送服务提供商与设备建立一条长连接通道,并且将消息路由到APP中(图中的设备1与设备2),对于像设备3这种无网络连接或是没有成功建立长连接通道的设备,会在设备3连网且推送消息没有过期的情况下自动收到由第三方推送服务提供商推送过来的消息,保证消息不会丢失。

但是不建议自己设置服务器实现推送功能。 一是因为成本太高(开发成本、维护成本),自己搭建的服务器无论是稳定性还是速度上都比不了第三方推送服务提供商的效果; 另一个是因为自己的数据量较小,使用第三方推送服务提供商可以用他们的维度进行推送,实现精准推送。

优劣势

Apps 挂后台一直是 Android 引以为豪的特性,挂后台等待推送就成为技术选择;

但是,没人真正为用户的电池负责。Apps 的开发者不会站在系统层面考虑的。他会假设其他 Apps 没有那么“不自觉”;

优点在于 ,因为整个技术方案非强制, Android 的 Apps 在接收到推送后的表现更为灵活。像 Line 的 Android 版本可以在推送通知的 Popup 上直接回复, iOS 就需要越狱才能做到了。

Android消息推送原理

操作系统有自身的消息推送功能(系统级别)

  • 系统级别:任何时候都可以推送给用户,且不会被系统杀死
  • Android的消息推送服务称为:C2DM(Cloud to Device Messaging)

三种基本的推送方式:Push、Pull 和 SMS

  • 本质: App将服务器更新的信息推送给用户,即App获取服务器信息,再推送给用户
  • App从服务器获取最新消息的基本方式(原理)有3种:Push、Pull 和 SMS
轮询(Pull)方式

应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。

要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。

持久连接(Push)方式

这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。IOS平台的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过刚才也讲了,这个方案存在着很多的不足之处,就是我们很难在手机上实现一个可靠的服务,目前也无法与IOS平台的推送功能相比。

SMS(Push)方式

在Android平台上,可以通过拦截SMS消息并且解析消息内容来了解服务器的意图,并获取其显示内容进行处理。

优势: 可以实现完全的实时操作。 劣势:成本相对比较高,需要向移动公司缴纳相应的费用。我们目前很难找到免费的短消息发送网关来实现这种方案。

七种主流的Android消息推送方式

  • 通知标题:推送消息的标题,请尽量避免“test、测试、纯数字” 等无意义内容,否则可能会被厂商拦截而无法接收到通知消息。
  • 通知内容:推送消息的内容,请尽量避免“test、测试、纯数字” 等无意义内容,否则可能会被厂商拦截而无法接收到通知消息。

海外消息推送介绍文章:https://www.engagelab.com/zh_CN/blog/best-push-notification-service

APP消息推送(Push),竟然还有这么多你不知道的:https://www.jianshu.com/p/194819dfc76e

方案

商业

Firebase Message

Firebase Cloud Messaging (FCM) 是一种跨平台消息传递解决方案,可供您可靠地传递消息,且无需任何费用。

https://firebase.google.com/docs/cloud-messaging

对于 Android 设备,FCM 使用单一的、优化的连接到 Google Play 服务,而不是为每个应用程序建立单独的连接,从而显著降低电池消耗。

设置用户属性:https://firebase.google.com/docs/analytics/user-properties?hl=zh-cn&platform=flutter

Message API

https://firebase.google.com/docs/cloud-messaging/send-message?hl=zh-cn#send-messages-to-multiple-devices

在Firebase Admin SDK中发送消息时使用的registrationTokens是设备端生成的Firebase Cloud Messaging(FCM)令牌。这些令牌是设备与FCM服务交互的唯一标识符。以下是获取这些令牌的步骤:

  1. 集成Firebase SDK
    1. 首先,确保你的应用已经集成了Firebase SDK。对于Android和iOS设备,这通常意味着添加Firebase到你的项目中,并设置google-services.json(Android)或GoogleService-Info.plist(iOS)文件。
  2. 获取Firebase实例ID
    1. 在应用中,使用Firebase实例ID服务来获取一个唯一的标识符。这个服务会处理令牌的生成和刷新。
  3. 监听Token变化
    1. 监听Firebase实例ID的变化,当应用启动或Token变化时获取新的Token。

AWS SNS

每月移动推送通知免费100万条。

https://aws.amazon.com/cn/sns/pricing/?did=ap_card&trk=ap_card

百度云推送

免费,国内,功能简单,可以通过API方式调用平台功能。

官网:https://push.baidu.com/

API文档:https://push.baidu.com/doc/restapi/restapi

个推

适合国内,可以用API给用户打标签,有一定的免费额度。

https://www.getui.com/notification-push

Flutter SDK

  • 官方(据说)https://pub.dev/packages/getuiflut
  • https://pub.dev/packages/flutter_getui

Flutter实践文档:https://juejin.cn/post/7227855255109910589

极光推送

官网:https://www.jiguang.cn/push

API文档:https://docs.jiguang.cn/jpush/server/push/server_overview

海外平台(收费):https://www.engagelab.com/

Flutter SDK:https://github.com/jpush/jpush-flutter-plugin

友盟

基于友盟 全域数据建立精准的消息推送平台,为开发者提供更灵活、更智能、更有效的消息推送方案,有效提升用户粘性,提高App活跃度。

https://www.umeng.com/push

自定义用户标签是T 1生效。目前看到自定义标签的创建入口。

Flutter SDK: https://pub.dev/packages/umeng_push_sdk

OneSignal

海外的消息推送平台,移动端推送的消息数量不限。

官网:https://onesignal.com/

API文档:https://documentation.onesignal.com/docs/messages

开源

MPush

mpush,是一款开源的实时消息推送系统,采用java语言开发,服务端采用模块化设计,具有协议简洁,传输安全,接口流畅,实时高效,扩展性强,可配置化,部署方便,监控完善等特点。

https://mpusher.github.io/

参考

  • App消息推送的原理:https://cloud.tencent.com/developer/article/2094125

0 人点赞