Firebase 在 Android 上显示两个通知

Firebase shows two notifications on Android

我正在努力寻找在 android 上使用 Firebase、Unity 并在 node-gcm 的帮助下从 nodejs 发送的重复通知消息的原因。

相关代码如下:

我得到的Unity3d客户端:

 public class PushServiceManager : MonoBehaviour
    {
        public string Identifier;
        public string SkuId;

        public SQSParameters sqsOptions;
        private SQSManager sqs;

        // Use this for initialization
        void Start()
        {
            sqs = new SQSManager(this.sqsOptions);
            sqs.Initialize(this.gameObject);

            Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
            Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
        }

        public void OnTokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs token)
        {
            Debug.Log("Received Registration Token: " + token.Token);

            RegistrationToken t = new RegistrationToken();
            t.id_token = token.Token;

            // sends token to node server
            sqs.SendRegistrationToken(t);
        }

        public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e)
        {
            Debug.Log(e.Message.Data.ToString());
        }
    }

Nodejs 服务器端:

pushNotification(pushRequest, tokens, callback) {

        // This is an array of firebase tokens
        let registrationTokens = tokens.map(function (token) {
            return token.token;
        });

        let message = new gcm.Message({
            timeToLive: pushRequest.ttl
        });

        let note = {

           title: 'Message title',
           icon: 'none',
           sound: 'none',
           body: 'message text'
        };

        message.addNotification(note);

        let payload = {
           data: {foo: "foo"}
        }

        message.addData(payload);

        this.sender.send(message, {registrationTokens}, callback);
    }

设备上的结果是:

问题:
为什么我收到第二个空推送通知?
点击第一个会按预期打开一个统一游戏,但点击那个空的不会。
我哪里出错了?

谢谢!

01.31.17 更新:
拒绝 firebase 支持团队调查此问题...

我在使用 firebase 时遇到了同样的问题。我将 Firebase 与 Microsoft Azure 通知中心一起使用。如果我通过 Microsoft Notification Hub 发送一条测试消息,我只会收到一条消息,并且该消息由我的 Push Handler 处理。否则,如果我通过 firebase 控制台发送推送通知,我会收到两条像你一样的消息(还有一条是空的)。一条消息由我的推送服务处理,第二条消息由 "no code" 以某种方式处理!我在我的代码中找不到处理 firebase 发送的推送通知的位置?后台必须有一个处理通知的 OnReceiveMessage 方法。对我来说,我提出了以下解决方案:我刚刚取消注释我的推送处理程序,现在我只收到一个通知,但这没有声音......我必须以某种方式覆盖该功能并实现声音行为。您找到解决方案了吗?空消息是由您的推送处理程序引起的,第二条完整消息由 firebase 在后台处理。

我还在我的 onReceive() 方法中收到了两种不同类型的消息:

Microsoft:Bundle[{google.sent_time=1484748187461,from=230XXXXXXXXXX,google.message_id=0:1484748187469719%8a1048bff9fd7ecd,message=通过 Microsoft 测试,collapse_key=do_not_collapse}]

Firebase:捆绑包[{google.c.a.udt=0,google.sent_time=1484748603664,gcm.notification.e=1,google.c.a.c_id=3001008833206773803,google.c.a.ts=1484748604, gcm.n.e=1, from=230XXXXXXXXXXX, google.message_id=0:1484748603943016%8a1048bf8a1048bf, gcm.notification.body=通过firebase测试, google.c.a.e=1, collapse_key=com.sub_zero.ipostcard}]

因此,通过 firebase 收到的消息在后台某处处理了一次,可能是通过 firebase 库处理的,我想第二次是由您的处理程序处理的。这就是为什么你得到其中两个......只需取消注释你的推送处理程序并再次测试它。

我的项目中有同样的重复通知问题,下面是解决方案。

在 [你的 unity 项目文件夹]\Temp\StagingArea

中通过 unity build 检查你生成的 AndroidManifest.xml

查找具有以下行的所有接收者:

<action android:name="com.google.android.c2dm.intent.RECEIVE" />

在我的例子中,我有以下由 Amazon AWS unity 插件添加的内容

<receiver android:name="com.amazonaws.unity.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
  <intent-filter>
    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
    <category android:name="com.amazonaws.unity" />
  </intent-filter>
</receiver>

及以下来自 Firebase 插件

<receiver android:exported="true" android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:permission="com.google.android.c2dm.permission.SEND">
  <intent-filter>
    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
    <category android:name="com.bbbbbttttttgggg.sssssstttt" />
  </intent-filter>
</receiver>

重复的通知是由亚马逊 AWS GCMBroadcastReceiver 引起的。

有两个选项可以解决这个问题。

  1. 如果不需要,请取下接收器。
  2. android:exported="false"添加到接收器。

示例:

   <receiver android:exported="false" android:name="com.amazonaws.unity.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
      <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="com.amazonaws.unity" />
      </intent-filter>
    </receiver>

记得在包含接收器的原始 AndroidManifest.xml 中进行更改。不是 Temp\StagingArea 中的那个。它应该是 [您的统一项目文件夹]\Assets\Plugins\Android 或其子文件夹中的 AndroidManifest.xml 文件之一。

我找到了导致此问题的原因...

我将 AWS 模块包含到项目中,该项目有自己的清单文件。其中有 "GCMBroadcastReceiver" 的接收器声明和 "GCMIntentService" 的服务声明。

删除那些解决了问题