收到通知后,我如何才能在应用程序图标点击时获取有效负载?

After Receiving Notification how can i can get payload on app icon click?

我的推送通知在正常情况下工作正常,但我遇到以下情况的问题:

1) 当我的应用程序从后台删除并收到通知并点击应用程序图标时,我想推送视图控制器并在该视图控制器中显示有效负载数据。

2 ) 当我的应用程序在后台并收到通知并点击应用程序图标时,我想推送视图控制器并在该视图控制器中显示有效负载数据。

以下是我的用户信息

{
    aps =     {
        alert = "Call from rohan panchal";
        appointmentId = 220;
        badge = 0;
        "call_token" = "T1==cGFydG5lcl9pZD00NTI1ODY1MiZzaWc9MzM1MmM0M2E2MjkwN2JiYWMzNjgyNjk0MjFlZWMyNWEzNTZmZmM3MjpzZXNzaW9uX2lkPTJfTVg0ME5USTFPRFkxTW41LU1UUTNNREl3TVRBd01qVXdOWDV3WXpCRFMyWTRlR2xhUWpGdU1YbFpNamhvV0hoNFVHTi1VSDQmY3JlYXRlX3RpbWU9MTQ3MDIwMTAwMiZyb2xlPXB1Ymxpc2hlciZub25jZT0xNDcwMjAxMDAyLjUyMDM0NDAzNjQzMjMmZXhwaXJlX3RpbWU9MTQ3MDgwNTgwMg==";
        doctorId = 238;
        "doctor_country" = US;
        "doctor_name" = "John smith";
        patientId = 239;
        "patient_country" = US;
        "patient_name" = "Lottry patel";
        sessionId = "2_MX40NTI1ODY1Mn5-MTQ3MDIwMTAwMjUwNX5wYzBDS2Y4eGlaQjFuMXlZMjhoWHh4UGN-UH4";
        sound = default;
    };
}

遵循我的代码。

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

// when i remove app from background & click on notification then following code run.
        NSDictionary *notificationPayload = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];

        if(notificationPayload)
        {
               NSLog(@"%@",notificationPayload);  
              WebViewController *DashBoard = [[WebViewController alloc]initWithNibName:@"WebViewController" bundle:nil];
              self.navcntrl=[[UINavigationController alloc]initWithRootViewController:DashBoard];

        }

        else
        {

              DoctorMenuViewController *DoctorVC = [[DoctorMenuViewController alloc]initWithNibName:@"DoctorMenuViewController" bundle:nil];
             self.navcntrl=[[UINavigationController alloc]initWithRootViewController:DoctorVC];
        }

}

当我收到通知后调用了以下方法。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{

    NSLog(@"%@",userInfo);

     WebViewController *DashBoard = [[WebViewController alloc]initWithNibName:@"WebViewController" bundle:nil];

     [self.navcntrl pushViewController:DashBoard animated:YES];


}

请help.Any帮助感谢。

application: didReceiveRemoteNotification:  

在 OS 收到 RemoteNotification 且应用程序 运行(在 background/suspended 或前台。)时调用。

application:(UIApplication *)application didFinishLaunchingWithOptions

当应用程序不是 运行 并且您单击应用程序图标时调用。

1) 当我的应用程序从后台移除并收到通知并点击应用程序图标时 -

TestViewController *testVC = your_test_vc;
UINavigationController *navVC = [[UINavigationController alloc]initWithRootViewController:testVC];

在 TestViewController 中,您可以推送控制器以显示负载数据。

2) 你写的都是对的。 希望对您有所帮助。

应用程序会在一组特定情况下传送通知数据。如果用户的交互与其中之一不一致,则数据不可用。无一例外。

  1. 用户点击通知横幅(或警报)。该应用程序是否 运行 并不重要。
  2. 负载将 content-available 字段设置为真值, iOS 选择传递通知。

注意:此答案未解释如何调用或处理任何场景。

userinfo 中的字段值是您需要的

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
   UIApplicationState state = [[UIApplication sharedApplication] applicationState]; 
   if (state == UIApplicationStateBackground || state == UIApplicationStateInactive)
    {      //notification is received when your app is in background
          //open the view controller you expected
    }
    else if(state == UIApplicationStateActive)
    { 
      //notification is received when your app is in foreground 
      //do nothing 
    } 
 }

推送通知负载包括:

alert - 警报字符串和操作

徽章

声音

可用内容

content-available这个key是一个新特性,正是这个key让静默推送成为可能。

要启用,您还必须按照此处所述将远程通知添加为您的应用程序 UIBackgroundModes。

这是有效负载中包含可用内容时发生的情况:

如果应用被挂起,系统会将其带入后台

如果应用程序被用户终止,则不会发生任何事情,应用程序将保留在 Not 运行 了解应用状态变化。

潜力即陷阱:

您使用 content-available=1 启用。但是,禁用 content-available=0 是错误的。要禁用,您必须删除有效负载中的密钥。

请使用这个

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    {
       if(application.applicationState == UIApplicationStateInactive) 
    {
           NSLog(@"Inactive");

       //do your things when you click on notification
    }
    else if (application.applicationState == UIApplicationStateBackground)
     {

                    NSLog(@"Background");


    }
      else if (application.applicationState == UIApplicationStateActive)
      {
      NSLog(@"Active");
      }
    }

有关更多信息,请阅读此 link http://samwize.com/2015/08/07/how-to-handle-remote-notification-with-background-mode-enabled/