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 引起的。
有两个选项可以解决这个问题。
- 如果不需要,请取下接收器。
- 将
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" 的服务声明。
删除那些解决了问题
我正在努力寻找在 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 引起的。
有两个选项可以解决这个问题。
- 如果不需要,请取下接收器。
- 将
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" 的服务声明。
删除那些解决了问题