检测是否应用:didReceiveRemoteNotification:fetchCompletionHandler:通过点击Notification Center中的通知来调用

application: didReceiveRemoteNotification: fetchCompletionHandler: 

不同于

 application: didReceiveRemoteNotification: 

怎么样? 从文档:

与application:didReceiveRemoteNotification:方法不同,该方法仅在应用程序运行时调用,系统将调用此方法,而不pipe应用程序的状态如何。 如果您的应用程序被暂停或未运行,则在调用该方法之前,系统会唤醒或启动您的应用程序并将其置于后台运行状态。 如果用户从系统显示的警报中打开您的应用程序,则系统会再次调用此方法,以便您知道用户select了哪个通知。

我的努力是:我想知道用户是否通过点击通知中心的系统显示警报或者唤醒设备的静默推送通知来调用方法。 目前,据我所知,没有明显的区分办法。

 - (BOOL)application: didFinishLaunchingWithOptions: 

跟踪上述方法中的launchOptions不是一个解决scheme,因为只有当应用程序被挂起/不在后台运行时才被调用。 如果它在后台运行,它不会被调用。

苹果文档有点混乱

 application: didReceiveRemoteNotification: fetchCompletionHandler: 

如果你的应用程序支持远程通知的背景模式(即你在做BackgroundFetch)

 application: didReceiveRemoteNotification: 

当操作系统收到RemoteNotification并且应用程序正在运行时(在后台/挂起或在前台运行)。
您可以检查UIApplicationState,以查看应用程序是由用户带到前台(点击通知)还是在通知进入时已经运行。

 - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { UIApplicationState state = [application applicationState]; // user tapped notification while app was in background if (state == UIApplicationStateInactive || state == UIApplicationStateBackground) { // go to screen relevant to Notification content } else { // App is in UIApplicationStateActive (running in foreground) // perhaps show an UIAlertView } } 

您可以检查UIApplicationapplicationState以区分无声呼叫与用户正在使用的应用程序进行的呼叫:

 typedef enum : NSInteger { UIApplicationStateActive, UIApplicationStateInactive, UIApplicationStateBackground } UIApplicationState; 

或者在delegateapplicationDidEnterBackground:上保留自己的标志applicationDidEnterBackground:

应用程序状态是不可靠的,因为如果你有控制中心或苹果的通知中心打开你的应用程序,应用程序:didReceiveRemoteNotification:fetchCompletionHandler:将被调用,应用程序状态将是非活动的。

我有同样的问题,试图响应点击通知,而应用程序在后台,似乎并没有一个可靠的方法来完全确定这一点。

application: didReceiveRemoteNotification:fetchCompletionHandler:方法被称为应用程序状态是UIApplicationStateInactive如果用户点击警报(在这种情况下,你想准备一些用户界面),当应用程序被静默唤醒(在这种情况下,你只是加载一些数据) UIApplicationStateBackground

我不确定我是否理解你的问题。

你想区分无声推送通知后台获取和嘈杂的推送通知吗? 您可以简单地检查推送通知字典是否包含“content-available”键: [[userInfo objectForKey:@"aps"] objectForKey:@"content-available"]如果是,则应该是无声推送。 如果没有,这是一个正常的推动。

你想知道当应用程序收到通知并且处于挂起/未运行状态时是否调用了后台获取方法? 如果是这样,您可以执行以下操作:

  • 下载并将LumberJack导入您的应用程序。 查看方向并学习如何设置,以便将日志保存到磁盘。
  • 把它放在你想查看是否/何时调用该方法的任何方法中:

    • DDLogDebug(@"%@ - %@",NSStringFromSelector(_cmd),NSStringFromClass([self class]));

    这会将类和方法打印到日志文件中。

  • 将自己的推送通知发送到启用了后台获取的应用程序后,检查日志文件,然后查看是否有任何方法通过查看日志文件进行调用。

如果您已经正确设置了您的应用程序以进行后台提取,则application: didReceiveRemoteNotification: fetchCompletionHandler:即使在应用程序有后台/未运行时也会被调用(如果您收到推送通知(静默推送或不推送))。

在迅速的情况下

 func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { let state : UIApplicationState = application.applicationState if (state == .Inactive || state == .Background) { // go to screen relevant to Notification content } else { // App is in UIApplicationStateActive (running in foreground) } }