美文网首页
iOS开发远程推送 - 教你当App已被杀死点击通知栏消息咋跳转

iOS开发远程推送 - 教你当App已被杀死点击通知栏消息咋跳转

作者: 俺不是大佬儿 | 来源:发表于2019-12-24 14:10 被阅读0次

    正解当App已被杀死点击通知栏消息咋跳转到指定的页面😏

    如果当APP已经被杀死,直接执行通知栏的推送消息点击事件响应,会出现APP不能启动的现象,就是因为此时获取到的APP根视图控制器为(nil)未被初始化加载成功不能响应控制器视图跳转。

    收到远程推送消息,点击通知栏跳转对应的业务页面需要先判断此时APP是否已经启动

    判断APP是否已经启动运行并获取根视图控制器(包含处在后台运行的状态)

    
     if ([[UIApplication sharedApplication].delegate.window.rootViewController isKindOfClass:[UITabBarController class]]){ //app 已经被启动 可以获取到根视图控制器
          UITabBarController  *baseTabBar = (UITabBarController *)self.window.rootViewController;
        }else{//app 未启动 需要先启动 
            //然而在这里是不会有响应的,此时APP已经被杀死根视图还未被初始化创建
            NSLog(@"需要启动APP");
        }
    
    //可以将以上内容写成一个方法,返回UITabBarController的实例,在需要的地方直接调用获取
    - (UITabBarController *)getTabBarController{
        UITabBarController *baseTabBar = nil;
        // 判断跳转操作 //app 已经被启动
        if ([[UIApplication sharedApplication].delegate.window.rootViewController isKindOfClass:[WLBLottieTabBarVController class]]){
            baseTabBar = (UITabBarController *)self.window.rootViewController;
        }else{//app 未启动 需要先启动 在此监测启动
            NSLog(@"需要启动APP");
        }
        return baseTabBar;
    }
    

    1.当APP处于前台运行状态时

    此时APP的window及rootViewController都已完成过初始化,可以通过rootViewController获取到当前正在显示的ViewController进性推送业务的响应操作

    //在此方法中可以解析远程推送的内容进行业务跳转
    //- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler API_AVAILABLE(ios(7.0));
    
    //获取根视图
    UITabBarController  *baseTabBar = [self getTabBarController];
    //初始化响应推送的目标控制器
    DetailViewController *vc = [[DetailViewController alloc] init];
    vc.pushOrderIdStr = [apnsModel.pushDateId stringValue];
    vc.hidesBottomBarWhenPushed = YES;
    //获取当前正在显示的控制器并进行pushViewController
    [baseTabBar.viewControllers[baseTabBar.selectedIndex] pushViewController:vc animated:NO];
    

    2.当APP处于后台运行状态时

    此时APP的window及rootViewController也都已完成过初始化,可以通过rootViewController获取到当前正在显示的ViewController进性推送业务的响应操作(具体响应操作同1的方法)

    3.当APP已经被后台杀死已不在运行状态

    此时APP的window及rootViewController都未进行初始化,获取不到APP的rootViewController点击通知栏推送消息后需要先等待APP启动,待启动完成后继续响应推送消息的点击事件

    可以先在AppDelegate中声明全局的NSDictionary *remoteNotification变量获取被点击的推送消息内容

    @interface AppDelegate ()
    @property (strong, nonatomic, readwrite) NSDictionary *remoteNotification;
    @end
    
    //在didFinishLaunchingWithOptions方法中为remoteNotification赋值
    //- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions API_AVAILABLE(ios(3.0));
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        //检测远程推送是否有从后台打开的远程推送消息;
        //UIApplicationLaunchOptionsLocalNotificationKey  用以获取通知栏被点击的本地推送消息内容的Key
        //UIApplicationLaunchOptionsRemoteNotificationKey 用以获取通知栏被点击的远程推送消息内容的Key
        self.remoteNotification = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
    
    }
    

    在APP启动后的恰当时机检测 self.remoteNotification 是否获取到被点击的推送消息内容再进行跳转响应
    此时的检测响应可以放在APP的self.window初始化并设置self.window.rootViewController 完成之后

    //检测远程推送是否有从后台打开的远程推送消息 进行响应;
        if(self.remoteNotification){
           //推送消息解析
            UMAPNSDataModel *apnsModel = [UMAPNSDataModel modelWithJSON:self.remoteNotification[@"extra"]];
           //获取根视图(此时已经可以获取到APP的根视图控制器,下面的操作同1、2)
             UITabBarController  *baseTabBar =  [self getTabBarController];
           //初始化响应推送的目标控制器
             DetailViewController *vc = [[DetailViewController alloc] init];
             vc.pushOrderIdStr = [apnsModel.pushDateId stringValue];
             vc.hidesBottomBarWhenPushed = YES;
            //获取当前正在显示的控制器并进行pushViewController
             [baseTabBar.viewControllers[baseTabBar.selectedIndex] pushViewController:vc animated:NO];
        }
    
    

    不知道大家能否看懂😀😀😀,有帮助的就点个赞👍吧!

    相关文章

      网友评论

          本文标题:iOS开发远程推送 - 教你当App已被杀死点击通知栏消息咋跳转

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