关于" didReceiveRemoteNotification"委托功能

时间:2018-04-03 09:25:01

标签: ios objective-c apple-push-notifications

对于系统高于iOS 10版本的系统,在UNUserNotificationCenterDelegate中,有两种方法可以阐明是否从用户点击或系统收到消息来调用APNS消息方法:

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler

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

对于iOS 10版本下的系统,应用程序委托方法- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo存在问题,有3种方法可以调用此方法:

1:当应用程序在后台运行时单击通知消息,将调用此方法。

2:点击应用程序图标,应用程序在后台运行或被杀死,在App真正启动之前(大约1~3秒),在这几秒钟内如果收到APNS消息,也会调用此方法。

3:应用程序正在运行,下拉通知栏以使应用程序变为非活动状态,在此状态下如果收到APNS消息,也将调用此方法。

现在问题是,如何判断这3种点击?通常,如果用户没有点击消息进入应用程序(2和3的点击),应用程序就不应该执行此消息(比如打开基于消息信息的新页面)。但如何知道它是从2和3?

从下面的答案中,发现kind-2已经用applicationState解决了,而kind-3仍然没有回答,有谁知道如何修复它?

3 个答案:

答案 0 :(得分:0)

您可以使用UIApplication状态检查,如下所示:

///- if app is running in foreground
     if (application.applicationState == UIApplicationStateActive) {

         [self pushNotificationReceivedWhileActiveWithInfo:userInfo];

///- if app was running in background
     } else if (application.applicationState == UIApplicationStateBackground) {
        if (self.pushReceivedWhileClosed != YES) {
         [self pushNotificationReceivedWhileInBackgroundWithInfo:userInfo];
       }
     }

当应用程序完全关闭时,您需要通过保存通知数据从通知打开时从didFinishLaunchingWithOptions获取通知来处理通知,并在用户到达主屏幕时执行它,让我们说:

     ///- when receiving push notification while [app closed]
     if (launchOptions != nil) {
         NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
         if (dictionary != nil) {
             NSLog(@"[AppDelegate]##########################AppDelegate######################### Received notification while app CLOSED");

             ///- save the dictionary data and execute it when the app loads for example.
             self.pushReceivedWhileClosed = YES;
         }
     }

答案 1 :(得分:0)

检查应用程序didReceiveRemoteNotification

中的应用程序状态
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    if ( application.applicationState == UIApplicationStateInactive || application.applicationState == UIApplicationStateBackground  )
    {
         //app was on background
    }
}

答案 2 :(得分:0)

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

         NSMutableDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];


               if (userInfo != nil)
                {
                    comingFromNotification = YES;
                }else{
                    comingFromNotification = NO;
                }

}