请注意,当 ionic push 仍处于 alpha 阶段时,我正在写这篇博文。我在这里讨论的一切都可能在 1.0 发布之前发生变化。请谨慎使用以下代码。 ionic 的推送功能的一个更有趣的功能是能够识别带有状态数据的推送消息。您可以制作一个推送数据包,其中不仅包含状态值,还包含状态参数。这在 常见问题解答 中讨论:
我希望我的应用程序在收到通知时打开到特定状态。
除了在此处描述的 onnotification 函数中处理此问题之外,您还可以指定通知应打开您的应用程序以使用推送有效负载的 $state。下面是一个突出显示这一点的示例 json 对象。
{
"tokens":["1f0ab62df8b5c672653dea8b01d1bab4dc1b15da93f99216b5ba0f621692a89f"],
"notification": {
"alert": "basic push!",
"ios":{
"priority": 10,
"badge":2,
"payload":{ "$state": "about", "$stateparams": "{\"id\": 1}" }
}
}
}
这很好用,但是我在玩它的时候遇到了一些陷阱,所以我想我会写一个它的快速演示来帮助其他人。对于我的演示,我使用默认选项卡创建了一个新的离子项目。然后我按照 快速入门 中的说明进行推送设置。可能会立即让您感到困惑的一件事是,您必须确保您的应用程序 始终 运行推送注册调用。快速入门指南让您构建一个演示,其中仅在按下按钮时才运行注册。在某些情况下,这可能是有道理的。您可能并不 总是 想注册推送通知。尽管您很可能会这样做。所以首先,这是我修改后的 run() 块,来自 app.js,其中包括推送注册。
{
"tokens":["1f0ab62df8b5c672653dea8b01d1bab4dc1b15da93f99216b5ba0f621692a89f"],
"notification": {
"alert": "basic push!",
"ios":{
"priority": 10,
"badge":2,
"payload":{ "$state": "about", "$stateparams": "{\"id\": 1}" }
}
}
}
我还想指出两个重要的设置。首先,您可能希望
canshowalert
为假。如果没有,那么每个通知都会在您的应用程序中触发警报。您的应用很可能会以不同的方式响应通知。有时有对话,有时没有,但可能并不
总是
这样或那样。其次,要真正启用“响应某某状态”,您需要将
canrunactionsonwake
设置为 true。
太酷了——快到了。然后我通过 curl 创建一个包含状态信息的推送通知。标签应用程序包含一个名为 tags.chat 的状态,因此我决定将其用作我的“目标”:
curl -u appkeythingy: -h "content-type: application/json" -h "x-ionic-application-id: 6aef0d7b" https://push.ionic.io/api/v1/push -d '{"tokens": ["a device token"],"notification":{"alert":"ray","ios":{"payload":{"$state":"tab.chats"}}}}'
在制作通知的 json 时要小心。服务器非常善于发现错误,但不止一次我把这部分搞砸了。请注意,您在有效负载部分中包含了状态信息。另请注意,我也没有费心发送状态参数。
所以……这成功了!这很酷!然后我再次测试但失败了。悲伤的小猫。为什么?您是否注意到寄存器中的首选项是
canrunactionsonwake
?特别是——“onwake”。所以这个功能只有在应用程序被唤醒时才会自动工作——如果它处于活动状态则不会。
如果您考虑一下,那是有道理的。作为用户,我不希望应用程序在收到通知时自动转移焦点。但是,您可能想知道如何处理这个问题。我修改了我的通知处理程序以添加一些新逻辑 - 只是为了这个:
{
"tokens":["1f0ab62df8b5c672653dea8b01d1bab4dc1b15da93f99216b5ba0f621692a89f"],
"notification": {
"alert": "basic push!",
"ios":{
"priority": 10,
"badge":2,
"payload":{ "$state": "about", "$stateparams": "{\"id\": 1}" }
}
}
}
修改很简单。我添加了 对话框 插件,然后在我的处理程序中使用它。如果我看到 $state 参数,我只是询问用户是否要查看聊天记录。如果他们说是,我就切换到它。
现在——要明确——我的逻辑可能更严格一些。我实际上并没有看 $state 值。我应该看看它是否存在 , 如果是 tabs.chat,但你明白了。这是在行动:
您可以在此处获取完整的源代码:https: //github.com/cfjedimaster/cordova-examples/tree/master/push2 。