GCM(Google云消息传递)无法覆盖所有注册用户?

时间:2016-11-16 21:30:21

标签: android push-notification google-cloud-messaging firebase-cloud-messaging

我已将GCM集成到我的Android应用中,我的应用已经使用GCM 3个月了。

我已按照Google的说明操作,所有内容都在我的设备上运行(Nexus HTC 9以及我测试过的其他设备)。

一般情况下,我发送数据消息(没有" Notification"键),通过onMessageReceived方法接收它,一旦设备获取数据并运行处理的代码,就向我的服务器发送一个ping传入的数据(例如显示通知)。

当应用处于前台,后台或甚至完全关闭时(以及重启设备后),设备会获取数据。

可是...

我每1-2周向所有用户发送一条数据信息,但我注意到仍然存在的注册令牌,以及我得到的"成功"和"消息ID"从GCM的回应来看,我最终只能达到约50%的用户(在某些国家甚至更少)。 例如,如果这是响应:

{ "multicast_id": 108,
  "success": 5000,
  "failure": 300,
  "canonical_ids": 0,
  "results": [
    { "message_id": "1:08" },
    { "message_id": "1:09" }
...
....
....
...
  ]
}

"成功"说5000,但onMessageReceived方法只运行2500个用户......

我还查看了FCM诊断以检查消息ID状态,看起来设备正在收到消息。

我做了另一个测试,只是为了看到我的代码是好的 - 一旦用户使用GCM提供给我的注册令牌成功注册到我的服务器,我立即向他推送一个" test / dummy"数据,只是为了看到用户得到它并且我的代码正在运行并将ping发送到我的服务器 - 这个"循环"为几乎100%的用户工作......

那么为什么1-2周后我无法接触到这些用户并且从100%左右降到50%......? (我只会说那些没有卸载我的应用程序的人)

这是我在GcmListenerService的实现中使用的:

public class GcmMessageHandler extends GcmListenerService {

    @Override
    public void onMessageReceived(String from, Bundle data) {
        ...
        ...
        Context context = getBaseContext();
        sendPingtoMyServer(context)
    }
}

这就是Manifest:

<service
    android:name="[MY_PACKAGE].GcmMessageHandler"
    android:exported="false" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    </intent-filter>
</service>

<receiver
    android:name="com.google.android.gms.gcm.GcmReceiver"
    android:exported="true"
    android:permission="com.google.android.c2dm.permission.SEND" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <category android:name="[MY_PACKAGE]" />
    </intent-filter>
</receiver>

任何帮助将不胜感激。

由于

1 个答案:

答案 0 :(得分:0)

根据我的经验,我使用node-gmc发送消息,这应该无关紧要,因为这些是api调用。

在我的情况下,我发送以下参数

var message = new gcm.Message({
   priority: 'high',
   contentAvailable: true,
   content_available: true,
   notification: {
       sound: true,
       title: "StockAlert Notification",
       icon: "ic_launcher",
       body: notification,
   }
 }) 

无论如何,我确实有同样的问题,玩参数帮助。 出于某种原因 contentAvailable:true 在某些手机上工作但我必须为其他手机添加 content_available:true

我仍然在研究这个问题