免费开源的iOS开发学习平台

远程消息推送:3-打开指定界面(自定义消息内容)

在我们收到远程推送消息时,点击该消息,默认情况下,会打开该App的首页,但通常情况下,我们希望打开特定的一个界面。例如,点击新闻类App的推送消息会打开某条新闻;社交类App的推送消息,会打开与某人的聊天界面。这就需要在推送消息中携带自定义消息内容,例如某条新闻的url,当用户点击消息打开App时,即可根据消息中携带的自定义内容,打开特定的控制器(界面)。

自定义消息内容

在第三方消息推送服务平台上,我们可以为需要推送的消息中添加附加信息。以极光推送为例,在发送消息界面,点开可选设置,在其中的附加字段,我们可以添加在推送消息中可以携带的自定义内容,这些内容都保存在userInfo属性中。

如下图所示,我们新增了两个自定义内容weburl以及slogan

获取自定义消息内容

远程推送消息的内容,都存储在userInfo属性中,该属性是一个字典类型的对象,因此,我们可以通过键值来取出对应的值。我们以iOS10为例,当用户点击远程消息时,如下方法会被调用。

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    // Required
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    NSLog(@"%@",userInfo);
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    [JPUSHService handleRemoteNotification:userInfo];
    }
    completionHandler();  // 系统要求执行这个方法
}

打印userInfo,可以看到除了默认的信息外,自定义的两个信息weburl以及slogan也被传递到手机上。

打开指定的控制器

didReceiveNotificationResponse:withCompletionHandler:方法中,我们可以按照如下步骤打开指定的控制器:

  • 获取远程推送消息中携带的自定义信息,用于获取需要展示的内容
  • 实例化需要打开的控制器对象,并初始化
  • 获取当前根控制器,并打开新控制器

例如,我们打开一个新的UIViewController对象,如下所示。实际情况下,更多的是打开一个导航控制器管理下的子控制器,原理是一致的。

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    // 获取推送消息中携带的信息
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    NSLog(@"%@",userInfo);
    
    //打开新控制器
    UIViewController *newVc = [[UIViewController alloc] init];
    newVc.view.backgroundColor = [UIColor redColor];
    [self.window.rootViewController presentViewController:newVc animated:YES completion:nil];
    
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
    }
    completionHandler();  // 系统要求执行这个方法
}