当应用程序完全关闭时,推送通知点击上的推送 ViewController 将不起作用

Posted

技术标签:

【中文标题】当应用程序完全关闭时,推送通知点击上的推送 ViewController 将不起作用【英文标题】:Push ViewController on Push Notification Tap Won't Work When App Is Completely Closed 【发布时间】:2015-09-08 23:54:44 【问题描述】:

我希望我的应用在用户点击收到的推送通知时推送 NewsViewController。在 didFinishLaunching 我有:

UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert |
                                                    UIUserNotificationTypeBadge |
                                                    UIUserNotificationTypeSound);

    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes
                                                                             categories:nil];

    [[UIApplication sharedApplication]
     registerUserNotificationSettings:settings];
    [application registerUserNotificationSettings:settings];
    [application registerForRemoteNotifications];

然后,仍然在 AppDelegate 中,我有:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
    [PFPush handlePush:userInfo];
    UINavigationController *nav = (UINavigationController *) self.tabBarController.selectedViewController;
    NewsViewController *dvController8 = [[NewsViewController alloc] initWithNibName:@"NewsViewController" bundle:[NSBundle mainBundle]];
    [nav pushViewController:dvController8 animated:YES];

    if (application.applicationState == UIApplicationStateInactive) 
        UIAlertView *test = [[UIAlertView alloc] initWithTitle:@"INACTIVE" message:@"INACTIVE" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [test show];

        [self handleRemoteNotificationWithPayload:userInfo];
    

-(void)handleRemoteNotificationWithPayload:(NSDictionary *)payload 
    UINavigationController *nav = (UINavigationController *) self.tabBarController.selectedViewController;
    NewsViewController *dvController8 = [[NewsViewController alloc] initWithNibName:@"NewsViewController" bundle:[NSBundle mainBundle]];
    [nav pushViewController:dvController8 animated:YES];




如果用户在应用打开时收到推送,它会转到 NewsViewController。如果当他们点击推送通知时应用程序正在后台运行,它会转到 NewsViewController。但是,如果用户已经从应用程序切换器完全关闭了应用程序,然后点击收到的通知,它会打开应用程序,而不会转到 NewsViewController。我该如何解决这个问题?

【问题讨论】:

如果您查看我之前提供的示例,它指出您还需要在application didFinishLaunchingWithOptions 中调用它,我猜您忽略了它。这是一个新手失礼,文档会帮助你。我建议你开始和它交朋友 @soulshined 你之前从来没有回复过。当也将其放入 didFinishLaunchingWithOptions 时,它会在每次首次启动应用程序时推送该视图控制器,而不仅仅是在收到推送时。 那你设置错了。您必须进行条件检查以查看应用程序是由 userInfo 打开还是刚刚打开。你可以通过说if (userInfo) 来做到这一点,这有意义吗? 这未包含在我的其他答案中。我很抱歉。它应该是给定的。再次。你学到的所有东西都准备好了文档。你真的应该开始做。而且我之前没有收到其他通知。 @soulshined 这一定是问题所在。设置推送通知的解析文档没有关于任何 userInfo 标识符。 【参考方案1】:

很抱歉造成混乱。这是您确定是通过通知 (userInfo) 还是仅通过图标交互打开已终止应用的方式:

-(BOOL)application(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
 ...
   NSDictionary *notificationPayload = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
  // Create a pointer to extract the userInfo
  [self handleRemoteNotificationWithPayload:notificationPayload];
...

在您的方法中,您可以通过简单的交叉引用来确定它是否通过有效负载打开:

-(void)handleRemoteNotificationWithPayload:(NSDictionary *)payload 
...
    if (payload) 
      //do something or get additional parameters from dictionary to segue alternate views
    
...

【讨论】:

以上是关于当应用程序完全关闭时,推送通知点击上的推送 ViewController 将不起作用的主要内容,如果未能解决你的问题,请参考以下文章

应用关闭时接收推送

推送通知打开一个新活动

推送通知无法正常工作,当应用程序在后台时,Swift

在Android中处理多个推送通知点击

当点击 FCM 推送通知时,如何在选项卡栏中打开特定的视图控制器?

向移动设备推送通知:SNS vs OneSignal vs GCM [关闭]