Phonegap-Pushplugin:在 iOS 中处理通知的点击事件
Posted
技术标签:
【中文标题】Phonegap-Pushplugin:在 iOS 中处理通知的点击事件【英文标题】:Phonegap-Pushplugin: Handling click event on notification in iOS 【发布时间】:2017-09-20 06:06:10 【问题描述】:预期行为: 点击通知后触发事件。 实际行为:
pushObject.on('notification').subscribe((notification: any) =>
被触发 当应用程序处于前台时,一旦通知到达。 客户端代码如下:
const options: PushOptions =
ios:
alert: 'true',
badge: true,
sound: 'false'
,
;
const pushObject: PushObject = this.push.init(options);
pushObject.on('notification').subscribe((notification: any) => console.log('Received a notification', notification));
pushObject.on('registration').subscribe((registration: any) => console.log('Device registered', registration));
pushObject.on('error').subscribe(error => console.error('Error with Push plugin', error));
服务器端负载示例:
"aps":
"alert": "Testing.. (15)",
"badge": 1,
"sound": "default",
"content-available": 1
问题解释:当应用程序一收到通知就在前台时
pushObject.on('notification').subscribe((notification: any) =>
方法正在被调用。它不是等待用户点击通知。在我的应用程序中,我将根据通知中的有效负载数据导航到某个页面。
现在由于该功能的立即触发,虽然用户在某个页面的中间,但在收到通知后他会立即重定向到某个页面。
我希望用户点击通知,然后才点击
pushObject.on('notification').subscribe((notification: any) =>
方法应该被触发。提前致谢。
【问题讨论】:
看起来这是插件本身的预期行为github.com/phonegap/phonegap-plugin-push/blob/master/docs/… 但是如果用户在应用中打开了某个页面并且收到了通知,那么他将立即被重定向到另一个页面。所以我需要控制功能的立即触发。有什么办法吗? 【参考方案1】:您可以检查通知负载上的 .additionalData.foreground 属性,并且仅在值为 false 时触发应用内行为。当用户点击通知时,您的应用程序将被带到前台。该属性是关于在设备上收到通知时应用是否在前台。
如果您的应用在您的设备上收到通知时处于前台,则 ui 通知本身(在系统通知托盘中)将被抑制(在大多数情况下 - 您可以通过以下方式强制显示通知)您的应用程序在前台,但这是一个不同的主题)。
如果当您的应用收到通知时此属性为 false,则表示您的应用在设备上收到通知时处于后台。当用户单击通知启动或激活您的应用时就是这种情况,我认为这是“普通”情况。
以上内容并未涵盖所有情况;可以在此处找到有关确切行为的更多详细信息https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/PAYLOAD.md#push-message-arrives-with-app-in-foreground
不幸的是,有一种情况在 IOS 11 中没有得到很好的处理,即:如果您的应用在前台,但在收到通知时设备处于睡眠/关闭状态。唤醒设备时,您的应用程序仍处于前台。用户拉下通知列表并单击“旧”通知。在这种情况下,additionalData.foreground 属性将为 true。
在 IOS 10 和更早的版本中,该前景属性在最后一种情况下设置为 false,这意味着您可以依靠它来区分被点击的通知。
我(还)不确定如何区分这些情况(如何知道用户是否真的点击了通知)。
【讨论】:
我最终使用了一个 hack:检查通知的传递时间 - 如果 .foreground 为真,但 now() - 传递时间 > 超过某个合理的量(1 分钟?)我们可以假设用户点击了通知。它并不完美,但处理了常见情况。我真的不明白为什么移动推送通知 API 不给我们一个简单的 notificationClicked 事件!以上是关于Phonegap-Pushplugin:在 iOS 中处理通知的点击事件的主要内容,如果未能解决你的问题,请参考以下文章
iOS - NSInternalInconsistencyException 在 iOS 9 和 10 上发生,但在 iOS 11 上运行良好
iOS 纵横比约束在 iOS 7 上中断,适用于 iOS 8