iOS 远程推送,根据后台推送内容的不同, 跳转指定页面我目前的需求是总体分为两类:
1:私信、关注、点赞一类,只需跳转到对应的tabbar 中的某一项
2:每日精品文章项目推送,分两个子类
(1)如果当前已经打开 文章项目页面,则直接刷新,不推出新页面
(2)如果当前未打开此页面,则push出新的文章项目页面
iOS 推送情况分为
应用未启动的 情况:
打开应用 ,推送信息 会通过
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions:此方法传递,内容在launchOptions里面, 通过控制台即可看出应用已启动的 情况:(1)应用在前台活跃 (前台活跃 只做 页面的体型,alert,不去主动帮用户打开新的界面)
(2)应用在后台挂起 (后台挂起转为 活跃时 调用此方法)- (void)didReceiveRemoteNotification:(NSDictionary *)userInfo
结论,我们要做的就是 通过系统的两个方法拿到推送信息后:1、 如果是从第一个方法里边获得的信息, 则 延迟0.5秒左右跳转新页面(我做推送的时候直接 跳转会出现异常异常),这种情况不需要判断当前的 controller2、从第二种方法里边获取信息, 判断当前controller,是否需要push新的页面,或者回到tabbar
下面是 我这边的代码,具体 信息 字段根据你们后台来定
使用到了 类别,方便统一管理
推送平台根据你们自己所使用的来配置 ()
// 接收 远程推送消息后 弹出 新的页面
// 应用未启动的 情况下点击推送消息 进入应用 触发didFinishLaunchingWithOptions 此方法, 并从字典中 获取到推送的相关消息
// 应用已经启动 处于 活跃状态 或 非活跃状态 会触发didReceiveRemoteNotification 此方法, 并从字典中 获取到推送相关消息
首先获取当前的topViewController,通过topViewController实现任意跳转。
- (UIViewController*)topViewController
{
return [self topViewControllerWithRootViewController:self.window.rootViewController];
}
- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController
{
if ([rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController *tabBarController = (UITabBarController *)rootViewController;
return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
} else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navigationController = (UINavigationController*)rootViewController;
return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
} else if (rootViewController.presentedViewController) {
UIViewController* presentedViewController = rootViewController.presentedViewController;
return [self topViewControllerWithRootViewController:presentedViewController];
} else {
return rootViewController;
}
}