我正在AWS
为我的android项目使用资源,我正计划为自己的项目添加推送通知服务AWS SNS
。有几个问题困扰着我。除了一两个问题,我没有发现任何问题,但解释不明确。
1. AWS
支持FCM
吗?SNS
与...合作GCM
。但是Google建议使用FCM而不是GCM
。我没有找到AWS
支持FCM
。
2. AWS
即使在发送推送通知之后,是否也将消息(或数据)存储到其数据库中?
3.我尝试将FCM api密钥放入SNS应用程序平台,为什么显示无效参数?
我正在AWS
为我的android项目使用资源,我正计划为自己的项目添加推送通知服务AWS SNS
。有几个问题困扰着我。除了一两个问题,我没有发现任何问题,但解释不明确。
1. AWS
支持FCM
吗?SNS
与...合作GCM
。但是Google建议使用FCM而不是GCM
。我没有找到AWS
支持FCM
。
2. AWS
即使在发送推送通知之后,是否也将消息(或数据)存储到其数据库中?
3.我尝试将FCM api密钥放入SNS应用程序平台,为什么显示无效参数?
Answers:
FCM与GCM向后兼容。在AWS上设置FCM的步骤与GCM设置过程相同,并且(至少目前而言)FCM在服务器端配置方面与GCM和SNS透明地协同工作。
但是,如果您data
要将有效负载发送到Android设备,则除非您实现扩展的客户端服务,否则不会对其进行处理FirebaseMessagingService
。AWS控制台中的默认JSON消息生成器发送data
消息,除非实现了上述服务,否则您的应用程序将忽略这些消息。要解决此问题以进行初始测试,您可以提供一个自定义notification
有效负载,设备将接收该有效负载(只要您的应用程序不在前台)
有GCM-FCM迁移说明由谷歌提供的,但是你需要做的改变主要是在应用程序方面。
使用SNS在您的应用上测试GCM / FCM所需遵循的步骤是:
FirebaseInstanceIDService
和覆盖onTokenRefresh
方法,才能在Android App中看到它。一旦你这样做,卸载并重新安装您的应用,您的令牌应打印到Android Studio中第一次启动调试控制台。SNS生成的消息将具有以下形式:
{
"GCM": "{ \"data\": { \"message\": \"test message\" } }"
}
正如我们前面提到的,data
如果没有实现接收有效载荷的服务,则有效载荷将被忽略。我们希望在不编写太多代码的情况下进行测试,因此我们应该发送notification
有效负载。为此,只需将JSON消息更改为:
{
"GCM": "{ \"notification\": { \"text\": \"test message\" } }"
}
完成此操作后,请确保您的应用程序未在设备上运行,然后单击“ 发布消息”按钮。现在,您应该会在设备上看到一条通知。
您当然可以通过Amazon SNS API以编程方式完成所有这些操作,但是所有示例似乎都使用了data
有效负载,因此您需要牢记这一点并生成适合您的用例的有效负载。
data
即使客户端应用未实现FCM而是GCM,也可以使用sns正常运行邮件。在我的应用程序中,我尚未在客户端升级到FCM,但是使用SNS的FCM也可以很好地处理data
消息。不行吗
现在,您可以转到Firebase控制台(https://console.firebase.google.com/)选择您的项目,单击齿轮图标并选择项目设置,然后单击云消息传递选项卡...
您将看到旧版服务器密钥,即GCM API密钥,并且可以选择生成FCM版本的新服务器密钥。
SNS将接受两个版本,但它们的菜单选项仍在GCM下分类
这是图片供您参考:
请注意,您可以“意外地”删除服务器密钥,但是旧服务器密钥不可删除。另外,如果单击添加服务器密钥按钮,您将在第一个服务器密钥下方获得一个新的服务器密钥,没有任何警告!...不错的工作Google;)
我试图将解决方案与通知有效负载而不是数据一起使用,但是我没有在移动设备上收到推送通知。我找到了本教程https://youtu.be/iBTFLu30dSg,其中包含有关如何将FCM逐步与AWS SNS结合使用的英文字幕,以及有关如何从AWS控制台发送推送通知并使用aws php sdk在php上实现它的示例。这对我帮助很大。
内森·邓恩(Nathan Dunn)的出色回答再增加了一个注释。如何将带有通知的数据从SNS发送到Firebase。
我们需要向Json添加数据(在通知内部):
{
"default": “any value",
"GCM": "{ \"notification\": { \"body\": \”message body\”, \”title\”: \”message title \”, \"sound\":\"default\" } , \"data\" : {\”key\" : \”value\", \”key2\" : \”value\” } }”
}
在您的FirebaseMessagingService实现中(Xamarin示例)
public override void OnMessageReceived(RemoteMessage message)
{
try
{
var body = message?.GetNotification()?.Body;
var title = message?.GetNotification()?.Title;
var tag = message?.GetNotification()?.Tag;
var sound = message?.GetNotification()?.Sound;
var data = message?.Data
foreach (string key in data.Keys)
{
// get your data values here
}
}
catch (Exception e)
{
}
}
内森·邓恩(Nathan Dunn)的答案仅是一个补充说明:要添加声音,请使用以下JSON消息
{
"GCM": "{ \"notification\": { \"text\": \"test message\",\"sound\":\"default\" } }"
}
我花了一段时间才弄清楚如何使用正确的有效负载发送通知(发布到主题)。所以我将其放在这里。
private void PublishToTopic(string topicArn)
{
AmazonSimpleNotificationServiceClient snsClient =
new AmazonSimpleNotificationServiceClient(Amazon.RegionEndpoint.EUWest1);
PublishRequest publishRequest = new PublishRequest();
publishRequest.TopicArn = topicArn;
publishRequest.MessageStructure = "json";
string payload = "\\\"data\\\":{\\\"text\\\":\\\"Test \\\"}";
publishRequest.Message = "{\"default\": \"default\",\"GCM\":\"{" + payload + "}\"}";
PublishResponse publishResult = snsClient.Publish(publishRequest);
}