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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,926评论 25 709
  • 极光推送: 1.JPush当前版本是1.8.2,其SDK的开发除了正常的功能完善和扩展外也紧随苹果官方的步伐,SD...
    Isspace阅读 6,807评论 10 16
  • 推送通知 注意:这里说的推送通知跟NSNotification有所区别 NSNotification是抽象的,不可...
    iOS开发攻城狮阅读 4,352评论 1 13
  • 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知...
    莫离_焱阅读 6,590评论 1 8
  • 参加《思考,快与慢》共读活动前,我一直觉得自己是一个主动的人。主动去买书阅读,主动去做工作,主动去锻炼身体...
    叮当_蘭阅读 385评论 1 0