极光推送

网上能找到一堆关于推送的文章,前几天接手其他同事的代码,加功能顺便梳理一下,感觉想要的在官方文档里面都能找到,写的很详细。

极光文档
SDK集成和证书的设置这里不弄了,文档里写的很详细,这里只记录一下相关代码部分。

极光有两种发送消息的机制:自定义消息和通知

  • 自定义消息:
    没有类似通知的横幅声音等,可自定义发送过来的数据格式以及字段。
    而且只有在前端运行的时候才能收到自定义消息的推送。
  • 通知:
    就如我们平时用的通知,格式固定,但也可加扩展字段。

注册

  • 位置
#import "AppDelegate.h"中的 - (BOOL)application: didFinishLaunchingWithOptions: 
如果AppDelegate中代码较多,建议创建一个分类如: AppDelegate+JPush 
在AppDelegate的didFinishLaunchingWithOptions方法中调用,更清晰。
  • 头文件
#import "JPUSHService.h"
#import 
添加代理 
  • 代码
// 初始化APNs代码
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
        //notice: 3.0.0及以后版本注册可以这样写,也可以继续用之前的注册方式
        JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
        entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;
        [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];

    } else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {

        //可以添加自定义categories
        [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert) categories:nil];
    } else {

        //categories 必须为nil
        [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert) categories:nil];
    }
  NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

 // 初始化JPush代码
 [JPUSHService setupWithOption:launchOptions appKey:appKey channel:channel apsForProduction:isProduction advertisingIdentifier:advertisingId];

 //JPush标识此设备的 registrationID。
 [JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {
        if(resCode == 0){
            NSLog(@"registrationID获取成功:%@",registrationID);   
        } else{
            NSLog(@"registrationID获取失败,code:%d",resCode);
        }
    }];

现在iOS11都马上出来了,估计以后也不用再适配8以下的了吧。

  • 注册APNs成功并上报DeviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    //注册 DeviceToken
    [JPUSHService registerDeviceToken:deviceToken];
}

  • 注册失败
#pragma mark  极光注册 失败
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error
          );
}

通知部分

iOS10之后,接到通知:亲测,程序在前台运行时会调用此方法。
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
    NSDictionary * userInfo = notification.request.content.userInfo;
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]])  {
        // iOS 10 Support
        [JPUSHService handleRemoteNotification:userInfo];
    }
    NSLog(@"-------------推送消息4----------------\n%@",userInfo);
    // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置
    completionHandler(UNNotificationPresentationOptionAlert); 
}
iOS10之后,接到通知:亲测,程序在后台、杀死、点击横幅时会调用此方法。
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    // Required
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
    }    
    NSLog(@"-------------推送消息3----------------\n%@",userInfo);
    completionHandler();
}

iOS10之后,程序在前台时也会显示横幅,所以如果有点击横幅跳制定页面的需求可以写在第二个方法中。
所以是当前台收到消息后,会直接调起第一个方法,同时弹出横幅,如果点击横幅,会调用第二个方法。

iOS7之前,没设备,没测
#pragma mark - iOS7以下 接到推送消息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    [JPUSHService handleRemoteNotification:userInfo];
    NSLog(@"-------------推送消息1----------------\n%@",userInfo);
}
iOS7之后
#pragma mark - iOS7及iOS7之后 接到推送消息后操作

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    NSLog(@"%@",userInfo);
    [JPUSHService handleRemoteNotification:userInfo];
    completionHandler(UIBackgroundFetchResultNewData);
    NSLog(@"-------------推送消息2----------------\n%@",userInfo);
}

如果有账号的话可以极光的这个推送试一下


极光推送_第1张图片

极光推送_第2张图片

这里还可以添加扩展字段,Android有专门的扩展字段获取方法,iOS就直接在收到的userInfo

{
    "_j_business" = 1;
    "_j_msgid" = 40532396844772417;
    "_j_uid" = 9734978614;
    aps =     {
        alert = "test seven 1";
        badge = 1;
        sound = default;
    };
    bizType = coupon;
}

自定义消息

自定义消息的接收比较简单,

上面已经说过,只有在前台运行时才能收到通知,但我注意到,当程序在后台或杀死的时候有自定义消息推过来,打开app后依然能够收到。

  // 监听极光推送
    NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
    [defaultCenter addObserver:self selector:@selector(networkDidReceiveMessage:) name:kJPFNetworkDidReceiveMessageNotification object:nil];
#pragma mark 极光推动  获取自定义消息
- (void)networkDidReceiveMessage:(NSNotification *)notification {
   NSDictionary * userInfo = [notification userInfo];
   NSString *content = [userInfo valueForKey:@"content"];
   NSDictionary *extras = [userInfo valueForKey:@"extras"]; 
   NSString *customizeField1 = [extras valueForKey:@"customizeField1"]; //服务端传递的Extras附加字段,key是自己定义的
    ······
    ······
}

也可以通过上面图一中的自定义消息方式发送消息测试。
此方法不一定要在appdelegate,可以放在你希望的位置,切记重复使用。

更新: 2018.07.02

注册(application:didFinishLaunchingWithOptions:)

    JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
    entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
        // 可以添加自定义categories
        // NSSet *categories for iOS10 or later
        // NSSet *categories for iOS8 and iOS9
    }
    [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];

    // Optional
    // 获取IDFA
    // 如需使用IDFA功能请添加此代码并在初始化方法的advertisingIdentifier参数中填写对应值
    NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
    // Required
    // init Push
    // notice: 2.1.5版本的SDK新增的注册方法,改成可上报IDFA,如果没有使用IDFA直接传nil
    // 如需继续使用pushConfig.plist文件声明appKey等配置内容,请依旧使用[JPUSHService setupWithOption:launchOptions]方式初始化。
    NSString *appKey =WISDOM?JPUSH_ID_WISDOM:JPUSH_ID_NORMAK;
    [JPUSHService setupWithOption:launchOptions appKey:appKey
                          channel:channel
                 apsForProduction:FALSE
            advertisingIdentifier:advertisingId];

代理


- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [JPUSHService registerDeviceToken:deviceToken];
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}

#pragma mark iOS 10 Support  添加处理APNs 通知回调方法 通知 程序在前台的时候,调起此方法
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler  API_AVAILABLE(ios(10.0)){
    NSDictionary * userInfo = notification.request.content.userInfo;
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
    }
    NSLog(@"-------------推送消息4----------------\n%@",userInfo);
    completionHandler(UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置
}

#pragma mark iOS 10 Support 通知 程序在后台 杀死 点击横幅时 调用此方法
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler  API_AVAILABLE(ios(10.0)){
    // Required
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
    }
    NSLog(@"-------------推送消息3----------------\n%@",userInfo);
    completionHandler();
}

#pragma mark - 通知清零 iOS7以下 接到推送消息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    [UIApplication sharedApplication].applicationIconBadgeNumber=0;
    [[UIApplication sharedApplication] cancelAllLocalNotifications];
    [JPUSHService handleRemoteNotification:userInfo];
    NSLog(@"-------------推送消息1----------------\n%@",userInfo);
}

#pragma mark - iOS7及iOS7之后 接到推送消息后操作

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    NSLog(@"%@",userInfo);
    [JPUSHService handleRemoteNotification:userInfo];
    completionHandler(UIBackgroundFetchResultNewData);
    NSLog(@"-------------推送消息2----------------\n%@",userInfo);
}

注册Alias (之前没有写这一步) 文档地址

注册了这一步,就可以不使用registrationID,而使用alias来进行推送,
我这里是加在了登录成功之后,使用用户名作为alias。

[JPUSHService setAlias:userName completion:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) {
            NSLog(@"\n----------------%@----------------",iAlias);
        } seq:1];

自定义消息没变

你可能感兴趣的:(极光推送)