iOS实践ios开发进阶程序员

iOS 点击推送消息跳转页面

2017-09-28  本文已影响303人  qiulibi

看标题就应该知道这次的主题是讲点击推送的消息跳转页面的功能,那么有关证书配置及完整的接入推送功能这里就不细说了,不懂的可以看这里

由于收到通知时,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是不一样的,在调试的时候也需要注意一下。

有什么说的不对的地方欢迎大家指正~

上一篇下一篇

猜你喜欢

热点阅读