关于拼过消息推送回调,然后跳转到指定界面

       最近的项目里面需要用到消息推送,在接收到推送过来的消息后需要跳转到指定的界面,然后点击“返回”后需要返回到退出app时的那个界面。之前也做过类似的功能,但是效果不好,这次重新研究了一下,找到了比较好的解决办法。

      和 之前不同的是,苹果之前的推送回调消息分不同的情况在不同的方法中回调推送消息,但是iOS8之后改为了只在

didReceiveRemoteNotification来处理所有推送的回调消息。

      首先跳转界面也分不同的情况,但是iOS开发用的最多的就是在UINavigationController的基础上push一个界面,在这里,界面的 跳转用到的就是这个方法,所以跳转界面之前必须先找到UINavigationController才能跳转。

     (1)如何找到项目中的所有的UINavigationController。我的项目框架的这样的:window的rootViewcontroller上是一个侧滑的视图(DDMenu),DDMenu的rootViewcontroller上是UITabBarController,UITabBarController的rootViewcontroller添加的UINavigationController。所以我的代码是这样的:

    //找到导航控制器数组(根据最开始搭建app框架是来获取)

    UIWindow *window = [UIApplication sharedApplication].delegate.window;

    DDMenuController *DDmenuController = (DDMenuController *)window.rootViewController;

    UITabBarController * table = (UITabBarController *)DDmenuController.rootViewController;

    NSArray *navArray = table.viewControllers;

   至此,找到了存放导航控制器数组,这个一定是要根据自己项目的框架来获取的,不然是获取不到的。

    (2)存放导航控制器数组找到了 ,现在必须确定是哪个具体的UINavigationController,才能执行跳转。

所以需要记录退出app时window在哪个导航控制器上。所以在进入后台模式(调用方法:applicationDidEnterBackground

)时在本地保存一个值,代码是这样的:

    UIWindow *window = [UIApplication sharedApplication].delegate.window;

    DDMenuController *DDmenuController = (DDMenuController *)window.rootViewController;

    UITabBarController * table = (UITabBarController *)DDmenuController.rootViewController;

    if (table.selectedIndex) {

        //记录点击的选中的tableindex,,,

        APPLog(@"tableSelectedIndex:%lu",(unsigned long)table.selectedIndex);

        [[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithFormat:@"%lu",(unsigned long)table.selectedIndex] forKey:@"tableSelectedIndex"];

    }

    else {

        APPLog(@"tableSelectedIndex不存在");

    }

  (3)根据索引,在消息回调的方法中取出你需要跳转的UINavigationController就可以实现跳转了。

注意事项:进入app是分不同的情况的,比如,app可能是杀死的状态,还有可能是后天模式,所以如果是杀死状态下进入的app,再点击返回的时候应该是返回到首页的,所以在执行app入口类的第一个方法:(didFinishLaunchingWithOptions

)时,需要执行下面的代码:

    //每次进入app前都存储tableSelectedIndex0

    [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"tableSelectedIndex"];

另外,如果觉得不保险,防止app进入后台模式时记录tableSelectedIndex出现错误,可以在每个导航控制器的跟视图界面中加入保存tableSelectedIndex的方法。

----------------结束---------------

 

posted @ 2016-11-18 11:05  走路蹩脚的火星人  阅读(735)  评论(0编辑  收藏  举报