0

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

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];


}

请帮助。任何帮助表示赞赏。

4

4 回答 4

1

推送通知有效负载包括:

alert - 警报字符串和操作

徽章

声音

内容可用

关键内容可用是一个新功能,正是这个关键使得无声推送成为可能。

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

当内容可用在有效负载中时会发生这种情况:

如果应用程序被暂停,系统会将其带入后台

如果应用程序被用户杀死,则不会发生任何事情并且应用程序仍处于未运行状态阅读有关应用程序状态更改的信息。

潜在的陷阱是:

您使用 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");
      }
    }

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

于 2016-08-03T07:08:54.050 回答
0

应用程序具有在特定情况下交付的通知数据。如果用户的交互与其中之一不一致,则数据不可用。没有例外。

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

注意:这个答案没有解释如何调用或处理任何场景。

于 2016-08-03T06:01:38.110 回答
0
application: didReceiveRemoteNotification:  

当操作系统接收到 RemoteNotification 并且应用程序正在运行(在后台/挂起或在前台)时调用。

application:(UIApplication *)application didFinishLaunchingWithOptions

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

1)当我的应用程序从后台删除并获得通知并点击应用程序图标时 -

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

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

2)你写的都是正确的。希望这会帮助你。

于 2016-08-03T05:54:38.290 回答
0

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 
    } 
 }
于 2016-08-03T06:24:37.273 回答