zoukankan      html  css  js  c++  java
  • 本地推送通知页面跳转

    本地推送通知页面跳转

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

    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;
    }
    
  • 相关阅读:
    2020牛客暑期多校训练营(第三场)C-Operation Love(计算几何)
    洛谷 P3376 【模板】网络最大流
    2020牛客暑假多校训练营(第二场)F-Fake Maxpooling(单调队列)
    Codeforces Round #655 (Div. 2)【ABCD】(题解)
    Codeforces Round #648 (Div. 2)【ABCDEF】(题解)
    Codeforces Round #647 (Div. 2)
    Codeforces Round #646 (Div. 2)【ABCDE】(题解)
    Educational Codeforces Round 88 (Rated for Div. 2)【ABCDE】(题解)
    [蓝帽杯2020]一个利用data伪协议和include,file_get_contents写shell的web题
    [网鼎杯2020朱雀场] misc部分题解
  • 原文地址:https://www.cnblogs.com/ZMiOS/p/5074232.html
Copyright © 2011-2022 走看看