这几天项目中加入了友盟推送的功能,集成推送功能其实很简单,就几个方法。但是,点击推送消息之后跳转到新页面却有如下几种情况:
1、程序未启动的跳转
2、程序运行于后台的跳转
3、程序运行于前台的跳转
在此梳理了一下点击推送消息之后跳转到新页面的几种情况,也算是做个笔记吧。
程序未启动的情况
因为程序还未启动,当我们点击推送消息之后,首先会先调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
启动应用程序。我们在这个方法中可以得到推送消息实体,但是在这个时候我们都知道是无法执行页面的跳转的,因此我们在AppDelegate中声明一个属性userInfo用于保存消息实体内容。
@property (nonatomic ,strong) NSDictionary *userInfo;
并在didFinishLaunchingWithOptions方法中取得userInfo对象;
NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
self.userInfo = userInfo;
因为所在项目window.rootViewController是一个UITabBarController,顾而在UITabBarController的-(void)viewDidAppear:(BOOL)animated方法中处理跳转逻辑
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
#warning -----------
//firstAvaliUserInfo属性用于表示该页面是不是第一次被加载,其实也就是为了保证只是在第一次被加载的时候执行跳转逻辑。
if (_firstAvaliUserInfo == NO) {
_firstAvaliUserInfo = YES;
AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSString *pushName = [[app.userInfo objectForKey:@"aps"] objectForKey:@"alert"];
if(pushName.length > 0){
[self getPushInfo:app.userInfo];
}
}
}
程序在前/后台的跳转
如果应用程序已经启动,这个时候我们点击推送消息,会执行处理点击通知的代理方法。
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler{
NSDictionary * userInfo = response.notification.request.content.userInfo;
_userInfo = userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
//应用处于后台时的远程推送接受
//必须加这句代码
[UMessage didReceiveRemoteNotification:userInfo];
}else{
//应用处于后台时的本地推送接受
}
#warning -----前/后台点击跳转
if (userInfo != nil) {
[[NSNotificationCenter defaultCenter]postNotificationName:@"ClickedPushInformationNotification" object:userInfo];
}
}
我们在通知点击响应的方法中发送了一个需要执行页面跳转的通知。当然需要在UITabBarController的- (void)viewDidLoad;方法中注册并在类中实现
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clickedPushInformation:) name:@"ClickedPushInformationNotification" object:nil];
}
-(void)clickedPushInformation:(NSNotification *)notification{
NSDictionary *userInfo = notification.object;
[self getPushInfo:userInfo];
}
页面跳转
如果我们所收到的推送消息登录不登录都能查看或者是不针对某个用户的话,可以直接跳转。如果需要进行登录操作才能查看的话,这个时候就需要在跳转之前进行判断,这个指定用户的话可以和后台约定字段:例如把userId当成参数,在消息实体中给出。在此不在说明。
当用户点击推送信息的时候,这个时候我们并不知道应用程序处在那个页面,怎么办呢?我的做法是在UITabBarController层面上实现跳转,看代码一目了然:
NSInteger index = self.selectedIndex;
BaseNavigationController *vc1 = self.viewControllers[index];
[vc1 pushViewController:notiDetailVC animated:YES];