美文网首页iOSAPP & program
iOS Swift极光推送点击消息推送内容跳转到对应的界面

iOS Swift极光推送点击消息推送内容跳转到对应的界面

作者: Lee坚武 | 来源:发表于2023-02-09 18:29 被阅读0次
    本人亲测有效!更多交流可以家魏鑫:lixiaowu1129,公重好:iOS过审汇总,一起探讨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);
    
    }
    

    本文由mdnice多平台发布

    相关文章

      网友评论

        本文标题:iOS Swift极光推送点击消息推送内容跳转到对应的界面

        本文链接:https://www.haomeiwen.com/subject/xkdhkdtx.html