安卓端保障新消息及时通知的常见实践

当app在后台运行时,环信IM SDK默认通过一个后台服务保持一条连接环信服务器的长连接。但Android为了解决系统待机性能差的问题,随着Android版本的升级逐渐禁止了app级别的后台服务的运行。所以在一些版本比较高的Android系统上会有APP进入后台后接收不到消息的情况。

目前常见的解决方法如下:

集成尽可能多的厂家推送。环信支持了所有主流的第三方厂家推送服务,包括小米推送,华为推送,OPPO推送,魅族推送,VIVO推送,Google FCM推送。详情请见:第三方推送集成

针对没有厂家推送的手机型号,可以采取的优化措施包括:

告知APP使用者去开启该APP的“自启动模式”、“非省电模式”,从而可以让App活得更久。常见的实践是在APP的设置页面,通过提供文档说明的方式告知APP使用者如何开启APP的“自启动模式”、“非省电模式“。也可以在APP的设置页面,设置链接,让用户点击链接后就跳转到该型号手机的相应的系统设置位置。举例如下:

针对没有厂家推送的手机型号,可以采取的优化措施包括:

通过短信告知。方法如下:开通消息回执;如果在规定时间内(例如1分钟)没有返回值“已读”,环信将信息转给业务系统;业务系统发现时间到期后(例如超过3分钟),业务系统服务器去环信服务器查询,如果没有下发,然后出发短信系统发送信息。获取离线消息的方法: 点击查看

在音视频通话的场景下,还可以使用自定义推送铃声,让推送的铃声提醒更明显持续时间更长。请注意,自定义铃声,目前只支持华为。关于自定义铃声支持,请详见文档:

如果想在android端的app上收到推送时播放自定义的铃声,需要在消息的扩展中增加如下的字段:

"ext":{
      "em_apns_ext":{
          //对于华为EMUI 10以上系统需要设置以下参数,否则容易被华为通知智能分类分到营销通知渠道,
          //从而不能播放自定义铃声
          "em_push_name":"标题",
          "em_push_content":"内容",
      },
      "em_push_ext":{
       	  "type":"call"
      },
      "em_android_push_ext":{
          //指定自定义渠道
          "em_push_channel_id":"Channel id",
          "em_push_sound":"/raw/appsound"
      }
  }

其中声音文件(em_push_sound key的值)都存放在Android设备上应用的“/res/raw/**”目录下。

注意事项:
(1)目前只支持华为EMUI 10以上的系统。
(2)华为EMUI 10以上自定义推送铃声,需要设置channel_id,通过em_push_channel_id进行设置。

需要注意的是,即使指定了渠道标识(channel id),消息最终能否展示在应用渠道上,受用户终端上该渠道是否创建以及渠道的开关策略控制。
a、如果本地已经创建该渠道,且已设置了对应的自定义铃声,收到推送消息时会播放自定义铃声。
b、如果本地没有创建指定的渠道,则华为会对消息进行智能分类,根据消息设置的级别及智能分类的结果,两者取低,根据级别下发到服务提醒,普通通知与营销通知三个中的一个通知渠道,如果该通知渠道之前没有创建且不是营销通知,则设置自定义铃声有效。
(3)对于华为EMUI 10以上系统,需要添加em_push_name和em_push_content参数,否则容易被华为通知智能分类分到营销通知渠道,从而不能播放自定义铃声。参考: 通知消息智能分类
(4)由于铃声是通知渠道的属性,因此铃声仅在渠道创建时有效,渠道创建后,即使设置自定义铃声也不会播放,而使用创建渠道时设置的铃声。

如果需要兼容ios端,需要在消息的扩展中额外增加如下字段:

"ext":{
    "em_apns_ext":{
        //设置ios端自定义铃声文件
        "em_push_sound": "custom.caf",
        //保证 APNs 通知扩展
        "em_push_mutable_content":true
    },
    ......
 }

在音视频通话的场景下,还可以通过自定义推送扩展可以做到点击推送提醒,既可以打开接听页面。请详见文档:自定义推送提示