一尘不染

iOS推送通知:当应用程序在后台运行时,如何检测用户是否轻按了通知?

swift

关于此主题,有很多stackoverflow线程,但是我仍然
没有找到一个好的解决方案。

如果该应用程序不在后台,则可以签
launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]入
application:didFinishLaunchingWithOptions:呼叫以查看是否已从
通知中打开该应用程序。

如果应用程序在后台运行,则所有帖子都建议使用
application:didReceiveRemoteNotification:并检查应用程序状态。
但是,正如我进行的实验(以及该API的名称所暗示的那样),该方法
在收到通知时被调用,而不是被窃听。

所以问题是,如果启动了应用程序,然后将其后台运行,并且您知道
收到了通知application:didReceiveNotification
(此时application:didFinishLaunchWithOptions:将不会触发),那么
您如何知道用户是否通过轻按通知或只是
轻按应用程序图标?因为如果用户点击通知,则
期望打开该通知中提到的页面。否则不
应该。

我可以将其handleActionWithIdentifier用于自定义操作通知,但这
仅在点击自定义操作按钮时触发,而不是在
用户点击通知主体时触发。

谢谢。

编辑:

在阅读下面的一个答案之后,我想我可以以此方式澄清我的
问题:

我们如何区分这两种情况:

(A)1.app进入后台;2.收到通知;3.用户点击
通知;4.应用进入前台

(B)1.app进入后台;2.收到通知;3.用户忽略该
通知,稍后点击应用程序图标;4.应用进入前台

由于application:didReceiveRemoteNotification:触发在这两种情况下
,在第2步。

或者,应该application:didReceiveRemoteNotification:仅在步骤3中
为(A)触发,但是我以某种方式配置了我的应用程序错误,因此我在步骤
2中看到了它?


阅读 193

收藏
2020-07-07

共1个答案

一尘不染

好吧,我终于想通了。

在目标设置➝功能选项卡➝后台模式中,如果选中
“远程通知”,application:didReceiveRemoteNotification:则
在通知到达时(只要应用程序处于
后台)就会被触发,在这种情况下,无法判断是否用户将
点击通知。

如果您取消选中该框,application:didReceiveRemoteNotification:则
只有在您点击通知时才会被触发。

选中此框将更改应用程序
委托方法之一的行为,这有点奇怪。如果选中该框会更好,Apple使用
两种不同的委托方法进行通知接收和通知点击。
我认为大多数开发人员总是想知道是否使用了通知

希望这对遇到此问题的其他人有所帮助。苹果在这里
也没有清楚地记录下来

所以花了我一段时间才弄清楚。

2020-07-07