iOS收到推送后,跳转到某一页面

作者: 静心_安神 | 来源:发表于2016-01-23 18:08 被阅读22731次

    以前做过推送, 但只是那种最基本的广播推送(向所有安装appde设备通知), 列播组播这种对指定用户推送消息还没做过, 最近刚好有个项目,向指定用户推送物流信息、物品状态等等。于是前几天就和也没做过推送的后台干起来了,详情如下:

    我用的是友盟推送, 配置证书这一环节直接跳过了,这个网上有讲的。给大家讲一点常识,友盟推送分生产环境和开发环境。用手机刷上去的就是开发环境, 发布到苹果商店就是生产环境,没发布前怎么模拟呢, 用普通账号打的ad hoc 包, 用企业账号打的ad hoc 包或者enterprise包都可以测试生产环境。


    ** 开发环境下, 你把APP删掉,重新调试上来,就会生成一个新的device_token了!下面的几个步骤是自己的理解结合网上的资料写出的想法,大牛们轻的吐槽…… **

    1、传device_token的时机

    后台向指定用户做同送,那么必须知道某个用户的device_token,那么怎么获取token呢,APP启动后会在appdelegate的didRegisterForRemoteNotificationsWithDeviceToken方法里返回device_token信息:
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
    [UMessage registerDeviceToken:deviceToken];
    NSString * token = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""]
    stringByReplacingOccurrencesOfString: @">" withString: @""]
    stringByReplacingOccurrencesOfString: @" " withString: @""];
    }
    但是后台向指定用户推送, 就必须把uid(用户ID)和token关联起来,我这里的做法时, 用户登录的时候就上传token信息, 退出登录的时候, 就清除用户绑定的token信息, 这样确保后台会向用户最后一次登录的设备号做推送(只是自己的理解,当然了,iOS设备收到推送后,还要判断用户是否登录而且登录的是不是你要推送的用户)。

    2、 收到通知时app的状态

    收到通知的时候APP的状态可能是未启动、前台活跃(任何界面)、后台等三种。

    • 未启动时,点击通知栏启动App, 会在didFinishLaunchingWithOptions方法里收到通知内容。

    • 剩下两种会在didReceiveRemoteNotification方法里收到通内容。

      - (void)application:(UIApplication *)application   didReceiveRemoteNotification:(NSDictionary *)userInfo{
       _userInfo = userInfo;
         //关闭友盟对话框
       [UMessage setAutoAlert:NO];
       [UMessage didReceiveRemoteNotification:userInfo];
       NSLog(@"_______________友盟系统方法 userInfo %@",userInfo);
      if(userInfo)// 调用appdelegate的分类处理业务逻辑
        [self dealWithMyMessagePush:userInfo];
      }
      

      ** 代码里面删减了一些和推送不相关的代码,我的项目架构是tab+nav **
      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary )launchOptions{
      self.window.rootViewController = [[FDIMGBarController alloc] init];
      // 分类
      [self UMengShareMethodAndCount:launchOptions];
      // 类别
      [self FD_updateAppVersion];
      NSDictionary
      userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
      if(userInfo){//推送信息
      self.userInfo = userInfo;//[userInfo copy]
      }
      return YES;
      }

    • 未启动时收到通知,就判断字典userInfo是否为空, 不为空是说明有通知消息。我这里的做法是把她复制给AppDelegate的某个属性, 在首页控制器取到AppDelegate的这个值,判断是否为空,不为空就进行下一步操作。

    • 用户在前台或后台收到消息的时候, 我会弹出一个弹出框提醒用户,是否前往我的消息界面。


    5、 未启动时首页控制器逻辑处理

    在viewDidLoad方法里:
    AppDelegate * app = (AppDelegate *)[UIApplication sharedApplication].delegate;
    //pushName 是我给后天约定的通知必传值,所以我可以根据他是否为空来判断是否有通知
    NSString *  pushName = [[app.userInfo objectForKey:@"aps"] objectForKey:@"alert"];
    if(![SYFCustomCLASS SYFIsEmptyOrNull:pushName])
        [self getPushInfo:app.userInfo];
    

    如果有通知的话:

    -(void)getPushInfo:(NSDictionary *)dict{
     if(!IsLogin){// 判断用户是否登录
        LoginViewController * loginVC = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
    //通知必返回要通知用户的uid, 判断登录的用户是不是你要通知的用户
        loginVC.push_uid = dict[@"uid"];
        FDNavigationController * loginNav = [[FDNavigationController alloc] initWithRootViewController:loginVC];
        [self presentViewController:loginNav animated:YES completion:^{}];
    }else
    {// 这就文章标题说的某一界面
       MyUserMessageVC * messageVC = [[MyUserMessageVC alloc] initWithNibName:@"MyUserMessageVC" bundle:nil];
        [self.navigationController pushViewController:messageVC animated:YES];
     }
    }
    

    当用户的登录成功的时候,在上传device_token的接口方法里, 需要判断登录用户的uid是不是你要通知的用户。如果不是你要通知的用户,dismiss就好了,结束;如果是就要跳转到我的消息界面。

       if(![self.push_uid isEqualToString:currentuid])
            [self dismissViewControllerAnimated:YES completion:NULL];
           else{
            [self dismissViewControllerAnimated:YES completion:^{
             AppDelegate * app = (AppDelegate *)[UIApplication sharedApplication].delegate;
       //AppDelegate的分类
             [app  testLoginerUidCorret];
             }];
    

    方法如下:

    - (void)testLoginerUidCorret{
    // 取到tabbarcontroller
    FDIMGBarController *tabBarController = ( FDIMGBarController*)self.window.rootViewController;
    // 取到navigationcontroller
    FDNavigationController * nav = (FDNavigationController *)tabBarController.selectedViewController;
    //取到nav控制器当前显示的控制器
      UIViewController * baseVC = (UIViewController *)nav.visibleViewController;
    //如果是当前控制器是我的消息控制器的话,刷新数据即可
    if([baseVC isKindOfClass:[MyUserMessageVC class]])
    {
        MyUserMessageVC * vc = (MyUserMessageVC *)baseVC;
        [vc reloadMessageData];
        return;
    }
    // 否则,跳转到我的消息
    MyUserMessageVC * messageVC = [[MyUserMessageVC alloc] initWithNibName:@"MyUserMessageVC" bundle:nil];
    [nav pushViewController:messageVC animated:YES];
    }
    

    6、应用在前台或后台的逻辑处理

    逻辑和未启动时很多情况都是类似,弹出提醒框, 点击立即前往时,判断用户是否登录,如果用户登录,直接跳转到我的消息界面;没有登录请参考上面逻辑。

    ** 由于第一次做推送某一页面,写的不好处,请大家多多交流指点,有疑问或更好的想法的可以和我说。 **

    相关文章

      网友评论

      • 书签123:大兄弟,及时雨啊,虽然我用小米推送,但是跳转的思路一样,成功解决
      • 微小的沙土:想问下,APP没有打开(不是在后台,是完全关闭),这时候推送过来,然后没点击APP,直接点推送,这样子你在接收到后台推送代理那运行了代码—通知某个页面push出另一个页面,但是很有可能代码还没运行到通知某个页面的注册这个通知的代码,那你发出的通知就没人接收了。。。咋办(异步循环判断是否注册了这个通知,注册了才运行这个通知后break掉,在接收通知的那个页面注册好接收通知后再回过来通知要发出通知的那个页面吗???)
      • d1bb75bf831c:实用干货,先收藏了!
      • GrowthGou: 楼主,你好! 我能加你的QQ? 或者你加我的QQ 1067197037 .
        我最近 遇到这个问题, 不知怎么去解决。谢谢。
      • 解码漫聊:楼主能不能完善一下应用在前台或后台的逻辑处理这部分,如果我在打开的一个页面上接收到推送通知,我该怎么跳转到相应的页面?如果我打开的页面正好是推送对应的页面,我就不需要跳转,怎么处理?
        9b4eefba0110:我的处理是,不管在哪一个页面所请求的url是不一样的,那么在每一个页面把当前的url做保存,实际上是给每一个页面做一个标签,收到通知时候就先判断存入的url是不是当前url,如果是就不跳转,不是就跳转
      • 凌虚若寒:特别好,终于解决了困扰我多日的问题了…… :pray: :pray: :pray:
      • 蒋昉霖:加入这个界面是四级界面呢?你需要好几层push才能拿到这个界面,你也直接push么,那这样push过去之后点击返回键,是按顺序返回还是直接到主页了
        肖中旺:@蒋昉霖 我用的是block返回的
        蒋昉霖:@肖中旺 你的反射弧绕地球两圈半老铁
        肖中旺:从那个页面进的就反回那个页面,也可以自定义返回
      • pikacode:iOS 前台收到推送时的弹窗效果,可以试试哦 ^_^
        https://github.com/Yasashi/EBForeNotification
      • 民哥:写的很好 收藏
      • 天蝎座沫沫:我的也是tabBar+nav,在alert的代理方法里面写如下代码,没有实现跳转
        MyMessageViewController *messVC = [[MyMessageViewController alloc]init];

        [self.window.rootViewController.navigationController pushViewController:messVC animated:YES];
      • 天蝎座沫沫:你好,我在自定义推送通知时,还会显示一遍友盟自带的推送通知,请问你是怎么消除的
      • seky:感谢分享
      • STDawn:Mark
      • gushidekaitou:以testLoginerUidCorret这个方法来获取当前显示的viewController会有什么隐患么,因为之前查到的都是用迭代的方式来进行的
      • newbiecoder:刚好用到 学习了
      • 90ce7d4e6d5b:感谢分享
      • __Jason__:🐎个再说

      本文标题: iOS收到推送后,跳转到某一页面

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