推送通知的跳转

Posted LoSenTrad

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推送通知的跳转相关的知识,希望对你有一定的参考价值。

本文主要讲解:当手机接收到通知(远程推送通知或者是本地推送通知)的时候,点击通知的时候,进行相应的跳转.

示例代码:

  • AppDelegate.m 文件中
// App一旦开始运行, 就会执行该方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

    // 通知配置 (具体的权限, 通知Category(不同的通知样式--包含Action事件))

    // 权限
    UIUserNotificationType type = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;

    // 样式- 对应 -Category  (包含多个Action)
    UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];
    category.identifier = @"CustomCategroyIdentifier";      // 通知会根据该ID来使用对应的Category样式

    // UIUserNotificationAction 表示 Category上的按钮
    UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init];
    action.title = @"按钮标题";
    action.identifier = @"CustomAction";
    action.activationMode = UIUserNotificationActivationModeBackground;   // 激活后的样式, 会进入App, 不会进入App, 但是都会触发代理

    // 为Category添加Action
    [category setActions:@[action] forContext:UIUserNotificationActionContextDefault];
    // 一个通知配置是可以注册多个Category
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type categories:[NSSet setWithObjects:category, nil]];
    // 注册通知配置
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];

    /*================= 通知跳转 =================*/
    /**
     1. 获取到通知的相关内容
        launchOptions 包含了运行App时的一些相关参数
     */
    // UIApplicationLaunchOptionsLocalNotificationKey 指定, 是否是通过本地通知来启动的App, 所对应的Value是一个UILocalNotification对象
//    launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];  远程推送

    UILocalNotification *notification = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
    if (notification) 
        if (notification.userInfo[@"通知类型"]) 
            NSNumber *number = notification.userInfo[@"跳转索引"];

            // 此时 application.keyWindow 是nil,
            // 执行了 makeKeyAndVisible 的window 就是keywindow
            //            UITabBarController *tabVC = (UITabBarController *)application.keyWindow.rootViewController;

            // 代码实现跳转
            UITabBarController *tabVC = (UITabBarController *)self.window.rootViewController;
            [tabVC setSelectedIndex:number.intValue];
        
      
    return YES;


#pragma mark - 点击通知后触发

// 点击了通知后进入App, 触发
/**
 * App处于后台时, 会弹出通知的Alert, 只有点击后进入App才会触发代理, 进行相关跳转
 * App处于前台时, 不会弹出通知的相关提示的, 但是会直接触发代理方法, 不应该进行跳转
 * App被杀掉时, 通知依旧会弹出来, 如果点击了通知, 会启动你的App. 代理方法不会生效, 
 此时要通过 didFinishLaunchingWithOptions : 完成相关操作
 */
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

    NSLog(@"点击了通知后触发: %@", notification);

    // 当用户点击了通知后, 在此处通过代理来实现界面跳转 (跳转的数据由通知提供)
    /**
     0. 判断当前的App状态, 处于前台是不跳转
     1. 判断该通知是否为需要跳转类型通知
     2. 获取跳转的参数
     3. 进行跳转
     */
    // App 当前所处于状态
    /**
     UIApplicationStateActive,          激活, 前台正在运行
     UIApplicationStateInactive,          没激活, 不是在后台, App不能响应事件处理
     UIApplicationStateBackground       在后台运行
     */
    if (application.applicationState != UIApplicationStateActive) 
        // notification 对象当中, 获取UserInfo
        if (notification.userInfo[@"通知类型"]) 
            NSNumber *number = notification.userInfo[@"跳转索引"];

            // 代码实现跳转
            UITabBarController *tabVC = (UITabBarController *)self.window.rootViewController;
            [tabVC setSelectedIndex:number.intValue];
        
    

#pragma mark - 点击了Category上的Action时触发
// ios8
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler

    NSLog(@"点击了Category上的Actoin触发: %@, %@", identifier, notification);

    // 当你处理完相关的操作后, 需要告诉系统
    completionHandler();
  • ViewController.m文件中
- (IBAction)addNotificationAction:(id)sender

    // UILocalNotification 表示本地通知
    UILocalNotification *notification = [[UILocalNotification alloc] init];

    // 通知内容
    notification.alertBody = @"科比一路走好!";
    // 只会显示在通知中心 / AppleWatch
    notification.alertTitle = @"骗你的!";
    // 手机的默认音效, 自定义音效 (保存在Bundle当中的音效文件名)
    notification.soundName = UILocalNotificationDefaultSoundName;
    // 图标边缘数字
    notification.applicationIconBadgeNumber = 6;

    // 携带自定义数据 (用来跳转到TabbarController 用的数据)
    notification.userInfo = @
                              @"通知类型" : @"News", // 通知类型名
                              @"跳转索引" : @(2),    // 通知携带的参数名
                              ;

    // 应用已经注册好的Category
    // Category的identifier.
    notification.category = @"CustomCategroyIdentifier";

    // 基于时间
    notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
    // 重复触发的时间隙间
    //    notification.repeatInterval = NSCalendarUnitDay;

    // 将通知添加到调度池等待被触发
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];

本文章代码Demo链接:点我

以上是关于推送通知的跳转的主要内容,如果未能解决你的问题,请参考以下文章

Swift 每次内存地址跳转都会崩溃

iOS远程推送点击消息跳转到指定页面

安卓页面跳转问题

seo--各种跳转

Android推送通知权限判断及跳转到权限设置界面(完善兼容8.0)

如何在应用程序中从系统推送通知设置跳转到个人推送通知设置?