GCM 客户端收不到下游消息

Posted

技术标签:

【中文标题】GCM 客户端收不到下游消息【英文标题】:GCM client does not receive downstream messages 【发布时间】:2015-09-28 15:28:10 【问题描述】:

我的应用服务器已成功向 GCM 发送消息,但是在客户端,没有收到消息,即使它拥有令牌并且已订阅不同的主题。 为了收听传入的消息,我使用了 GcmListenerService 的扩展。由于这是一项服务,因此它从 mainactivity 开始。下面是清单的相关部分:

 <!-- [START gcm_permission] -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- [END gcm_permission] -->
<!-- [START gcm_receiver] -->
    <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.app" />
        </intent-filter>
    </receiver>
    <!-- [END gcm_receiver] -->
    <!-- [START gcm_listener] -->
    <service
        android:name="my.app.MyGcmListenerService"
        android:exported="false" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>
    <!-- [END gcm_listener] -->
    <!-- [START instanceId_listener] -->
    <service
        android:name="my.app.MyInstanceIDListenerService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.android.gms.iid.InstanceID"/>
        </intent-filter>
    </service>
    <!-- [END instanceId_listener] -->
    <service
        android:name="my.app.RegisterIntentService"
        android:exported="false">
    </service>

GCM 监听器如下:

public class MyGcmListenerService  extends GcmListenerService 

private static final String TAG = "MyGcmListenerService";


// [START receive_message]
@Override
public void onMessageReceived(String from, Bundle data) 
    String message = data.getString("message");
    Log.d(TAG, "From: " + from);
    Log.d(TAG, "Message: " + message);


    if (from.startsWith("/topics/")) 
        // message received from some topic.
        //TOPICS = "News","Updates","GeneralInfo";

        if (from.split("/")[2].equals("News")) 
            ....

如前所述,GCM 侦听器是作为常规服务从 mainactivity 启动的。

 //starting the listener service for messages
    intentGCMListen = new Intent(this,MyGcmListenerService.class);
    startService(intentGCMListen);

在我遵循的示例(GCM quickstart)中,这基本上是我在这部分中部署 GCM 的核心,GCM 侦听器服务没有这样的启动。我认为应该启动它,因为它是一项服务。 任何想法为什么没有从 GCM 服务器下载消息?

更新

我用于将消息从服​​务器发送到 GCM 的 bash 脚本是:

#!/bin/bash
api_key=AIadasdasdsa
message=$1
topic=/topics/GeneralInfo
curl --header "Authorization: key=$api_key" --header Content-Type:"application/json" https://gcm-http.googleapis.com/gcm/send  -d "\"to\":\"$topic\",\"data\":\"message\":\"$message\""

【问题讨论】:

【参考方案1】:

我认为您的代码中缺少 BroadcastReceiver,该广播接收器用于接收 GCM 服务器发送的广播供您的应用客户端处理。您需要检查代码中的以下几行:

    /**
     * Receiving push messages
     * */
    private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() 
        @Override
        public void onReceive(Context context, Intent intent) 

            String newMessage = intent.getExtras().getString(EXTRA_MESSAGE);
            // Waking up mobile if it is sleeping
            WakeLocker.acquire(getApplicationContext());

            /**
            * Take appropriate action on this message
            * depending upon your app requirement
            * For now i am just displaying it on the screen
            * */

            // Showing received message
            lblMessage.append(newMessage + "\n");           
            Toast.makeText(getApplicationContext(), "New Message: " + newMessage, Toast.LENGTH_LONG).show();

            // Releasing wake lock
            WakeLocker.release();
       
   ;

更多代码描述请看tutorial。

【讨论】:

感谢您的回复和帮助。我几乎 100% 确定 GCMListenerService 正在完成这项工作。 我终于弄清楚了问题所在。我有通过防火墙的限制。我发现这篇文章对我有很大帮助***.com/questions/15571576/…

以上是关于GCM 客户端收不到下游消息的主要内容,如果未能解决你的问题,请参考以下文章

使用 XMPP 关闭 GCM 连接服务器的套接字

识别上游 GCM 消息的发送者

Kafka客户端收不到消息

操作 GCM 下游消息

C语言写的UDP客户端收不到包

适用于 iOS 的 GCM 下游消息传递 JSON 格式