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

远程消息推送:2-获取推送消息内容

在远程推送消息中,可以携带一些信息。当用户点击推送消息进入App后,我们可以获取到推送消息中携带的内容,从而可以根据不同的消息内容做一些后续的操作。

获取推送消息中携带的内容,都需要在AppDelegate中添加相关的代码,但不同的iOS版本,使用的方法有一定的差别,我们分别做介绍,以使用极光推送为例。

iOS10

在iOS10中,引入了UserNotifications Framework框架,在该框架中,提供了userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:方法,当用户通过推送消息打开App时会调用该方法,在该方法中可以获取推送消息的内容。

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler;

在该方法中,通过参数response可以获得推送消息的内容,示例代码如下所示:

    NSDictionary * userInfo = response.notification.request.content.userInfo;
    NSLog(@"%@",userInfo);

在极光推送SDK中,也对该方法进行了封装,封装在JPUSHRegisterDelegate协议中,所以,我们也可以直接调用极光推送封装的方法,如下所示:

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

运行结果如下:

iOS7及以上版本

在iOS7~iOS9版本中,我们也可以使用如下的方法来获取userInfo

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;

iOS6及以下版本

在iOS6及以下版本中,如果App状态为正在前台或者点击通知栏的通知消息,那么如下函数将被调用,并且可通过AppDelegate的applicationState是否为UIApplicationStateActive判断程序是否在前台运行。此种情况在此函数中处理:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;

在didFinishLaunchingWithOptions:方法中获取

在AppDelegate.m中的didFinishLaunchingWithOptions:方法中,我们也可以获取到推送消息内容。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions;

如果App状态为未运行,此方法将被调用,如果参数launchOptions中包含UIApplicationLaunchOptionsRemoteNotificationKey表示用户点击推送消息通知导致app被启动运行;如果不含有对应键值则表示 App 不是因点击推送消息通知而被启动,可能为直接点击icon被启动或其他。

NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];