关于这个话题有很多stackoverflow线程,但我仍然没有找到一个好的解决方案.

如果这个应用程序不在后台,我可以判断launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]inapplication:didFinishLaunchingWithOptions:呼叫,看看它是否是从通知中打开的.

如果应用程序在后台,所有帖子都建议使用application:didReceiveRemoteNotification:并判断应用程序状态.但正如我试验过的(正如此API的名称所暗示的那样),此方法在收到通知时调用,而不是点击.

所以问题是,如果这个应用程序启动,然后退出,你知道收到了来自application:didReceiveNotification的通知(此时application:didFinishLaunchWithOptions:不会触发),你怎么知道用户是通过点击通知还是仅仅点击应用程序图标来恢复应用程序呢?因为如果用户点击通知,预期会打开该通知中提到的页面.否则就不应该了.

我可以使用handleActionWithIdentifier表示自定义操作通知,但这只在点击自定义操作按钮时触发,而不是在用户点击通知正文时触发.

谢谢.

编辑:

在阅读了下面的一个答案后,我想通过这种方式我可以澄清我的问题:

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

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

(B)1、APP进入后台;2、收到通知;3、用户忽略通知,稍后点击APP图标;4、APP进入前台

因为在步骤2中在两种情况下都触发application:didReceiveRemoteNotification:.

或者,是否应该在步骤3中仅为(A)触发application:didReceiveRemoteNotification:,但是我不知何故配置了错误的应用程序,所以我在步骤2中看到了它?

推荐答案

好吧,我终于明白了.

在目标设置➝Capability选项卡➝后台模式中,如果你勾选"远程通知",通知一到就会被触发(只要应用程序在后台),在这种情况下,没有办法判断用户是否会点击通知.

如果取消选中该框,则仅当您轻触通知时才会触发application:didReceiveRemoteNotification:.

有点奇怪的是,选中此框会改变其中一个应用程序委托方法的行为方式.如果选中该框会更好,因为Apple使用两种不同代理方法来接收通知和分流通知.我认为大多数开发人员总是想知道通知是否被点击.

希望这将对遇到这个问题的任何其他人有所帮助.苹果也没有清楚地记录here,所以我花了一段时间才弄明白.

enter image description here

Ios相关问答推荐

连接一些字符串,每个字符串都应该可以在swiftUI中单独点击

React Native Text组件内部TextInput组件在iOS上的问题:在TextInput组件内部键入文本时失go 焦点

在选项卡内列出导航内视图断开导航标题的动画

SwiftUI图表-默认情况下,X轴数据点的间距不相等

在滚动视图中固定页眉,但在页眉上方嵌入元素

在flatter_riverpod中,如果没有ref对象,我们如何访问提供程序?

如何在@AppStorage中存储字体?

Swift:判断 Foundation (NS)Errors 与自定义协议的一致性

如何以编程方式触发 SwiftUI DatePicker?

SwiftUI withAnimation 在视图出现之前不会启动

SwiftUI:通过Sheet将数据添加到Realm DB时视图不更新

在所有 tableview / collectionview 中禁用滚动指示器

满足条件时 SwiftUI 动画背景 colored颜色 变化

@Environment 的存在会导致列表在滚动时不断重建其内容

async/await、Task 和 [weak self]

在 Swift 中禁用向后滑动手势

刷新由 Xcode 7 管理的团队配置文件中的设备?

如何缩小 UIImage 并使其同时变得清晰/锐利而不是模糊?

iOS 7 圆形框架按钮

如果我的分发证书过期会怎样?