Android开发的你是否也有这样疑问,应用在Android手机退到后台太久会收不到消息?第三方推送怎么集成?谷歌推送国内能用吗?

  5月30日环信研发工程师张松在环信第25期公开课上分享关于Android收发消息的原理,以及推送通知的实现,详细内容如下。

500592627_wx.jpg

  为什么应用在Android手机上退到后台太久会出现收不到消息的情况?

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

  如何解决Android后台收不到消息的问题?

  为了提高消息的到达率,环信SDK增加了对第三方推送服务的支持,包括小米推送、华为推送、Google FCM推送。 (服务端也增加了相应功能)

  1.Google FCM推送:Firebase Cloud Messaging,用来替代Google的GCM推送服务。

  FCM推送在国内是无法正常使用的,需要设备上有Google play service和能连接Google服务器的网络。所以该推送服务主要针对海外用户,如果你的app有海外用户,建议你增加对该推送服务的支持。

  推送消息发送流程:

  

1.png


  环信Server:

  1.环信后台配置推送证书

  让环信服务器拥有向你的app发送推送消息的功能

  根据配置的证书名称服务器可以判断设备使用了哪种推送

  2.目标设备的推送token

  Android设备通过集成第三方推送SDK可以得到该推送token.

  推送token跟Android设备是一一对应的关系,一个token对应一个Android设备.

  不同推送通道获取到的推送token不同.

  3.推送token属于哪个推送通道

  决定了用哪个通道来发送推送消息.

  根据Android设备上传的证书名称确定.

  Android设备:

  1.判断app所在Android设备上支持哪种推送通道

  •   小米推送: 支持小米系统

  •   华为推送: 支持华为系统

  •   FCM:需要Google play service和能连接Google服务器的网络

  2.集成第三方推送SDK获取推送token

  3.将推送token和推送通道名称上传至环信服务器.

  SDK集成第三方推送

  小米推送:

  小米推送目前集成在了SDK内部,后续也会放在Demo中实现,让开发者可以自己升级小米推送SDK

  

1.在app AndroidManifest.xml中添加配置:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.VIBRATE"/>
<permission
android:name="com.hyphenate.chatuidemo.permission.MIPUSH_RECEIVE"     android:protectionLevel="signature" />
<!--这里com.hyphenate.chatuidemo改成app的包名-->  
<uses-permission   android:name="com.hyphenate.chatuidemo.permission.MIPUSH_RECEIVE" />
<!--这里com.hyphenate.chatuidemo改成app的包名-->
 
<service
     android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
     android:enabled="true"
     android:exported="true"
     tools:ignore="ExportedService" />
 <service
     android:name="com.xiaomi.mipush.sdk.MessageHandleService"
     android:enabled="true" />
 
 <receiver
# EMMipushReceiver extends PushMessageReceiver
     android:name="com.hyphenate.chat.EMMipushReceiver"
     android:exported="true"
     tools:ignore="ExportedReceiver">
     <intent-filter>
         <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
     </intent-filter>
     <intent-filter>
         <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
     </intent-filter>
     <intent-filter>
         <action android:name="com.xiaomi.mipush.ERROR" />
     </intent-filter>
 </receiver>
 
EMOptions#setMipushConfig(appKey:"2882303761517426801", appSecret:"5381742660801");

  SDK处理流程:

  根据小米推送SDK提供的方法MiPushClient#shouldUseMIUIPush(Context context)判断当前设备是否支持小米推送

  若当前设备支持推送,则调用MiPushClient#registerPush(Context context, appKey, appSecret)获取小米通道推送

  token

  将appKey和token上传至环信服务器,该部分实现位于EMMipushReceiver 中,如果开发者需要自定义小米PushMessageReceiver,请继承自EMMipushReceiver .

  华为推送

  华为推送已放置到demo层实现,方便开发者自己更新华为推送SDK

  华为推送SDK做为hmspush 单独module存在

  注意修改hmspush module中AndroidManifext.xml文件的appid,两个provider对应authorities

  Demo中配置了一个BroadcastReceiver和一个HMSPushHelper

  FCM推送

  增加了compile 'com.google.android.gms:play-services-base:11.4.0',检查当前设备是否支持fcm推送.

  设置fcm numberoptions.setFCMNumber("826964054884");

  整体工作流程:

  

2.png


  Android设备手动或自动登录时,判断当前设备支持哪种推送通道,将该通道下获取到的token和证明名称上传至环信服务器,当服务端检测到当前设备不在线,需要向当前设备发送推送消息的时候,根据设备上传的证书名称判断出当前设备使用的哪种推送通道接收推送消息,使用相应推送通道向该设备上传的推送token上发送消息,当前设备即可收到该推送消息.

  建议:

  1.如果你的app有海外用户,建议你在环信SDK上增加对FCM推送的支持

  2.建议同时支持小米推送和华为推送,这样在小米和华为设备上都可以接收到推送消息.


  视频回放:环信集成公开课-Android第二讲-消息推送原理+推送集成

    环信公开课:每周三下午三点开课,直播观看地址