【问题标题】:Firebase shows two notifications on AndroidFirebase 在 Android 上显示两条通知
【发布时间】:2017-04-12 07:11:34
【问题描述】:

我正在努力寻找在 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);
    }

设备上的结果是:

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

谢谢!

17 年 1 月 31 日更新:
关闭 Firebase 支持团队调查此问题...

【问题讨论】:

    标签: android node.js unity3d firebase node-gcm


    【解决方案1】:

    我的项目中存在相同的重复通知问题,以下是解决方案。

    在 [Your unity project folder]\Temp\StagingArea 中通过 unity build 检查生成的 AndroidManifest.xml

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

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

    在我的情况下,我有以下由亚马逊 AWS 统一插件添加的内容

    <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 中的那个。它应该是 [Your unity project folder]\Assets\Plugins\Android 或其子文件夹中的 AndroidManifest.xml 文件之一。

    【讨论】:

      【解决方案2】:

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

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

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

      Firebase:Bundle[{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, 来自=230XXXXXXXXXXX, google.message_id=0:1484748603943016%8a1048bf8a1048bf, gcm.notification.body=通过firebase测试,google.c.a.e=1, collapse_key=com.sub_zero.ipostcard}]

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

      【讨论】:

        【解决方案3】:

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

        我将 AWS 模块包含在项目中,它有自己的清单文件。其中有一个“GCMBroadcastReceiver”的接收器声明与“GCMIntentService”的服务声明相结合。

        删除那些解决了问题的人

        【讨论】:

          猜你喜欢
          • 2017-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-23
          相关资源
          最近更新 更多