这是一个新的问题,我问,因为我还没有得到它的任何答案。
我正在使用亚马逊SNS推送发送推送到我注册的设备,一切都很好,我可以在我的应用程序上注册设备第一次启动,可以发送推送等我面临的问题是,我想打开一个特定的页面,当我打开我的应用程序通过推送。我想发送一些额外的参数与有效载荷,但我不能做到这一点。
我尝试了此链接:-http://docs.aws.amazon.com/sns/latest/api/API_Publish.html
我们只有一个密钥,即“消息”,据我所知,我们可以在其中传递有效载荷。
我想传递一个有效载荷像这样:-
{
aps = {
alert = "My Push text Msg";
};
"id" = "123",
"s" = "section"
}
或任何其他格式都可以,我只是想传递2-3个值沿着有效载荷,以便我可以在我的应用程序中使用它们。
我使用的代码发送推是:-
// Load the AWS SDK for PHP
if($_REQUEST)
{
$title=$_REQUEST["push_text"];
if($title!="")
{
require 'aws-sdk.phar';
// Create a new Amazon SNS client
$sns = Aws\Sns\SnsClient::factory(array(
'key' => '...',
'secret' => '...',
'region' => 'us-east-1'
));
// Get and display the platform applications
//print("List All Platform Applications:\n");
$Model1 = $sns->listPlatformApplications();
print("\n</br></br>");*/
// Get the Arn of the first application
$AppArn = $Model1['PlatformApplications'][0]['PlatformApplicationArn'];
// Get the application's endpoints
$Model2 = $sns->listEndpointsByPlatformApplication(array('PlatformApplicationArn' => $AppArn));
// Display all of the endpoints for the first application
//print("List All Endpoints for First App:\n");
foreach ($Model2['Endpoints'] as $Endpoint)
{
$EndpointArn = $Endpoint['EndpointArn'];
//print($EndpointArn . "\n");
}
//print("\n</br></br>");
// Send a message to each endpoint
//print("Send Message to all Endpoints:\n");
foreach ($Model2['Endpoints'] as $Endpoint)
{
$EndpointArn = $Endpoint['EndpointArn'];
try
{
$sns->publish(array('Message' => $title,
'TargetArn' => $EndpointArn));
//print($EndpointArn . " - Succeeded!\n");
}
catch (Exception $e)
{
//print($EndpointArn . " - Failed: " . $e->getMessage() . "!\n");
}
}
}
}
?>
4条答案
按热度按时间biswetbf1#
亚马逊SNS文档在这里仍然缺乏,很少有关于如何格式化消息以使用自定义有效负载的指示。本FAQ解释了如何做,但没有提供示例。
解决方案是发布通知,将
MessageStructure
参数设置为json
,并使用JSON编码的Message
参数,每个传输协议都有一个密钥。以下是具有自定义有效负载的iOS通知示例:
其他协议也是如此,json_encoded消息的格式必须如下(但如果不使用传输,可以省略键):
uplii1fm2#
从Lambda函数(Node.js)调用应为:
您可以通过仅指定一个协议来简化:
APNS
或APNS_SANDBOX
。kq4fsx7k3#
我太缺乏经验,无法在此发表评论,但我想提请大家注意嵌套的json_encode。这一点很重要,没有它,亚马逊将无法解析APNS字符串,它将只发送默认消息值。
我正在做以下事情:
但是这样不行。你必须像felixdv的回答中所示的那样分别对'APNS'下的数组进行json_encode。不要问我为什么,因为输出在我的控制台日志中看起来完全一样。虽然文档显示'APNS'键下的json字符串应该用“” Package ,所以怀疑这与此有关。
http://docs.aws.amazon.com/sns/latest/dg/mobile-push-send-custommessage.html
但是不要被愚弄了,因为JSON没有这些双引号也能很好地验证。
我也不确定emkman的评论,如果上面的结构中没有“default”键被发送到一个端点ARN,我会从AWS收到一个错误。
希望这能加快一些人的下午。
编辑
随后清除了嵌套json_encodes的需要-它创建了转义双引号,尽管文档中说API不需要,但对于GCM来说,它们是整个字符串的引号,对于苹果来说,这可能是我的实现,但它使用AWS PHP SDK几乎是开箱即用的,并且是使其发送自定义数据的唯一方法。
ekqde3dh4#
容易忽略的是,您需要添加APNS_SANDBOX以及APNS进行本地测试。