这是我问的新问题,因为我还没有得到任何答案。
我正在使用亚马逊SNS Push向我注册的设备发送推送,一切都很好,我可以在我的应用程序上注册设备,可以发送推送等。我面临的问题是,当我通过推送打开我的应用程序时,我想打开一个特定的页面。我想发送一些额外的有效载荷参数,但我不能这样做。
我试过这个链接:-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");
}
}
}
}
?>
任何帮助或想法将不胜感激。提前感谢。
我太没有经验了,无法在这里发表评论,但我想提请人们注意嵌套的json_encode。这很重要,没有它,亚马逊将不会解析APNS字符串,并且只会发送默认消息值。
我正在做以下事情:
$message = json_encode(array(
'default'=>$msg,
'APNS'=>array(
'aps'=>array(
'alert'=>$msg,
'sound'=>'default'
),
'id'=>$id,
'other'=>$other
)
)
);
但这不起作用。您必须单独json_encode'APNS'下的数组,如felixdv的回答所示。不要问我为什么,因为输出在我的控制台日志中看起来完全相同。尽管文档显示'APNS'键下的json字符串应该包装在""中,所以怀疑这与它有关。
http://docs.aws.amazon.com/sns/latest/dg/mobile-push-send-custommessage.html
但是不要被愚弄,因为JSON将在没有这些双引号的情况下很好地验证。
我也不确定埃克曼的评论。如果不将上述结构中的“默认”密钥发送到单个终端节点 ARN,我将收到来自 AWS 的错误。
希望能加速某人的下午。
编辑
随后清除了嵌套json_encodes的需要——它创建了转义双引号,尽管文档说在API中不需要它们,但它们是用于GCM的整个字符串,并且在苹果的APNS下的子数组之上。这可能是我的实现,但它几乎是使用AWS PHP SDK的现成产品,也是让它发送自定义数据的唯一方法。
从Lambda函数(Node.js)调用应该是:
exports.handler = function(event, context) {
var params = {
'TargetArn' : $EndpointArn,
'MessageStructure' : 'json',
'Message' : JSON.stringify({
'default' : $title,
'APNS' : JSON.stringify({
'aps' : {
'alert' : $title,
'badge' : '0',
'sound' : 'default'
},
'id' : '123',
's' : 'section',
}),
'APNS_SANDBOX' : JSON.stringify({
'aps' : {
'alert' : $title,
'badge' : '0',
'sound' : 'default'
},
'id' : '123',
's' : 'section',
})
})
};
var sns = new AWS.SNS({apiVersion: '2010-03-31', region: 'us-east-1' });
sns.publish(params, function(err, data) {
if (err) {
// Error
context.fail(err);
}
else {
// Success
context.succeed();
}
});
}
您可以通过只指定一个协议来简化:APNS
或APNS_SANDBOX
。
这里仍然缺少Amazon SNS留档,关于如何格式化消息以使用自定义有效负载的指针很少。本常见问题解答解释了如何做到这一点,但没有提供示例。
解决方案是使用设置为json
的消息结构
参数和json编码的消息
参数发布通知,每个传输协议都有一个密钥。作为后备,总是需要一个默认
键。
这是使用自定义负载的iOS通知的示例:
array(
'TargetArn' => $EndpointArn,
'MessageStructure' => 'json',
'Message' => json_encode(array(
'default' => $title,
'APNS' => json_encode(array(
'aps' => array(
'alert' => $title,
),
// Custom payload parameters can go here
'id' => '123',
's' => 'section'
))
))
);
其他协议也是如此。json_encoded消息的格式必须如下(但如果不使用传输,可以省略键):
{
"default": "<enter your message here>",
"email": "<enter your message here>",
"sqs": "<enter your message here>",
"http": "<enter your message here>",
"https": "<enter your message here>",
"sms": "<enter your message here>",
"APNS": "{\"aps\":{\"alert\": \"<message>\",\"sound\":\"default\"} }",
"APNS_SANDBOX": "{\"aps\":{\"alert\": \"<message>\",\"sound\":\"default\"} }",
"GCM": "{ \"data\": { \"message\": \"<message>\" } }",
"ADM": "{ \"data\": { \"message\": \"<message>\" } }"
}
问题内容: 我只想知道如何确定在无提示推送中要执行的操作: 这是我发送给客户的: 现在的问题是,当我添加以确定静默推送是为了让“订单更新”显示警报通知时。 问题答案: 有一些选择!让我们花点时间了解所有不同的有效负载及其用法。 简单有效载荷 显示在通知中心:是 唤醒应用以执行后台任务:否 带有自定义通知声音的有效负载 显示在通知中心:是 唤醒应用以执行后台任务:否 :在您的应用程序包中添加自定义通
我已经在华为AppGallery上发布了一个Android应用程序,并且能够通过HMS推送服务从我的应用程序后端服务器向手机发送推送通知,如下所述。 不过,不知如何访问App中的推送通知有效载荷: 下面是我当前发送推送通知的方式- 以下URL编码的正文: 值所在的位置(我不确定它是否具有正确的JSON结构以及“type”3的真正含义): 我需要提取自定义整数“GID”值(我的应用程序中的“游戏ID
如何通过Azure从我的UWP-App向不同设备上的应用程序的其他实例发送推送通知? 以下是注册设备以接收推送的说明。(这是可行的)第二部分是关于如何在控制台应用程序上发送推送(这也是可行的)https://azure.microsoft.com/en-us/documentation/articles/notification-hubs-windows-store-dotnet-get-star
我正在工作的谷歌Chrome推送通知,我正在尝试发送有效负载到谷歌Chrome工作者,但我不知道我如何接收这个有效负载。 我有一个API可以在数据库中创建和保存通知,我需要通过发送值,并在worker.js上接收 这是我的工作人员。JS 我就是这么叫GCM的 我试图获取,但这是未定义的。 有人有什么想法或建议吗?
这是舱单 这是我的注册令牌类 这是我的Firebase服务类
我正在尝试使用Azure通知中心向客户端发送推送通知。我读了这篇文章,它使用标签来识别每个用户。 https://azure.microsoft.com/en-us/documentation/articles/notification-hubs-aspnet-backend-windows-dotnet-notify-users/ 它可以完成这项工作,但标记的数量有限。我正在考虑存储和使用中心返