ios推送分为两种,一种是本地推送,一种是远程推送。项目需要实现的就是通过远程推送来进入到指定的页面,要做远程推送,那就必须配置相关证书,配置证书网上的教程很多有详细,这就不做过多的介绍了。
首先我们需要考虑的是在不同情况下接送过来的推送通知应该怎么处理?有几下几种情况:
1、app正在使用
2、app在后台运行
3、app进程没启动(进程杀死)
解决方案如下:
问题一:app在运行的过程中接收了推送消息,会走- (void)application:(UIApplication*)application didReceiveRemoteNotification:(nonnullNSDictionary*)userInfo方法,但是这个方法app在后台运行接收到消息也会调用,因此我们需要在此方法中进行相应的处理,要使用[UIApplicationsharedApplication].applicationState判断app是在前台还是在后台,在前台需要给出提示,要用户进行确认在跳转到指定页面,具体方案如下:
if([UIApplicationsharedApplication].applicationState==UIApplicationStateActive) {
UIAlertView*alertView = [[UIAlertViewalloc]initWithTitle:@"消息提醒"message:@"收到一条新讯息"delegate:selfcancelButtonTitle:@"稍后"otherButtonTitles:@"立即前往",nil];
[alertViewshow];
}else{
[selfloadDetail];
}
- (void) loadDetail {
UITabBarController*tab = (UITabBarController*)self.window.rootViewController;
UINavigationController*nvc = tab.selectedViewController;
UIViewController*vc = nvc.visibleViewController;
//防止同一界面多次push
if([vcisMemberOfClass:[SQMessageTableViewControllerclass]]) {
}else{
UIStoryboard*mainStoryboard = [UIStoryboardstoryboardWithName:@"Main"bundle:nil];
SQMessageTableViewController*messageTableViewController = [mainStoryboardinstantiateViewControllerWithIdentifier:@"SQMessageTableViewController"];
[vc.navigationControllerpushViewController:messageTableViewControlleranimated:YES];
}
}
问题二:在问题一的解决方中提到了app在后台运行接收到消息也会调用- (void)application:(UIApplication*)application didReceiveRemoteNotification:(nonnullNSDictionary*)userInfo方法,使用[UIApplicationsharedApplication].applicationState判断app是在前台还是在后台,在后台直接加载控制器就行。具体的施行方案和问题一的相同。
问题三:在app没启动的情况下,app启动进入- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions方法,我们要在次方法中来判断是否有推送消息,判断[launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]是否为空来判定是否接收了到了推送消息,再根据不同的情况加载控制器,而我这里以push的方式加载的控制器。具体实现如下的方法来实现:
self.userInfo= [launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(self.userInfo) {
[selfloadDetail];
}
- (void) loadDetail {
UITabBarController*tab = (UITabBarController*)self.window.rootViewController;
UINavigationController*nvc = tab.selectedViewController;
UIViewController*vc = nvc.visibleViewController;
//防止同一界面多次push
if([vcisMemberOfClass:[SQMessageTableViewControllerclass]]) {
}else{
UIStoryboard*mainStoryboard = [UIStoryboardstoryboardWithName:@"Main"bundle:nil];
SQMessageTableViewController*messageTableViewController = [mainStoryboardinstantiateViewControllerWithIdentifier:@"SQMessageTableViewController"];
[vc.navigationControllerpushViewController:messageTableViewControlleranimated:YES];
}
}
SQMessageTableViewControllerclass控制器是指定跳转到的页面的控制器,可能根据时间情况进行替换。
总而言之最关键的是就是怎么加载控制器,不同的项目结构可能需要不同的加载控制器的方式,主要看实际情况来分析可能存在的问题,一一制定方案来解决问题,具体情况具体分析吧。