我已将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>
任何帮助将不胜感激。
由于
答案 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 。
我仍然在研究这个问题