AWS SNS 发布的消息未推送到设备

Posted

技术标签:

【中文标题】AWS SNS 发布的消息未推送到设备【英文标题】:AWS SNS published message not getting pushed to device 【发布时间】:2016-06-27 10:17:31 【问题描述】:

我正在尝试使用 AWS SNS 来替代运行我自己的向 iosandroid 应用程序发送推送通知的服务。我从 GCM 开始,所以我在 SNS 中创建了一个 GCM 应用程序,然后添加了一个端点。

当我从 AWS 控制台发布消息时,它可以很好地传递到设备,但是当我通过 AWS php SDK 发布时,它会返回一个 messageId(因此 SNS 收到了消息)但不会推送到设备.

这是我的工作:

$snsclient = Aws\Sns\SnsClient::factory(array(
    "version" => "2010-03-31",
    "region" => "eu-west-1",
    "credentials" => array(
        "key" => "***********",
        "secret" => "***********"
    )
));
$publish_result = $snsclient->publish(array(
    "TargetArn" => "arn:aws:sns:eu-west-1:*********:endpoint/GCM/*******/********",
    "Message" => "MESSAGE",
    "Subject" => "SUBJECT",
));

然后导致

object(Aws\Result)#96 (1) 
  ["data":"Aws\Result":private]=>
  array(2) 
    ["MessageId"]=>
    string(36) "********************"
    ["@metadata"]=>
    array(3) 
      ["statusCode"]=>
      int(200)
      ["effectiveUri"]=>
      string(35) "https://sns.eu-west-1.amazonaws.com"
      ["headers"]=>
      array(4) 
        ["x-amzn-requestid"]=>
        string(36) "****************"
        ["content-type"]=>
        string(8) "text/xml"
        ["content-length"]=>
        string(3) "294"
        ["date"]=>
        string(29) "Mon, 27 Jun 2016 10:20:26 GMT"
      
    
  

编辑: 我刚刚意识到,如果我将 MessageStructure 设置为 json,然后将 Message 设置为 '"GCM": " \"data\": \"message\": \"aa\" "',它会发送美好的。 将其原始发送有什么问题? 我应该选择哪种方式?我认为 raw 更好,因为它允许我使用相同的结构发送到 iOS 和 Android(然后 SNS 会为我正确构建消息)...

谢谢, 约瑟夫。

【问题讨论】:

感谢@john-rotenstein 的编辑。这对我有用,并为我节省了大量的调查时间。 【参考方案1】:

如Push Notifications to Mobile Devices Using Amazon SNS 中所述,创建可以接收推送通知的移动应用程序需要执行以下操作:

    为受支持的设备和消息传递 API 创建应用程序。应用必须使用设备 API 向本地平台通知服务注册,才能接收通知。 使用 SNS 的 CreatePlatformApplication 函数创建应用的服务器端表示。 在您的服务器代码通过调用 SNS CreatePlatformEndpoint 函数识别设备时注册设备。此函数将返回唯一标识设备的 ARN(亚马逊资源名称)。 通过使用设备的 ARN 调用 Publish 函数,将消息直接发送到特定设备。 通过调用相同的Publish 函数向订阅某个主题的所有设备发送消息,但使用该主题的 ARN。

给定文档中显示了一个出色的示例代码,其中使用了最新版本的 AWS SDK for PHP,它将逐步指导您如何实施 GCM。

除此之外,初学者还可以使用此参考资料 - What is Amazon Simple Notification Service? 和 Getting Started with Amazon Simple Notification Service 了解更多信息。

【讨论】:

我创建了平台应用程序和端点,但是当我按照AWS SDK for PHP docs 中的指示发布消息时。如果不指定'MessageStructure' => 'json',它就无法正常工作。我最终为不同平台构建了具有不同属性的 JSON 格式的消息。在我看来,这是正确的做法。 这是 aws sns 的答案还是纪录片?

以上是关于AWS SNS 发布的消息未推送到设备的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS-Pinpoint 将通知推送到多个设备

设置 AWS SNS 以向 iOS 设备发送推送通知

如何在 aws sns 中注册 iOS 设备令牌以接收推送通知?

AWS - SNS 端点为 iOS 自行禁用 - Apple 设备(推送通知失败)

aws boto sns - 通过设备令牌获取 endpoint_arn

Git LFS 文件未推送到远程仓库