iOS 点击推送消息跳转页面
看标题就应该知道这次的主题是讲点击推送的消息跳转页面的功能,那么有关证书配置及完整的接入推送功能这里就不细说了,不懂的可以看这里。
由于收到通知时,APP可能处在不同的状态(未启动、活跃、后台运行),而不同的状态在点击通知栏的通知时所调用的方法不同。
(1)未启动
未启动时,点击通知的回调方法是:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
而对应的通知内容则为
NSDictionary *pushNotificationKey = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
当pushNotificationKey为nil时,说明用户是直接点击APP进入的,如果点击的是通知栏,那么即为对应的通知内容。
(2)启动时(活跃、后台运行)
当APP处在启动状态时,点击通知栏的回调方法是:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
其中userInfo就是对应的通知内容,与未启动时pushNotificationKey是相同的。
如果你的跳转方法是用presentViewController,那么可以直接在AppDelegate中获取当前的根视图,直接调用presentViewController方法进行跳转。如果你的跳转方法需要用到push,那么你的根视图必须包含有UINavigationController,否则将推不过去。
在我的项目上,我的根视图是UITabBarController,我通过UITabBarController当前选中的视图控制器,判断当前选中的视图控制器是否是UINavigationController,如果是就直接跳转到需要的页面。
我接收到通知后的代码如下
- (void)receiveNotification:(NSDictionary *)userInfo {
self.userInfo = userInfo;
[XGPush handleReceiveNotification:userInfo
successCallback:^{
NSLog(@"信鸽收到推送成功");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
if ([self.startVC isKindOfClass:[MainTabBarViewController class]]) {
MainTabBarViewController *mainTab = (MainTabBarViewController *)self.startVC;
if ([mainTab.selectedViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController *nav = (UINavigationController *)mainTab.selectedViewController;
if ([nav.topViewController isKindOfClass:[UserProtoccolViewController class]]) {
UserProtoccolViewController *protocolVC = (UserProtoccolViewController *)nav.topViewController;
if (protocolVC.isMessageDetail == YES) {
return;
}
}
UIStoryboard *LoginStoryBoard = [UIStoryboard storyboardWithName:@"Login" bundle:nil];
UserProtoccolViewController *protoccolVC = [LoginStoryBoard instantiateViewControllerWithIdentifier:@"UserProtoccol"];
protoccolVC.titleStr = self.userInfo[@"title"];
protoccolVC.url = self.userInfo[@"detailUrl"];
protoccolVC.isMessageDetail = YES;
[nav pushViewController:protoccolVC animated:YES];
}
}
});
} errorCallback:^{
NSLog(@"信鸽收到推送失败");
}];
}
这个方法中参数userInfo就是前面说到的通知内容,startVC是根视图。userInfo中的键值对未必和我这里的列子一样,这个可以让后台传你需要的参数。
这样,点击推送消息跳转页面功能就完成啦!不过我这里还需要在啰嗦一句,就是后台做推送的时候一定要注意证书的选择,从App Store上下载下来的一定要用生产证书,其他时候(如真机调试)要用开发证书,否则将收不到推送。还有一个问题,我也是今天才发现的,就是从App Store上下载的和真机调试的虽然用的是同一部手机,但是token是不一样的,在调试的时候也需要注意一下。
有什么说的不对的地方欢迎大家指正~