Android GCM推送有时会传送到设备,但不会传送到我的应用程序

Android GCM推送有时会传送到设备,但不会传送到我的应用程序,android,notifications,push,google-cloud-messaging,Android,Notifications,Push,Google Cloud Messaging,我有一个问题,GCM消息推送到我的设备,但有时不能路由到我的应用程序,特别是当我的应用程序刚刚启动时。我向logcat读了以下一行: I/GCM ( 5227): GCM message com.info.chat 0:1423053966153011%64523c3ff9fd7dcc D/ConnectivityService( 774): handleInetConditionHoldEnd: net=0, condition=100, published condition=10

我有一个问题,GCM消息推送到我的设备,但有时不能路由到我的应用程序,特别是当我的应用程序刚刚启动时。我向logcat读了以下一行:

I/GCM     ( 5227): GCM message com.info.chat 0:1423053966153011%64523c3ff9fd7dcc
D/ConnectivityService(  774): handleInetConditionHoldEnd: net=0, condition=100, published condition=100
I/Ads     (20754): Ad is not visible. Not refreshing ad.
I/Ads     (20754): Scheduling ad refresh 60000 milliseconds from now.
W/GCM-DMM ( 5227): Force release of GOOGLE_C2DM lock
然后我看不到我的应用程序处理消息的任何日志

但是,有时它会成功,日志如下所示:

I/GCM     ( 5227): GCM message com.info.chat 0:1423054244269861%64523c3ff9fd7dcc
D/com.info.chat( 8263): <8263>[GCMBroadcastReceiver.onReceive 24]Received a GCM   Broadcast : Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10 pkg=com.info.chat cmp=com.info.chat/.GCMBroadcastReceiver (has extras) }
以及舱单:

    <permission android:name="com.info.chat.permission.C2D_MESSAGE"
            android:protectionLevel="signature" />
    <uses-permission android:name="com.info.chat.permission.C2D_MESSAGE" />
    <receiver
        android:name="com.info.chat.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.info.chat" />
        </intent-filter>
    </receiver>       


因此,任何人都可以帮助确保消息应该发送到我的应用程序?

谷歌保证将GCM/FCM消息发送到设备。一旦它到达设备,Google Play Services会将其广播到注册的客户端(如果尚未启动,则启动客户端进程)。因此,如果您的应用程序/服务未收到GCM消息,则表明您的应用程序进程已“坏”。当你的应用程序频繁崩溃,操作系统强制停止时,就会发生这种情况;在此“坏”状态下,你的应用程序无法接收任何GCM消息

Logcat将显示如下日志,指示取消的广播:

12-06 18:37:31.802 3566-3566/?带GCM-DMM:广播意图回调: 结果=因意图而取消{ act=com.google.android.c2dm.intent.RECEIVE pkg=您的_pkg _name(有附加项)}

还要注意的是,当你的应用程序崩溃时,崩溃对话框会停留5分钟;在这5分钟内,您的应用程序既不会收到任何FCM消息,也不会收到任何其他外部广播(例如,在行动清单中注册的广播\u电源\u连接等)。一旦5分钟过去,对话框消失,你的应用程序就会正常运行

一个典型的例子是一个应用程序,其中onCreate()本身有一个异常。这一个将成为坏进程的主要候选。 应用程序将不会得到自动更新时,通过playstore在坏的状态;但是,可以通过转到playstore或重新启动手机手动更新。
注意:至少我使用Nexus 5x的经验是,我们不需要卸下电池就可以让应用摆脱坏状态;重新启动就足够了。

您使用什么发送推送通知?您有权访问服务器日志吗?您应该会收到对您的
发件人.send()
呼叫的响应。我们正在使用我们自己的内部推送服务器,该服务器带有针对GCM和HTTPM的标准google库。罪魁祸首可能有很多。_到_live的时间可以是0,这意味着如果设备不在线,消息将被丢弃。您也可能使用了折叠键,该键将使用相同的折叠键折叠以前的消息。您的推送服务器日志将非常有用。它应该接收任何响应代码。
    <permission android:name="com.info.chat.permission.C2D_MESSAGE"
            android:protectionLevel="signature" />
    <uses-permission android:name="com.info.chat.permission.C2D_MESSAGE" />
    <receiver
        android:name="com.info.chat.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.info.chat" />
        </intent-filter>
    </receiver>