0

我正在努力寻找在 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 支持团队以调查此问题...
在此处输入图像描述

4

3 回答 3

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 文件之一。

于 2017-04-11T21:54:16.237 回答
0

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

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

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

Firebase:捆绑[{google.caudt=0, google.sent_time=1484748603664, gcm.notification.e=1, google.cac_id=3001008833206773803, google.cats=1484748604, gcm.ne=1, from=230XXXXXXXXXXX, google.message_id =0:1484748603943016%8a1048bf8a1048bf, gcm.notification.body=通过firebase测试,google.cae=1, collapse_key=com.sub_zero.ipostcard}]

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

于 2017-01-18T15:17:45.170 回答
0

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

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

删除那些解决了问题

于 2017-04-11T23:11:34.837 回答