在 AppDelegate 中使用推送通知重定向视图

Posted

技术标签:

【中文标题】在 AppDelegate 中使用推送通知重定向视图【英文标题】:Redirect a View with Push Notification in AppDelegate 【发布时间】:2015-06-03 10:15:43 【问题描述】:

我的目标是编写一个代码,当用户收到推送通知时,我希望该用户被重定向到另一个视图。 如果用户带有推送通知,并且如果他首先被查看过控制器(欢迎主屏幕等(但未登录))

var rootViewController = self.window!.rootViewController as! ViewController
rootViewController.performSegueWithIdentifier("hospitalSegue", sender: self)

这几行代码可以正常工作,但是,如果用户在另一个视图控制器中(登录/登录/用户页面等),则这段代码不起作用并重定向。 我尝试了一切,但我仍然无法提出解决方案。我的最终目标是:

if let rootViewController = self.window!.rootViewController as? ViewController

    var rootView: UserViewController = UserViewController()

    if let window = self.window
        window.rootViewController = rootView
    

    rootViewController.performSegueWithIdentifier("hospitalSegue", sender: self)
    println(self.window?.rootViewController)

谁能给我一个想法?

【问题讨论】:

听起来是个好主意。您如何接收推送通知?也许您可以向我们概述您在 InterfaceBuilder 中的视图,这取决于您的层次结构,如何重定向到不同的视图。 您是否以模态方式显示UIViewController 使用 NSNotificationCenter。 developer.apple.com/library/mac/documentation/Cocoa/Reference/… 在应用程序委托(didReceiveRemoteNotification)中,引发本地通知,并通过注册到本地通知并检查是否存在屏幕上显示的视图控制器来显示另一个视图控制器。 @jeraldo 谢谢,我用 nsnotificationcenter 解决了! 【参考方案1】:

答案代码是Objective-C,我想说说逻辑。为此,在创建推送通知时,您必须设置 userInfo 值以通过推送通知传递数据。

使用这个委托方法:application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

您可以通过处理 userInfo 来决定是否要显示哪个视图

NSDictionary *segueDictionary = [userInfo valueForKey:@"aps"];

NSString *segueName=[[NSString alloc]initWithFormat:@"%@",[segueDictionary valueForKey:@"segueName"]];

if([segueName isEqualToString:@"hospitalSegue"]) 

// implement your code to redirect

【讨论】:

【参考方案2】:

答案代码是 Objective-C,您可以使用以下方法从应用委托中 prentviewcontroller 我是使用以下代码解决此问题:

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

      [[self topViewController]presentViewController:nav animated:YES    completion:nil];


- (UIViewController*)topViewController 
    return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController];


- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController 
    if ([rootViewController isKindOfClass:[UITabBarController class]]) 
        UITabBarController* tabBarController = (UITabBarController*)rootViewController;
        return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
     else if ([rootViewController isKindOfClass:[UINavigationController class]]) 
        UINavigationController* navigationController = (UINavigationController*)rootViewController;
        return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
     else if (rootViewController.presentedViewController) 
        UIViewController* presentedViewController = rootViewController.presentedViewController;
        return [self topViewControllerWithRootViewController:presentedViewController];
     else 
        return rootViewController;
    

【讨论】:

以上是关于在 AppDelegate 中使用推送通知重定向视图的主要内容,如果未能解决你的问题,请参考以下文章

重定向以查看 IOS 通知栏中的点击推送消息

单击时,Phonegap 推送通知重定向到应用程序中的特定页面

发送 Javascript 推送通知 - 在表单 POST 和 URL 重定向之后

Flutter - 推送通知单击重定向到特定屏幕不起作用

点击推送通知不会重定向到特定页面

单击推送通知时,正确重定向到选项卡栏导航控制器内的视图控制器