美文网首页iOS开发推送篇iOS
iOS 远程推送 根据后台推送内容的不同跳转指定页面

iOS 远程推送 根据后台推送内容的不同跳转指定页面

作者: Eric__li | 来源:发表于2016-07-06 16:49 被阅读1972次
    iOS 远程推送,根据后台推送内容的不同, 跳转指定页面
    我目前的需求是总体分为两类:
    1:私信、关注、点赞一类,只需跳转到对应的tabbar 中的某一项
    2:每日精品文章项目推送,分两个子类
    (1)如果当前已经打开 文章项目页面,则直接刷新,不推出新页面
    (2)如果当前未打开此页面,则push出新的文章项目页面
    
    iOS  推送情况分为 
    应用未启动的 情况:
    打开应用 ,推送信息 会通过
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions:
    此方法传递,内容在launchOptions里面, 通过控制台即可看出
    应用已启动的 情况:(1)应用在前台活跃 (前台活跃 只做 页面的体型,alert,不去主动帮用
    户打开新的界面)
    (2)应用在后台挂起  (后台挂起转为 活跃时 调用此方法)
    - (void)didReceiveRemoteNotification:(NSDictionary *)userInfo 
     
    
    结论,我们要做的就是 通过系统的两个方法拿到推送信息后:
    1、 如果是从第一个方法里边获得的信息, 则 延迟0.5秒左右跳转新页面(我做推送的时候直接 跳转会出现异常异常),这种情况不需要判断当前的 controller
    2、从第二种方法里边获取信息, 判断当前controller,是否需要push新的页面,或者回到tabbar 
    
    下面是 我这边的代码,具体 信息 字段根据你们后台来定
    使用到了 类别,方便统一管理
    推送平台根据你们自己所使用的来配置 ()
    [objc] view plain copy
      
    [objc] view plain copy
    // 接收 远程推送消息后 弹出 新的页面  
    // 应用未启动的 情况下点击推送消息 进入应用 触发didFinishLaunchingWithOptions 此方法, 并从字典中 获取到推送的相关消息  
    // 应用已经启动  处于 活跃状态 或 非活跃状态 会触发didReceiveRemoteNotification 此方法, 并从字典中 获取到推送相关消息  
      
      
    #import "AppDelegate+UMessage.h"  
    #import "AppDelegate+UMSocal.h"  
    #import "ArticleOrProjectDetailViewController.h"  
      
    #define UMSYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)  
      
    #define _IPHONE80_ 80000  
      
    @implementation AppDelegate (UMessage)  
      
    - (void)setUmessageWithlaunchOptions:(NSDictionary *)launchOptions {  
        [UMessage setLogEnabled:YES];  
        //友盟推送 key  
        [UMessage startWithAppkey:@"x x x x x x" launchOptions:launchOptions];  
        //注册推送功能  
        [self registerRemoteMessage];  
        [self didReceiveRemoteJingWhenAppDeadWithDic:launchOptions];  
    }  
      
    //注册远程推送  
    - (void)registerRemoteMessage {  
    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= _IPHONE80_  
        if(UMSYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))  
        {  
            //register remoteNotification types  
            UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];  
            action1.identifier = @"action1_identifier";  
            action1.title=@"Accept";  
            action1.activationMode = UIUserNotificationActivationModeForeground;//当点击的时候启动程序  
              
            UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];  //第二按钮  
            action2.identifier = @"action2_identifier";  
            action2.title=@"Reject";  
            action2.activationMode = UIUserNotificationActivationModeBackground;//当点击的时候不启动程序,在后台处理  
            action2.authenticationRequired = YES;  
            //需要解锁才能处理,如果action.activationMode = UIUserNotificationActivationModeForeground;则这个属性被忽略;  
            action2.destructive = YES;  
              
            UIMutableUserNotificationCategory *categorys = [[UIMutableUserNotificationCategory alloc] init];  
            categorys.identifier = @"category1";//这组动作的唯一标示  
            [categorys setActions:@[action1,action2] forContext:(UIUserNotificationActionContextDefault)];  
              
            UIUserNotificationSettings *userSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert  
                                                                                         categories:[NSSet setWithObject:categorys]];  
            [UMessage registerRemoteNotificationAndUserNotificationSettings:userSettings];  
              
            [[UIApplication sharedApplication] registerForRemoteNotifications];  
              
        } else{  
            //register remoteNotification types  
            [UMessage registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge  
             |UIRemoteNotificationTypeSound  
             |UIRemoteNotificationTypeAlert];  
        }  
    #else  
        [UMessage registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge  
         |UIRemoteNotificationTypeSound  
         |UIRemoteNotificationTypeAlert];  
          
    #endif  
          
    }  
      
    - (void)didReceiveRemoteNotification:(NSDictionary *)userInfo {  
        //关闭友盟自带的弹出框  
        [UMessage setAutoAlert:NO];  
        [UMessage didReceiveRemoteNotification:userInfo];  
          
        NSDictionary *dic = [MyHelp jsonDataFormatterWithStringSourceData:[DMDes decryptUseDES:userInfo[@"msg"] key:DMDESKEYS]] ;  
          
        if ([[dic objectForKey:@"type"] isEqualToString:@"articles"] ||  
            [[dic objectForKey:@"type"] isEqualToString:@"projects"]) {  
            [self didReceiveRemoteJingWhenAppBackgroundWithDic:dic];  
        } else {  
            [self didReceiveRemoteMessageWhenAppBackgroundWithDic:userInfo];  
        }  
    }  
      
      
    #pragma mark ----应用挂起的状态 时接收到每日文章项目推送  
    - (void)didReceiveRemoteJingWhenAppBackgroundWithDic:(NSDictionary *)dic {  
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.4 * NSEC_PER_SEC));  
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){  
            UITabBarController *tab = (UITabBarController *)self.window.rootViewController;  
            UINavigationController  *nvc = tab.selectedViewController;  
            UIViewController *vc = nvc.visibleViewController;  
            if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {  
                //防止同一界面多次 push  
                if ([vc isMemberOfClass:[ArticleOrProjectDetailViewController class]]) {  
                    ArticleOrProjectDetailViewController *avc = (ArticleOrProjectDetailViewController *)vc;  
                    if ([dic[@"type"] isEqualToString:@"articles"]) {  
                        avc.detailDataTpe = DetailDataTypeArticle;  
                    } else {  
                        avc.detailDataTpe = DetailDataTypeProject;  
                    }  
                    avc.titleString = dic[@"title"];  
                    avc.idString = dic[@"conId"];  
                    avc.iconURLString = dic[@"cover"];  
                    [avc reloadAll];  
                } else {  
                    ArticleOrProjectDetailViewController *avc = (ArticleOrProjectDetailViewController *)[self getWebDetailWithData:dic];  
                    [vc.navigationController hideBottomBarWhenPushController:avc animated:YES superController:vc];  
                }  
            }  
        });  
    }  
      
    #pragma mark -----  应用挂起的状态,收到 私信 关注等  
    - (void)didReceiveRemoteMessageWhenAppBackgroundWithDic:(NSDictionary *)userInfo {  
        NSDictionary *subDic = userInfo[@"aps"];  
        NSString *str = [NSString stringWithFormat:@"%@",userInfo];  
        [self.window.rootViewController.view makeToast:subDic[@"alert"]];  
        if (![str isEqualToString:@"(null)"]) {   //     后台返回数据转为字符串后为(null)用此来判断  
            [[NSNotificationCenter defaultCenter] postNotificationName:@"ChatMessage" object:nil];  
        } else {  
            [[NSNotificationCenter defaultCenter] postNotificationName:@"myNewRemindMessage" object:[NSString stringWithFormat:@"%@",subDic[@"badge"]]];  
        }  
        [[NSNotificationCenter defaultCenter] postNotificationName:@"didreceiveNoti" object:userInfo];  
        [[NSNotificationCenter defaultCenter] postNotificationName:@"messagelistrefresh" object:nil];  
          
        if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {  
            UITabBarController *tbc = (UITabBarController *)self.window.rootViewController;  
            UINavigationController  *nvc = tbc.selectedViewController;  
            UIViewController *vc = nvc.visibleViewController;  
            [vc.navigationController popToRootViewControllerAnimated:YES];  
            tbc.tabBarController.tabBar.hidden = NO;  
            dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.4 * NSEC_PER_SEC));  
            dispatch_after(popTime, dispatch_get_main_queue(), ^(void){  
                tbc.selectedIndex = 2;  
            });  
        }  
    }  
      
    #pragma mark ------应用从关闭的 状态下启动时  
    - (void)didReceiveRemoteJingWhenAppDeadWithDic:(NSDictionary *)sic {  
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.4 * NSEC_PER_SEC));  
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){  
            if ([sic.allKeys containsObject:UIApplicationLaunchOptionsRemoteNotificationKey]) {  
                NSDictionary *subDic = [sic objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];  
                subDic = [MyHelp jsonDataFormatterWithStringSourceData:[DMDes decryptUseDES:[subDic objectForKey:@"msg"] key:DMDESKEYS]] ;  
                ArticleOrProjectDetailViewController *avc = (ArticleOrProjectDetailViewController *)[self getWebDetailWithData:subDic];  
                UITabBarController *tbc = (UITabBarController *)self.window.rootViewController;  
                if ([[subDic objectForKey:@"type"] isEqualToString:@"articles"] ||  
                    [[subDic objectForKey:@"type"] isEqualToString:@"projects"]) {  
                    UINavigationController *nc = tbc.selectedViewController;  
                    UIViewController *vc = nc.visibleViewController;  
                    [vc.navigationController hideBottomBarWhenPushController:avc animated:YES superController:vc];  
                } else {  
                    tbc.selectedIndex = 2;  
                }  
            }  
        });  
    }  
      
      
      
    #pragma mark ------推送详情页  
    - (UIViewController *)getWebDetailWithData:(NSDictionary *)dic{  
        ArticleOrProjectDetailViewController *avc = [[ArticleOrProjectDetailViewController alloc] init];  
        if ([dic[@"type"] isEqualToString:@"articles"]) {  
            avc.detailDataTpe = DetailDataTypeArticle;  
        } else {  
            avc.detailDataTpe = DetailDataTypeProject;  
        }  
        avc.idString = dic[@"conId"];  
        avc.iconURLString = dic[@"cover"];  
        return avc;  
    }  
      
      
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo {  
        [self didReceiveRemoteNotification:userInfo];  
    }  
      
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken  
    {  
        [UMessage registerDeviceToken:deviceToken];  
    }  
      
    + (void)addAlias {  
      
        [UMessage addAlias:"xxxxxx" type:@"xxxxx" response:^(id responseObject, NSError *error) {  
        }];  
    }  
      
    //注销 个人推送  注册一个空的 alias。  用于移除个人推送, 同时 文章、项目推送不影响  
    + (void)removeAlias {  
        [UMessage addAlias:[@"" MD5Digest] type:@"xxxxx" response:^(id responseObject, NSError *error) {  
        }];  
    }  
    

    相关文章

      网友评论

      • Mars_pananting:[vc.navigationController hideBottomBarWhenPushController:avc animated:YES superController:vc]; 大哥,你这个关键的方法不是系统的啊,是自定义的吧方法吧,我后台push VC push 不了啊
      • shLuckySeven:您好,您这个代码有Demo可以看看么,谢谢
      • 蒋昉霖:你好,比如跳转到四级界面有三层push,上面还有tabbar,这个拿到跟控制器一层层推该怎么写
      • 司马捷:你好问下,正式发布以后,我们需要把每个用户的deviceToken 收集起来么,然后在服务端一个个发送么?友盟有没有提供什么工具 ?
      • 司马捷:问下,友盟的后台在哪?我怎么找不到在哪创建应用?
        司马捷:@Eric__li 谢啦,你这个网页打不开,不过 我准备自己写推送了,不用友盟了
        Eric__li:@机器人小雪 http://push.umeng.com/5593718267e58e25320033f4/general 这是推送的后台, 你是要这个的不, 刚刚简书 服务器出问题了吧, 现在才能访问
      • 常义:写的挺好的,当应用挂起时点击图标进入有拦截的代理没呢?
        常义: @Eric__li 👍
        Eric__li:@常义 点击应用图标吗?我觉得点应用图标没用的吧,按我目前写的应该没处理这个,其他应用好像也没有这么做的,回头我看看
      • 杏仁丶:感谢分享啊!!!这类分享内容比较少
        Eric__li:@杏仁丶 能对你有帮助就好:yum: 代码是从我项目里抽出来的

      本文标题: iOS 远程推送 根据后台推送内容的不同跳转指定页面

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