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

有很多关于这个主题的stackoverflow线程,但我仍然没有find一个好的解决scheme。

如果应用程序不在后台,我可以在application:didFinishLaunchingWithOptions:检查launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] application:didFinishLaunchingWithOptions:调用以查看是否从通知打开。

如果应用程序在后台,所有postbuild议使用application:didReceiveRemoteNotification:并检查应用程序状态。 但是,正如我试验(也作为这个API的名称build议),这个方法被调用时收到的通知,而不是轻拍。

所以问题是,如果应用程序启动,然后后台,并知道从application:didReceiveNotification接收通知application:didReceiveNotificationapplication:didFinishLaunchWithOptions:不会触发),你怎么知道用户是否恢复从应用程序点击通知或只是点击应用程序图标? 因为如果用户点击通知,则期望打开通知中提到的页面。 否则它不应该。

我可以使用handleActionWithIdentifier进行自定义动作通知,但是只有当自定义动作button被触发时才触发,而不是在用户点击通知主体时触发。

谢谢。

编辑:

在阅读下面的一个答案后,我想这样可以澄清我的问题:

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

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

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

由于application:didReceiveRemoteNotification:在步骤2中都触发了这两种情况。

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

好的,我终于明白了。

在目标设置➝function选项卡➝背景模式中,如果选中“远程通知”, application:didReceiveRemoteNotification:将在通知到达时立即触发(只要应用程序在后台),在这种情况下,告诉用户是否会点击通知的方式。

如果取消选中该框, application:didReceiveRemoteNotification:仅在您点击通知时触发。

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

希望这会对遇到这个问题的其他人有所帮助。 苹果公司在这里也没有明确logging,所以花了我一段时间才弄清楚。

在这里输入图像说明

我一直在寻找和你一样的东西,并且实际上find了一个不需要远程通知的解决scheme。

要检查用户是否已轻点,或者应用程序处于后台或处于活动状态,则只需检查其中的应用程序状态

 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ if(application.applicationState == UIApplicationStateActive) { //app is currently active, can update badges count here }else if(application.applicationState == UIApplicationStateBackground){ //app is in background, if content-available key of your notification is set to 1, poll to your backend to retrieve data and update your interface here }else if(application.applicationState == UIApplicationStateInactive){ //app is transitioning from background to foreground (user taps notification), do what you need when user taps here } 

更多信息请查看:

UIKit框架参考> UIApplication类参考> UIApplicationState

根据iOS / XCode:如何知道该应用程序已启动与点击通知或跳板应用程序图标? 你必须像这样在didReceiveLocalNotification中检查应用程序状态:

 if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive) { // user has tapped notification } else { // user opened app from app icon } 

虽然对我来说没有任何意义,但它似乎起作用。

如果有人想快速3.0

 switch application.applicationState { case .active: //app is currently active, can update badges count here break case .inactive: //app is transitioning from background to foreground (user taps notification), do what you need when user taps here break case .background: //app is in background, if content-available key of your notification is set to 1, poll to your backend to retrieve data and update your interface here break default: break } 

如果你有“背景模式”>“远程通知”选中== YES,点击通知事件将到达:

 -(void)userNotificationCenter:(UNUserNotificationCenter *)center **didReceiveNotificationResponse**:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler. 

它帮助了我。 请享受 :)

我也遇到了这个问题。 但在新的UserNotifications Framework的iOS 11上。

这里对我来说就是这样的:

  • 新推出: application:didFinishLaunchingWithOptions:
  • 在前台收到: application:didReceiveRemoteNotification:fetchCompletionHandler:
  • 在后台收到: userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:

您可以configuration您的推送通知的有效内容,以调用应用程序委托的application:didReceiveRemoteNotification:fetchCompletionHandler:方法,当应用程序在后台。 您可以在这里设置一些标志,以便用户下次启动应用程序时,您可以执行您的操作。

从苹果的文档,你应该使用这个方法来下载与推送通知相关的新内容。 此外,为了这个工作,你必须从后台模式启用远程通知,你的推送通知有效载荷必须包含content-available键,其值设置为1.更多信息,请参阅使用推送通知从苹果文档启动下载部分。

另一种方法是在推送通知有效载荷中使用徽章计数。 因此,下次您的应用程序启动时,您可以检查应用程序徽章数。 如果其大于零,则还要从服务器执行您的操作并清零徽章计数。

希望这可以帮助你。