iOS 极光推送 如何点击推送消息跳转页面

  假如你已经集成完了极光,恰好有这个问题不知如何解决,可以看看这篇文章,这篇是针对远程通知的,本地通知大同小异吧。

  根据我项目的要求,极光推送跳转指定页面分为两种情况:app在后台情况和app在杀死的情况下。app在前台跳转页面暂时没做过。

  -.杀死app情况

这种情况app是由推送消息唤醒的,app启动就必须触发这个方法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions ;

判断app是否是由推送消息唤醒的,看下面:

把这个写在上面的方法中即可。但是有时候可能会出问题。下面有方法解决。

if (launchOptions) { //是否有推送消息

        NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; //这是判断app是否是由远程通知启动的   若是由本地通知启动的 则把 UIApplicationLaunchOptionsRemoteNotificationKey 换成 UIApplicationLaunchOptionsLocalNotificationKey

        if (remoteNotification) { //是否有远程推送消息

            [self jumpToViewctroller:remoteNotification]; //这是跳转页面的方法。

        }

    }

 

//跳转方法

-(void)jumpToViewctroller:(NSDictionary *)remoteNotification{ 

//remoteNotification是消息的json格式,跳转指定控制器首先你需要跟后台商量一下,添加一个字段。我这里添加的是jump,如果是1跳转这个,是2的话跳转那个等等。

        if ([[NSString stringWithFormat:@"%@",remoteNotification[@"jump"]] isEqualToString:@"1"]) {

//这里注意一下。大多数页面都是UINavigationController的子控制器。当然了,在这里你是不能push进去的。必须present进去。此时你可能会问,那存储一个key值present是干什么用的。哈哈,这是告诉你要跳转的控制器,我是被present进来的。所以我返回的时候你也要把我diss回去。同时你也要清除它。

/*

控制器的返回方法。

if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"present"] isEqualToString:@"1"]) {

        [self dismissViewControllerAnimated:YES completion:^{

            [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"present"]; // 这里最好完全清除它。

        }];

    }else{

        [self.navigationController popViewControllerAnimated:YES];

    }

*/

            DelivedViewController *VC = [DelivedViewController new];

            [[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:@"present"] ;

            [[NSUserDefaults standardUserDefaults] synchronize];

            UINavigationController *na = [[UINavigationController alloc] initWithRootViewController:VC];

            [self.window.rootViewController presentViewController:na animated:YES completion:nil];            

        }

}

以上就是app未运行的情况下跳转页面的。 注意:  前面说了判断是否有推送消息可能有问题。我遇到的问题就是 程序奔溃。可以让它延迟执行,方法如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  // 忽略 。。。。。。

    [self performSelector:@selector(sendNotation:) withObject:launchOptions afterDelay:1.5];

    return YES;

}

-(void)sendNotation:(NSDictionary *)launchOptions{

    if (launchOptions) {

        NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];

        if (remoteNotification) {

            [self jumpToViewctroller:remoteNotification];

        }

    }

}

这样就ok了。

二,app在后台运行情况。

这种情况就非常简单了。 上代码!

// iOS 10 Support  程序在后台时收到通知,点击通知栏进入app

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {

  

    // Required

    NSDictionary * userInfo = response.notification.request.content.userInfo;

    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {

        //UNPushNotificationTrigger 远程(通知类型)

        [JPUSHService handleRemoteNotification:userInfo];//userInfo消息数据,包含jump。

        if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive ) {

            [self jumpToViewctroller:userInfo];

            [UIApplication sharedApplication].applicationIconBadgeNumber = 0; //本地消息清0

            [JPUSHService setBadge:0];//极光消息清0     

        }

    }

    completionHandler();  // 系统要求执行这个方法

}

 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

    // Required, iOS 7 Support

    [JPUSHService handleRemoteNotification:userInfo];

    if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive ) {

        [self jumpToViewctroller:userInfo];

        [UIApplication sharedApplication].applicationIconBadgeNumber = 0;

        [JPUSHService setBadge:0];

    }

    completionHandler(UIBackgroundFetchResultNewData);

    

}

好了,以上就是全部内容,本人小白一枚,难免有理解不到位的地方,请各位大佬指正。谢谢!

转载于:https://www.cnblogs.com/wuyansoul/p/8366455.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值