使用 AWS SNS 的 FCM
FCM with AWS SNS
我正在为我的 android 项目使用 AWS
资源,我计划使用 AWS SNS
为我的项目添加推送通知服务。有几个问题困扰着我。我没有发现任何关于这些的问题,除了一两个但解释不清楚。
1.DoesAWS
支持FCM
? SNS
与 GCM
一起工作。但是 Google 建议使用 FCM 而不是 GCM
。我没有找到 AWS
支持 FCM
.
2.Do AWS
即使在发送推送通知后仍将消息(或数据)存储到他们的数据库中?
3.I 尝试将FCM api 密钥放入SNS 应用平台,为什么显示无效参数?
FCM 向后兼容 GCM。在 AWS 上设置 FCM 的步骤与 GCM set up procedure 相同,并且(至少目前)FCM 在服务器端配置方面与 GCM 和 SNS 透明地协同工作。
但是,如果您向 Android 设备发送 data
有效载荷,除非您实施 client side service扩展 FirebaseMessagingService
。 AWS 控制台中的默认 JSON 消息生成器发送 data
消息,除非实现上述服务,否则您的应用程序将忽略这些消息。为了在初始测试中解决这个问题,您可以提供一个自定义 notification
负载,您的设备将接收该负载(只要您的应用不在前台)
GCM-FCM migration instructions 由 Google 提供,但您需要进行的更改主要在 App 端。
使用 SNS 在您的应用上测试 GCM/FCM 需要遵循的步骤是:
- 在 API 键 字段中创建一个 Platform Application in SNS, selecting Google Cloud Messaging (GCM) as the Push Notification Platform, and providing your Server API key。
- Select 平台应用程序并单击 创建平台端点 按钮。
- 提供您的应用生成的 InstanceID(设备令牌)。您必须扩展
FirebaseInstanceIDService
并覆盖 onTokenRefresh
方法才能在您的 Android 应用程序中看到它。一旦你 have done this,卸载并重新安装你的应用程序,你的令牌应该会在第一次启动时打印到 Android Studio 中的调试控制台。
- 单击添加端点按钮。
- 单击平台应用程序的 ARN link。
- Select 为您的设备新创建的端点,然后单击 发布到端点 按钮。
- Select JSON 消息格式,然后单击JSON消息生成器按钮.
- 输入测试消息并单击 生成 JSON 按钮
- 现在是“陷阱”部分。
SNS 生成的消息将采用以下形式:
{
"GCM": "{ \"data\": { \"message\": \"test message\" } }"
}
正如我们之前提到的,data
有效载荷将被忽略,如果没有实现接收它们的服务。我们希望在不编写太多代码的情况下进行测试,因此我们应该发送 notification
有效负载。为此,只需将 JSON 消息更改为:
{
"GCM": "{ \"notification\": { \"title\": \"test title\", \"body\": \"test body\" } }"
}
(有关 FCM 消息的 JSON 格式的更多信息,请参阅 FCM documentation。)
完成此操作后,请确保您的应用未在设备上 运行,然后点击 发布消息 按钮。您现在应该会在设备上看到弹出的通知。
您当然可以通过 Amazon SNS API 以编程方式完成所有这些操作,但是所有示例似乎都使用了 data
负载,因此您需要牢记这一点并生成适当的负载到您的用例。
只是对 Nathan Dunn 的回答的补充说明:要添加声音,请使用以下 JSON 消息
{
"GCM": "{ \"notification\": { \"text\": \"test message\",\"sound\":\"default\" } }"
}
现在您可以转到您的 firebase 控制台 (https://console.firebase.google.com/) select 您的项目,单击齿轮图标并选择项目设置,然后单击云消息选项卡...
您将看到旧版服务器密钥,即 GCM API 密钥,并且您可以选择生成新的服务器密钥,即 FCM 版本
SNS 将接受这两个版本,但他们的菜单选项仍在 GCM 下对其进行分类
图片供参考:
请注意,您可以"accidentally" 删除您的服务器密钥,但旧版服务器密钥不可删除。此外,如果您单击添加服务器密钥按钮,您将在第一个服务器密钥下方获得一个新的服务器密钥,并且没有任何警告! ...干得好 Google ;)
我尝试使用带有通知负载而不是数据的解决方案,但我没有在移动设备上收到推送通知。我发现本教程 https://youtu.be/iBTFLu30dSg 带有英文字幕,介绍了如何逐步将 FCM 与 AWS SNS 结合使用,以及如何从 AWS 控制台发送推送通知并使用 aws php 在 php 上实施它的示例 php SDK。对我帮助很大。
对 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)
{
}
}
我花了一段时间才弄清楚如何使用正确的负载发送通知(发布到主题)。所以我会把它放在这里。
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);
}
回答问题:
- AWS SNS 支持 FCM。
- 否 AWS 在发送推送通知后不存储消息。
有关使用 SNS 设置 FCM 的详细教程,请阅读 this article.
Amazon 确实支持 FCM,因为所有以前的代码都已从 GCM 迁移到 FCM。下面文章详细解释。
我正在为我的 android 项目使用 AWS
资源,我计划使用 AWS SNS
为我的项目添加推送通知服务。有几个问题困扰着我。我没有发现任何关于这些的问题,除了一两个但解释不清楚。
1.DoesAWS
支持FCM
? SNS
与 GCM
一起工作。但是 Google 建议使用 FCM 而不是 GCM
。我没有找到 AWS
支持 FCM
.
2.Do AWS
即使在发送推送通知后仍将消息(或数据)存储到他们的数据库中?
3.I 尝试将FCM api 密钥放入SNS 应用平台,为什么显示无效参数?
FCM 向后兼容 GCM。在 AWS 上设置 FCM 的步骤与 GCM set up procedure 相同,并且(至少目前)FCM 在服务器端配置方面与 GCM 和 SNS 透明地协同工作。
但是,如果您向 Android 设备发送 data
有效载荷,除非您实施 client side service扩展 FirebaseMessagingService
。 AWS 控制台中的默认 JSON 消息生成器发送 data
消息,除非实现上述服务,否则您的应用程序将忽略这些消息。为了在初始测试中解决这个问题,您可以提供一个自定义 notification
负载,您的设备将接收该负载(只要您的应用不在前台)
GCM-FCM migration instructions 由 Google 提供,但您需要进行的更改主要在 App 端。
使用 SNS 在您的应用上测试 GCM/FCM 需要遵循的步骤是:
- 在 API 键 字段中创建一个 Platform Application in SNS, selecting Google Cloud Messaging (GCM) as the Push Notification Platform, and providing your Server API key。
- Select 平台应用程序并单击 创建平台端点 按钮。
- 提供您的应用生成的 InstanceID(设备令牌)。您必须扩展
FirebaseInstanceIDService
并覆盖onTokenRefresh
方法才能在您的 Android 应用程序中看到它。一旦你 have done this,卸载并重新安装你的应用程序,你的令牌应该会在第一次启动时打印到 Android Studio 中的调试控制台。 - 单击添加端点按钮。
- 单击平台应用程序的 ARN link。
- Select 为您的设备新创建的端点,然后单击 发布到端点 按钮。
- Select JSON 消息格式,然后单击JSON消息生成器按钮.
- 输入测试消息并单击 生成 JSON 按钮
- 现在是“陷阱”部分。
SNS 生成的消息将采用以下形式:
{
"GCM": "{ \"data\": { \"message\": \"test message\" } }"
}
正如我们之前提到的,data
有效载荷将被忽略,如果没有实现接收它们的服务。我们希望在不编写太多代码的情况下进行测试,因此我们应该发送 notification
有效负载。为此,只需将 JSON 消息更改为:
{
"GCM": "{ \"notification\": { \"title\": \"test title\", \"body\": \"test body\" } }"
}
(有关 FCM 消息的 JSON 格式的更多信息,请参阅 FCM documentation。)
完成此操作后,请确保您的应用未在设备上 运行,然后点击 发布消息 按钮。您现在应该会在设备上看到弹出的通知。
您当然可以通过 Amazon SNS API 以编程方式完成所有这些操作,但是所有示例似乎都使用了 data
负载,因此您需要牢记这一点并生成适当的负载到您的用例。
只是对 Nathan Dunn 的回答的补充说明:要添加声音,请使用以下 JSON 消息
{
"GCM": "{ \"notification\": { \"text\": \"test message\",\"sound\":\"default\" } }"
}
现在您可以转到您的 firebase 控制台 (https://console.firebase.google.com/) select 您的项目,单击齿轮图标并选择项目设置,然后单击云消息选项卡...
您将看到旧版服务器密钥,即 GCM API 密钥,并且您可以选择生成新的服务器密钥,即 FCM 版本
SNS 将接受这两个版本,但他们的菜单选项仍在 GCM 下对其进行分类
图片供参考:
请注意,您可以"accidentally" 删除您的服务器密钥,但旧版服务器密钥不可删除。此外,如果您单击添加服务器密钥按钮,您将在第一个服务器密钥下方获得一个新的服务器密钥,并且没有任何警告! ...干得好 Google ;)
我尝试使用带有通知负载而不是数据的解决方案,但我没有在移动设备上收到推送通知。我发现本教程 https://youtu.be/iBTFLu30dSg 带有英文字幕,介绍了如何逐步将 FCM 与 AWS SNS 结合使用,以及如何从 AWS 控制台发送推送通知并使用 aws php 在 php 上实施它的示例 php SDK。对我帮助很大。
对 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)
{
}
}
我花了一段时间才弄清楚如何使用正确的负载发送通知(发布到主题)。所以我会把它放在这里。
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);
}
回答问题:
- AWS SNS 支持 FCM。
- 否 AWS 在发送推送通知后不存储消息。
有关使用 SNS 设置 FCM 的详细教程,请阅读 this article.
Amazon 确实支持 FCM,因为所有以前的代码都已从 GCM 迁移到 FCM。下面文章详细解释。