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 上运行良好

iOS8 扩展 - 在 iOS 5/6/7 上会发生啥?

如何在 iOS 4 上运行 iOS 5/ARC 项目

iOS 纵横比约束在 iOS 7 上中断,适用于 iOS 8

iOS 5 MapKit,MKPlacemark,在 iOS 5 上运行 iOS 4.3 应用程序

[iOS] 在 ios10 中使用 imessage