6

我正在尝试通过新的 Firebase 推送通知服务向我的用户发送一些数据。

我正在添加一些带有“消息文本”-“dbupdate”的“键值”自定义数据项,以检测它是要向用户显示的更新消息还是普通推送通知。

在我的接收器中,我检查是否有自定义数据并运行更新,如果为真。如果不是这种情况,我会在短信中显示正常通知。

它仅在我的应用程序打开时才有效。如果应用程序关闭,通知仍然显示,我的 if 检查甚至没有运行,

一些代码:

public class PushMessageService extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        Map<String,String> data = remoteMessage.getData();
        String link = data.get("link");
        String name = data.get("name");
        if (link!=null) {
            Log.d("link",link);
            Log.d("name",name);
            UpdateHelper.Go(this, link, name);
        }
        else {
            NotificationCompat.Builder mBuilder =
                    new NotificationCompat.Builder(this)
                            .setSmallIcon(R.drawable.ic_shop_white_24dp)
                            .setAutoCancel(true)
                    .setContentTitle(remoteMessage.getNotification().getTitle())
                   .setContentText(remoteMessage.getNotification().getBody());
            NotificationManager mNotificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            mNotificationManager.notify(5, mBuilder.build());
        }
    }
}

此处的示例通知

为什么呢?即使应用程序关闭,我还能做些什么来运行我的代码?

4

3 回答 3

26

根据我对 Firebase 推送的经验:

问题:通过“Firebase 控制台”发送推送通知时,只有在应用程序处于前台时才会收到通知。如果应用程序被杀死或在后台,即使您在 PendingIntent 中定义了不同的 Activity,通知仅显示在 Version >= lollipop 中,通知图标不正确和/或打开应用程序中的默认启动器活动。

根据 Firebase 文档,推送消息分为 2 个部分,他们称之为: Docs Link here

  1. 通知
  2. 数据有效载荷

在此处输入图像描述

解决方案:

有两种方法可以发送“推送”消息。

1. Firebase 控制台

安慰

2. 消息 API - 显示使用高级 REST 客户端的请求的图像

卷曲请求

onMessageReceived(...)在方法中接收到推送消息。如果应用程序处于后台或仅在通过 Firebase 控制台发送消息时被终止,则不会调用FirebaseonMessageReceived(...)方法。

如果您通过 API 发送消息,它工作正常。onMessageReceived(...)无论应用程序是在后台、前台还是被杀死,消息都以方法传递。(注意:这在>=LollipopAndroid 4.4 或更低版本中运行良好 - 仍然无法预测。

更新:

您可以像这样从 API(firebase 将其称为下游消息)发送推送消息:https ://firebase.google.com/docs/cloud-messaging/downstream

从服务器发送下游消息

为了解决或“定位”下游消息,应用服务器设置为使用接收客户端应用的注册令牌。您可以发送带有预定义字段的通知消息,或自定义数据消息;有关有效负载支持的详细信息,请参阅消息有效负载中的通知和数据。本页中的示例展示了如何在 HTTP 和 XMPP 协议中发送数据消息。

HTTP POST 请求

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{ "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}
于 2016-06-15T19:07:30.200 回答
2

当您的应用程序在前台时,通知将被传递到FirebaseMessagingService.onMessageReceived(). 当应用不在前台时,通知将由默认通知中心处理。

另见:

于 2016-06-14T13:55:22.880 回答
1

在 Android中,如果您想更新应用程序中的某些内容,无论应用程序处于前台/后台/终止状态,那么最好的方法是删除通知负载并仅发送数据负载

{ 
 "to" : "ee8....DYarin",
    "data" : {
         "key" : "value"
    }   
}

在这种情况下onMessageReceived()将被执行。(在某些 android 设备(如 xiomi)中,您需要为您的应用程序启用自动启动以处理处于终止状态的推送)

在这种情况下,您将如何向用户显示通知?您可以在数据负载中将标题和正文作为自定义标签传递,并以编程方式生成通知。因此,在 Android 中,没有通知负载,一切都会顺利进行。


如果您在 Android 中有通知负载,那么问题是:

  • 如果应用程序处于前台一切顺利,则会显示通知并执行 onMessageReceived()
  • 如果应用程序处于后台/终止状态,则通知将显示在您的设备上,但 onMessageReceived() 仅在您单击通知时才有效。用户倾向于经常清除它们并且我们在 onMessageReceived() 中的代码不会被执行。

此外,要在通知上启用此点击功能,通知有效负载应包含名为click_action

"notification":{
        "title":"Prime",
        "body" : "test",
         "click_action": "my_click_action_name"
}

您需要在活动中将操作注册为intent_filter

 <intent-filter>
                <action android:name="my_click_action_name" />
                <category android:name="android.intent.category.DEFAULT" />
 </intent-filter>

当用户单击通知时onNewIntent(),将调用当前活动的方法,并且数据有效负载在当前活动中可用intent.getExtras()

于 2016-11-10T06:42:51.197 回答