正解当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];
}
不知道大家能否看懂😀😀😀,有帮助的就点个赞👍吧!
网友评论