App connected to FCM not receiving notification from AWS SNS

时间:2016-12-02 05:08:45

标签: android amazon-web-services amazon-sns

I've connected an Android app to Google Firebase Cloud Messaging service (FCM) following this guide,

and I've followed this answer to setup the connection between FCM & AWS SNS.

I could successfully receive message sent from FCM console but not from AWS SNS console.

The message delivery status logged on AWS showed SUCCESS for every message I've sent while no notification was shown on my device.

Is there a way to check what's going on?

5 个答案:

答案 0 :(得分:4)

这里的问题是AWS SNS发送Google呼叫数据消息。

使用FCM,您可以发送两种类型的消息 - 通知和数据。 FCM会自动显示通知,而数据消息则不会。更多相关信息:https://firebase.google.com/docs/cloud-messaging/concept-options

通过扩展FirebaseMessagingService并覆盖它的onMessageReceived方法,即使您的应用处于后台,也可以处理来自SNS的数据消息。更多相关信息:https://firebase.google.com/docs/reference/android/com/google/firebase/messaging/FirebaseMessagingService

我假设您希望AWS SNS消息模仿通知体验,即:

  • 当应用在后台时看到它们弹出
  • 让您的文字显示在通知中
  • 当应用激活时,您希望清除所有消息 抽屉

要实现这一目标,你需要做三件事。

首先 - 如果你的应用目前是不可见的,你会想要开始跟踪。有关如何可靠检测此问题的详细信息,请访问:https://stackoverflow.com/a/18469643/96911

其次 - 您希望通过发布通知来处理来自AWS SNS的数据消息,但仅限于您的应用位于后台时:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    static protected int id = 0;

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);

        if (!MyApplication.isActivityVisible()) {
            NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
            mBuilder.setContentTitle(getString(R.string.app_name))
                    .setSmallIcon(R.drawable.notification_icon);

            String message = remoteMessage.getData().get("default");
            mBuilder.setContentText(message);

            Intent resultIntent = new Intent(this, MainActivity.class);
            PendingIntent resultPendingIntent =
                    PendingIntent.getActivity(
                            this,
                            0,
                            resultIntent,
                            PendingIntent.FLAG_UPDATE_CURRENT
                    );
            mBuilder.setContentIntent(resultPendingIntent);

            NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

            mNotificationManager.notify(id ++, mBuilder.build());
        }
    }

}

最后 - 当用户点击其中一个时,您需要清除抽屉中的所有通知。结合我在响应通知的活动上方链接的可见性跟踪应该具有以下onResume方法:

@Override
protected void onResume() {
    super.onResume();

    MyApplication.activityResumed();

    NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    mNotificationManager.cancelAll();
}

自从你提出这个问题以来已经有很长一段时间了,但是对我来说这是非常痛苦的,我决定回答这个问题。我希望这可以帮助你或者某人撕裂他们的头发试图让这件事工作(因为让iOS工作变得轻而易举,谢谢)。

答案 1 :(得分:4)

您可以将此视频教程https://youtu.be/iBTFLu30dSg与英文字幕一起使用,以及如何逐步使用AWS SNS以及如何从AWS控制台发送推送通知的示例。它适用于我,我成功收到SNS控制台和移动设备上的代码的推送通知

答案 2 :(得分:3)

我遇到了完全相同的问题,来自Firebase的带有设备令牌的消息可以工作,但是从SNS到Firebase的消息却无法传递。

我也确实开发了iOS应用,那时,我只是向iOS发送“ brabra”传递的消息。但是,FCM仅接受特定的消息格式以从AWS SNS控制台对其进行测试。

以下是通过SNS和FCM成功向Android发送消息的示例格式。

{
 "GCM": "{\"notification\": { \"body\": \"Sample message for Android endpoints\", \"title\":\"Hello world\" } }"
}

重点是我们必须修改“通知”,而不是“数据”,并且在通知中应具有正文和标题。

答案 3 :(得分:0)

要从AWS SNS控制台获取数据,请执行以下步骤:

1)在FCM中添加项目,并为AWS SNS使用旧服务器密钥。

2)使用以下代码获取设备令牌:

String deviceToken = FirebaseInstanceId.getInstance().getToken();

3)在您的应用程序中实现以下代码

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

@Override
public void onTokenRefresh() {

    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    sendRegistrationToServer(refreshedToken);
}

private void sendRegistrationToServer(String token) {
    // TODO: Implement this method to send token to your app server.
}

}

4)在收到通知时覆盖onMessageReceived()调用:

public class AppFirebaseMessagingService extends FirebaseMessagingService {
static protected int id = 0;

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    //remoteMessage.getNotification().getBody()


     if (remoteMessage.getData().get("default").length() > 0) {
              Intent intent = new Intent(this, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
        Uri ringNotificationSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notifyBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("ApplicationName")
                .setContentText(remoteMessage.getData().get("default"))
                .setAutoCancel(true)
                .setSound(ringNotificationSound)
                .setContentIntent(pendingIntent);
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(id++, notifyBuilder.build());

    }
}

}

当我们从AWS SNS服务获得通知时,我们使用remoteMessage.getData().get("default")来阅读来自AWS的消息。

答案 4 :(得分:0)

仅使用此JSON格式:

{
  "GCM": "{ \"notification\": { \"body\": \"Sample message for Android endpoints\",\"title\": \"Sample message for Android endpoints\"}}"
}