• 本地推送通知页面跳转


    本地推送通知页面跳转

    无论应用是在前台,后台还是已经关闭都能如期接收到本地通知,但是当用户点击通知进入应用的时候,我们需要根据不同情况,进行处理

    AppDelegate本地通知代理方法

    
    /**
     *  一旦接收到本地通知就会调用该方法
     *  注意这个方法:应用在前台也会调用
     *  @param application  应用
     *  @param notification 本地通知对象
     */
    - (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
    {
    
    //  当应用在前台时候什么都不做
        if (application.applicationState == UIApplicationStateActive) {
            return;
        }
    
    //  当应用不再前台的时候才去跳转,这样用户体检更好
        UITabBarController *tbVc = (UITabBarController *)application.keyWindow.rootViewController;
        tbVc.selectedIndex = 1;
    
    }
    

    但是当应用已经退出的时候,点击通知进入本应用时候,不在调用 application:didReceiveLocalNotification:的代理方法,难道当应用退出后,用户再进入应用我们就不再跳转指定界 面了吗?为了更好用户体验,我此时也应该让应用跳转到指定的界面,怎么才能实现这个功能呢? 我们知道当应用程序启动的时候一定会调用application: didFinishLaunchingWithOptions:的代理方法,在这里我们能拿到本地通知信息,也可以跳转相应的界面

    //  如果是点击本地通知进来的那么launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]就会有内容
        if(launchOptions[UIApplicationLaunchOptionsLocalNotificationKey])
        {
            //页面跳转
            UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;
            tbVc.selectedIndex = 1;
        }
    

    一个应用可能要各种不同的通but知,点击不同的通知可以跳转不同界面,这个有该怎么做呢?

    1. 在发送通知时候,设置userInfo属性
      //  7.设置应用信息
       ln.userInfo = @{@"pageKey":@"friend"};
      
    2. 在AppDelegate本地通知代理方法中进行判断
    
    /**
     *  一旦接收到本地通知就会调用该方法
     *  注意这个方法:应用在前台也会调用
     *  @param application  应用
     *  @param notification 本地通知对象
     */
    - (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
    {
    
    //  当应用在前台时候什么都不做
        if (application.applicationState == UIApplicationStateActive) {
            return;
        }
    //  当应用不再前台的时候才去跳转,这样用户体检更好
    //  获取tabBarController
        UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;
    
    
    //  获取用户设置的跳转页
        NSString *page = notification.userInfo[@"pageKey"];
    //  如果是朋友圈
        if ([page isEqualToString:@"session"]) {
            tbVc.selectedIndex = 1;
        }else{
    //       否则跳转到好友
            tbVc.selectedIndex = 0;
        }
    }
    
    • 测试launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]中的内容
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
    //  获取UIApplicationLaunchOptionsLocalNotificationKey对应内容
        id obj = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
    //  获取控制器(注意此时需要通过self.window,通过application.keyWindow无法获取到,因为此时的window还没有成为keyWindow)
        UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;
    //  获取索引为0的控制(注意此时tbVc.selectedViewController为nil)
        UIViewController *vc = tbVc.viewControllers[0];
    
    //  创建一个文本
        UILabel *label = [[UILabel alloc] init];
        label.backgroundColor = [UIColor brownColor];
    //  设置text为UIApplicationLaunchOptionsLocalNotificationKey对应的内容
        label.text =  [obj description] ;
        label.frame = CGRectMake(10, 100, 300, 400);
        label.numberOfLines = 0;
    //  添加到控制器的View上
        [vc.view addSubview:label];
    
    
        return YES;
    }
    

    显示结果:

    • 我们从中可以出他是一个UILocalNotification对象
    • 所以我们取出UILocalNotification对象,剩下的做法与接收到本地通知代理方法中处理相同,所以我们把它提取为一个公用的方法
    /**
     *  根据通知跳转到不同页面
     */
    - (void) jumpToPageWithLocalNotification:(UILocalNotification *) notification
    {
        //  获取tabBarController
        UITabBarController *tbVc = (UITabBarController *)self.window.rootViewController;
    
        //  获取用户设置的跳转页
        NSString *page = notification.userInfo[@"pageKey"];
        //  如果是朋友圈
        if ([page isEqualToString:@"session"]) {
            tbVc.selectedIndex = 0;
        }else{
            //       否则跳转到好友
            tbVc.selectedIndex = 1;
        }
    }
    
    • 在didReceiveLocalNotification方法中
    /**
     *  一旦接收到本地通知就会调用该方法
     *  注意这个方法:应用在前台也会调用
     *  @param application  应用
     *  @param notification 本地通知对象
     */
    - (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
    {
    
    //  当应用在前台时候什么都不做
        if (application.applicationState == UIApplicationStateActive) {
            return;
        }
    //  当应用不再前台的时候才去跳转,这样用户体检更好
        [self jumpToPageWithLocalNotification:notification];
    }
    

    在didFinishLaunchingWithOptions方法中

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
    //  如果是点击本地通知进来的那么launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]就会有内容
        UILocalNotification *notifcation = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
    //  如果存在通知
        if(notifcation){
            [self jumpToPageWithLocalNotification:notifcation];
        }
    
        return YES;
    }
    
  • 相关阅读:
    java软件设计模式只单例设计模式
    IOS疯狂基础之观察者模式
    IOS之UIColor
    UITableView与UITableViewCell
    UILabel的各种属性和方法
    iOS TextField
    【IPHONE开发-OBJECTC入门学习】对象的归档和解归档
    【IPHONE开发-OBJECTC入门学习】复制对象,深浅复制
    【IPHONE开发-OBJECTC入门学习】文件的操作,读写复制文件
    虚拟机VMware 9安装苹果MAC OSX 10.8图文教程
  • 原文地址:https://www.cnblogs.com/ZMiOS/p/5074232.html
Copyright © 2020-2023  润新知