美文网首页
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已被杀死点击通知栏消息咋跳转

    正解当App已被杀死点击通知栏消息咋跳转到指定的页面? 如果当APP已经被杀死,直接执行通知栏的推送消息点击事件响...

  • ios 推送处理

    ios推送分为3种情况 1. 当APP为关闭状态时,点击通知栏消息跳转到指定的页面 2. 当APP在后台运行时,点...

  • JPush推送之当进程被终止的处理

    当系统通知栏接收到JPush远程推送消息,并实现点击消息跳转指定页面,处理推送消息的回调函数如下: 一、我们需要分...

  • 极光推送界面跳转

    本文主要讲述获取到推送消息之后,app的跳转。当我们在后台接受到推送消息时候,只有点击通知栏才能拿到推送内容,点击...

  • web和app测试的不同

    根据以往测试经验整理以下不同,有补充的可找我相互沟通 1、app 1).通知栏消息推送。通知栏的展示、点击跳转...

  • iOS 推送通知-杀死App点击通知栏跳转到指定页面

    杀死app点击通知栏跳转到指定页面(以本地通知为例) 第一步:两个控制器 1.ViewController2.He...

  • iOS 远程推送通知

    iOS 远程推送通知 分分钟搞定IOS远程消息推送 iOS推送通知的实现步骤 推送通知iOS客户端编写实现及推送服...

  • 推送通知的跳转处理和消息提醒

    推送通知的跳转处理和消息提醒   消息推送功能在App开发中经常用到,用于及时通知用户,推送用户订阅的相关的信息。...

  • iOS-消息推送

    iOS 消息推送包括远程推送通知(Remote Notification)和本地推送通知(Local Notifi...

  • 推送通知

    基本介绍 iOS中分两种推送通知:本地推送 和 远程推送 推送通知的作用:就是可以让不在前台运行的app接收到消息...

网友评论

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

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