安卓音视频通讯应用能否实现如同微信的来电通知体验

安卓音视频通讯应用能否实现如同微信的来电通知体验

安卓版本微信的来电通知体验

正常情况下是如下图所示的样子,即使是在手机锁屏时也可以弹出来电提示界面。

安卓版本微信视频来电通知

那么其他应用是否也可以实现同样的体验呢?

需要哪些条件

当应用在前台时,应用是启动状态,只要网络连接没有问题,那么一定可以接收到从服务器端发送的任何通知消息,这时应用可以随意展示任何通知界面。因此本文主要讨论的是应用在退出到后台后,用户被其他用户呼叫的情况。由于安卓系统对于后台进程管理越来越严格,国内手机厂商出于为手机节电等考虑主流国产品牌手机对后台进程的管理更加严格,在应用退到后台时,通常很快就会结束运行。在这种情况下,如果用户被呼叫,服务器端是无法直接发送任何消息给用户应用的。

应用在非启动状态,被呼叫时,首先要解决的是如何接收到通知消息的问题。这种情况下,典型的解决方案是使用推送通知,先将推送消息发送给用户的手机,然后再利用推送消息的处理机制唤醒应用。

原生的安卓系统使用的是 Google FCM 服务来接收推送消息,由于国内的网络情况,通常在国内无法访问 Google FCM,因此无法使用 FCM 实现推送功能。国内主流手机厂商,多数也因此裁剪掉了系统中的 Google FCM 功能。这也导致很多第三方推送服务的出现,目前使用比较广泛的有极光、个推、信鸽、阿里云等。但是尴尬的是,使用第三方推送时,APP 需要集成第三方推送 SDK,推送服务本身也是应用服务而非系统服务,同样存在应用被停止后无法启动,从而无法接收到消息的问题。虽然第三方推送厂商设计了如共享消息通道、多应用互相拉起等机制,但是手机厂商也为了节电,更加严格地限制应用或服务的启动。由此形成了第三方推送厂商越是积极的设法启动应用,手机厂商越是积极的限制应用启动的恶性循环。

使用手机厂商的推送通道

为了更好的解决这个问题,目前主流国产手机厂商,比如小米、华为、Oppo & Vivo 等都各自提供了自己的推送通道服务,手机系统中提供的自有消息服务是系统服务,所以不需要应用程序在启动状态,也可以接收到推送消息。这样就可以解决应用没有启动时,就无法接收到推送消息的问题。

手机厂商提供的推送通道,通常都能发送多种消息类型。比如小米推送提供通知消息和透传消息。其中通知消息不需要应用启动,推送服务接收到通知消息时,只需要将通知内容展示到屏幕。透传消息,则不需要显示任何内容,推送服务接收到透传消息时,将消息交给相应的应用来处理。所以,要实现微信来电通知的功能,需要使用手机厂商的推送通道服务,并且使用透传消息,这样在应用处理这个消息时,展示来电通知界面。

集成多家手机厂商推送 SDK

为了达到理想的接收推送效果,应用需要集成每一个主流手机厂商(华为、小米、Oppo & Vivo 等)的推送 SDK。

放开应用自启动权限

因为接收到透传推送消息后,需要交给应用自己来处理,所以应用需要能够被自动启动,这就必须打开该应用的自启动权限。

打开自启动权限

解决了推送的问题,还需要放开多项其他必要的权限。

打开其他必要权限

因为接收到来电通知之后,应用需要显示出通知界面,所以需要打开 "锁屏显示" 和 "后台弹出界面" 两个权限。

必要权限

是否真的可行

通过本文前边的讨论,理论上任何安卓应用都可以实现和微信相同的来电通知功能,但是实际情况下是很难保证达到一样的使用体验的。主要是由于以下一些原因。

  • 普通应用的自启动、锁屏显示、后台弹出界面等关键权限都是默认关闭的。而手机厂商会给微信特权,默认打开了所有权限。普通应用如果想达到一样的效果,必须有足够的影响力和方法,引导用户主动打开这些权限。
  • 国产安卓手机系统往往提供了各种节电模式,很多常用的模式会限制网络使用,很多节电模式都会自动在锁屏状态关闭网络,这样在手机锁屏后是无法收到任何推送消息的。当然,这种情况下,微信也无法接收到来电通知。
  • 通知相关的权限通常也需要正确设置。

建议

由于实现友好的来电通知界面,在现实上难以达到理想效果,可以考虑放弃实现这样的体验,而是采用和 iOS 应用一样的,只是展示通知消息的体验。由于国内 App Store 发布的应用不能使用 CallKit 功能 (具体原因可以参考 在中国 App Store 发布的应用不能使用 CallKit 功能),即使是微信也只能做到显示推送通知,而不能出现和 Facetime 一样的来电界面。

iOS 微信来电通知

另外,还可以考虑在推送消息无法到达的情况下,补发短信通知消息。

参考

小米推送常见问题汇总 (opens new window)

极光推送 Android SDK FAQ (opens new window)

个推推送 Andriod SDK 常见问题 (opens new window)

上次更新: 7/28/2019, 8:57:50 PM