本地推送通知页面跳转

本地推送通知页面跳转

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

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;
}
原文地址:https://www.cnblogs.com/ZMiOS/p/5074232.html