当前位置: 首页 > 知识库问答 >
问题:

如何知道应用程序何时收到通知,以及用户何时在iOS中单击通知

唐默
2023-03-14

我知道有很多关于这个话题的文章,但我就是找不到正确的答案。

有没有办法知道用户何时收到远程通知以及用户何时在iOS8上点击了一个。我想知道这一点,因为当我收到它时,我想保存它,当用户点击它时,我想打开一些视图。

我找到了这个答案https://stackoverflow.com/a/16393957/1241217但问题是,当用户在应用程序中打开通知中心并单击其中一个时,该应用程序既不处于非活动状态,也不在后台。

我也找到了这个答案https://stackoverflow.com/a/12937568/1241217但我知道,只有当应用程序被关闭并从新应用程序启动时,才会运行该应用程序。

我也不想这么做https://stackoverflow.com/a/32079458/1241217因为我需要检测何时收到通知。

那么有没有办法知道用户是否只点击了通知。据我所知,它必须在DidReceivereMotenofication中完成,但我不知道如何区分它们。我需要iOS 10之前的答案,因为应用目标是iOS 8。

我的解决方案:

因此,正如我在沙比尔·艾哈迈德的回复中所写,我的解决方案是记住申请生效的日期和收到通知的日期。如果这两个日期之间的差异是一秒或更少,我接受这一点,因为用户点击了通知。

共有2个答案

章阳波
2023-03-14

当您在ios 10之前的后台模式下单击通知时,以及当您在前台时,在这两种情况下,您下面的方法都会调用,

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)

为了区分行为,首先在AppDelegate类中指定一个布尔变量,如下所示:

class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?
  var isUserTapOnNotification = false

之后,在

func applicationWillEnterForeground(_ application: UIApplication) {
        isUserTapOnNotification = tue
    }

因为当您点击通知栏时,您的应用程序将出现在前台,应用程序将首先调用,之后您的didReceiveRemote teNotify将调用:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

  if #available(iOS 10.0, *) {
//do nothing

}else { //<ios 10
 if isUserTapOnNotification == true {//when app is in background and user tap on notification bar
  //do action whatever you want
} else { //when user is in foreground and notification came,
  //before ios10,notification bar not display in foreground mode,So you can show popup by using userInfo
}

}

之后,applicationIDBecomeActive将调用,您将isUserTapOnNotification重置为false,如下所示:

func applicationDidBecomeActive(_ application: UIApplication) {
       isUserTapOnNotification = false
    }

我希望这个答案能对你有所帮助。

胡桐
2023-03-14

您必须实现UnuseNotificationCenterDelegate及其方法userNotificationCenter(:willPresent:withCompletionHandler:)userNotificationCenter(u:didReceive:withCompletionHandler:),当用户点击通知时会调用它。在willPresent:中,你必须调用completionHandler,该选项将指示当应用程序位于前台时通知到达时应该发生什么。

注册这样的代表很容易:

UNUserNotificationCenter.current().delegate = self

因此,例如:

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    completionHandler(UNNotificationPresentationOptions.alert)
}

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    let userInfo = response.notification.request.content.userInfo
    if let userInfo = userInfo as? [String: Any] {
        // TODO: implement your logic
        // just don't forget to dispatch UI stuff on main thread
    }
}

您可以通过AppDelegate实现该委托,但也可以通过任何NSObject实现,我将使用后者来尽可能保持AppDelegate的干净。

附言:当然,这是假设用户已授予您权限(UNUserNotificationCenter.current()。requestAuthorization(选项:completionHandler:))并且您已注册以接受通知(UIApplication.shared.registerForRemoteNotifications())。

请阅读“调度和处理本地通知,响应通知传递”一节中的更多内容——虽然这一节是关于本地通知的,但远程通知的情况完全相同(它们都由同一个代理处理)。

 类似资料:
  • 我设计了这个应用程序,在Android和ios中使用反应原生,并使用raact原生fcm模块从服务器推送通知。在Android中,我们只从服务器发送数据有效载荷,它是在onMessageRec的()天气应用程序是在前台或最小化(后台)或杀死,然后我可以处理数据,以显示本地通知,这是做罚款。但在IOS中,我不知道在应用程序中收到的数据有效载荷,或者如果在IOS中,我发送通知有效载荷以及/没有数据有效

  • 问题内容: 我试图将我在教程中找到的一些代码转换为自己使用。最初,当用户单击我的应用程序生成的通知时,该代码启动了系统联系人列表。我正在尝试自己启动一个,而不是启动联系人列表,但是它不起作用。更具体地说,什么也没有发生。没有错误,我也不会加载。单击后,通知窗口消失,原始窗口仍然可见。 这是我的代码: 这是我在文件中的条目… 这是我要启动的… 问题答案: 我解决了这个问题。我忘记在清单文件的活动声明

  • 我想知道是否有办法知道一个应用程序(可以在后台关闭或打开)是否已经启动,只需单击: 通知(在通知中心)? 还是跳板上的应用程序图标? 谢谢

  • 我想模拟Gmail关于通知栏通知的应用程序行为,它符合推荐的Android模式:http://developer.Android.com/design/patterns/notifications.html 即特定于单个邮件的通知,点击该通知将显示该特定电子邮件的屏幕。如果我通过刷清或使用“清除所有”清除通知,那么当我得到一个新消息时,我将得到另一个消息特定的通知。但如果我没有清除它,而我又收到另

  • 关于这个主题有很多stackoverflow线程,但是我仍然没有找到一个好的解决方案。 如果应用程序不在后台,我可以在调用中检查,查看是否从通知中打开。 如果应用程序在后台,所有帖子都建议使用并检查应用程序状态。但正如我所做的实验(也正如这个API的名称所暗示的那样),当收到通知时会调用这个方法,而不是点击。 所以问题是,如果应用程序启动后后台运行,并且您知道从收到通知(此时不会触发),您如何知道

  • 我想在用户收到应用程序上的通知时自动启动应用程序。启动程序图标上不会有点击操作。