极光推送集成开发

1.极光推送集成与设置

极光推送地址
①注册极光推送账号。
②在应用管理内按照步骤创建APP。
③找到“文档——iOS——iOS证书设置指南”内容,根据iOS证书设置指南,在苹果开发中心,生成开发环境证书与生产环境证书,导出并且配置极光后台管理(推送设置)。
④下载文档,集成到项目中。根据“文档——iOS——iOS SDK集成指南”将极光的资源文件以及配制信息设置完成。

2.项目内代码

①在AppDelegate.m中导入极光推送头文件

// 引入JPush功能所需头文件
#import "JPUSHService.h"
// iOS10注册APNs所需头文件
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif
//如果需要使用idfa功能所需要引入的头文件(可选)
//#import <AdSupport/AdSupport.h>

②注册极光推送服务并调用代理方法

@interface AppDelegate ()<JPUSHRegisterDelegate>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
//极光推送
    //notice: 3.0.0及以后版本注册可以这样写,也可以继续用之前的注册方式
    JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
    entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
        // 可以添加自定义categories
        // NSSet<UNNotificationCategory *> *categories for iOS10 or later
        // NSSet<UIUserNotificationCategory *> *categories for iOS8 and iOS9
    }
    //实现极光代理方法
    [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
    
    
    
    // init Push 初始化推送
    // notice: 2.1.5版本的SDK新增的注册方法,改成可上报IDFA,如果没有使用IDFA直接传nil
    // 如需继续使用pushConfig.plist文件声明appKey等配置内容,请依旧使用[JPUSHService setupWithOption:launchOptions]方式初始化。
    [JPUSHService setupWithOption:launchOptions appKey:@"a7601f4c7f018afee89d57c1"
                          channel:@"App Store"
                 apsForProduction:1
            advertisingIdentifier:nil];
    
    //2.1.9版本新增获取registration id block接口。
    [JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {
        if(resCode == 0){
            NSLog(@"registrationID获取成功:%@",registrationID);
        }
        else{
            NSLog(@"registrationID获取失败,code:%d",resCode);
        }
    }];

}

③实现极光代理方法(包含版本兼容以及前台后台收到推送消息,做对应页面跳转功能)

#pragma mark -
#pragma mark JPUSHRegisterDelegate
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    //Required - 注册 DeviceToken
    [JPUSHService registerDeviceToken:deviceToken];
    
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    //Optional -注册失败
    NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}
// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler
{
    //[self showAlertViewMessage:@"1"];
    //Required
    NSDictionary * userInfo = notification.request.content.userInfo;
    
    UNNotificationRequest *request = notification.request; // 收到推送的请求
    UNNotificationContent *content = request.content; // 收到推送的消息内容
    
    NSNumber *badge = content.badge;  // 推送消息的角标
    NSString *body = content.body;    // 推送消息体
    UNNotificationSound *sound = content.sound;  // 推送消息的声音
    NSString *subtitle = content.subtitle;  // 推送消息的副标题
    NSString *title = content.title;  // 推送消息的标题
    
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
        
    }
    else {
        // 判断为本地通知
        NSLog(@"iOS10 前台收到本地通知:{\nbody:%@,\ntitle:%@,\nsubtitle:%@,\nbadge:%@,\nsound:%@,\nuserInfo:%@\n}",body,title,subtitle,badge,sound,userInfo);
    }
    completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以设置
}

// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler
{
    //[self showAlertViewMessage:@"2"];
    //Required
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    
    UNNotificationRequest *request = response.notification.request; // 收到推送的请求
    UNNotificationContent *content = request.content; // 收到推送的消息内容
    
    NSNumber *badge = content.badge;  // 推送消息的角标
    NSString *body = content.body;    // 推送消息体
    UNNotificationSound *sound = content.sound;  // 推送消息的声音
    NSString *subtitle = content.subtitle;  // 推送消息的副标题
    NSString *title = content.title;  // 推送消息的标题
    
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
    
        [self jumpToViewControllerApplication:nil userInfo:userInfo];
        
    }
    else {
        // 判断为本地通知
        NSLog(@"iOS10 收到本地通知:{\nbody:%@,\ntitle:%@,\nsubtitle:%@,\nbadge:%@,\nsound:%@,\nuserInfo:%@\n}",body,title,subtitle,badge,sound,userInfo);
    }
    completionHandler();// 系统要求执行这个方法
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    //[self showAlertViewMessage:@"3"];
    //Required,iOS 7 Support
    [JPUSHService handleRemoteNotification:userInfo];
    completionHandler(UIBackgroundFetchResultNewData);
    DLog(@"字典内容是:%@",userInfo);
    
    // 应用在前台 或者后台开启状态下,不跳转页面,让用户选择。
    if (application.applicationState == UIApplicationStateActive || application.applicationState == UIApplicationStateBackground)
    {
        //[self showAlertViewMessage:@"5"];
        NSLog(@"acitve or background");
        //应用处于前台收到推送的时候
        UIAlertView *alertView =[[UIAlertView alloc]initWithTitle:@"钢圈提示" message:userInfo[@"aps"][@"alert"] delegate:self cancelButtonTitle:@"好的" otherButtonTitles:nil, nil];
        [alertView show];
    }
    else//杀死状态下,直接跳转到想要跳转的页面。
    {
        //[self showAlertViewMessage:@"6"];
        Singleton * singleton = [Singleton singleton];
        NSDictionary * jsonDic = [self dictionaryWithJsonString:[userInfo objectForKey:@"mainType"]];
        //不在这里做跳转,只是保存远程推送给的信息,在进入了页面的时候跳转对应页面
        if ([jsonDic[@"info"] isEqualToString:@"order"])
        {
            NSString * extrasStr = [self stringWithJsonString:[userInfo objectForKey:@"extras"]];
            //订单详情页面
            singleton.tabbar = @"0";
            singleton.page = @"1";
            singleton.orderID = extrasStr;
            singleton.badge = [userInfo[@"aps"][@"badge"] integerValue];
        }
        //用于点击推送消息进入app时,tabbar选择以及跳转的代码设置(主要是tabbar已经创建,不会按照正常层级关系进入app,这里做特殊设置改变app状态)
        self.mainTabbarCtl = [MainTabbarViewController new];
        self.mainTabbarCtl.selectedIndex = singleton.tabbar.integerValue;
        //[self.mainTabbarCtl.tabbar selectIndex:singleton.tabbar.integerValue];
        self.window.rootViewController = self.mainTabbarCtl;
        [self chooseRootController:self.mainTabbarCtl];
        
        
        //每次点击一个消息就消失一个
//        [[UIApplication sharedApplication] setApplicationIconBadgeNumber:[userInfo[@"aps"][@"badge"] integerValue]-1];
//        [JPUSHService setBadge:[userInfo[@"aps"][@"badge"] integerValue]-1];
    }
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    //[self showAlertViewMessage:@"4"];
    //Required,For systems with less than or equal to iOS6
    [JPUSHService handleRemoteNotification:userInfo];
}
#pragma mark - 跳转到指定界面(iOS10)
-(void)jumpToViewControllerApplication:(UIApplication *)application userInfo:(NSDictionary *)userInfo
{
    // 应用在前台 或者后台开启状态下,不跳转页面,让用户选择。
//    if (application.applicationState == UIApplicationStateActive)
//    {
//        NSLog(@"acitve or background");
//        //应用处于前台收到推送的时候
//        UIAlertView *alertView =[[UIAlertView alloc]initWithTitle:@"钢圈提示" message:userInfo[@"aps"][@"alert"] delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"立即查看", nil];
//        [alertView show];
//    }
//    else//杀死状态下,直接跳转到想要跳转的页面。
//    {
//        //        WGLoginController *VC = [WGLoginController new];
//        //        UINavigationController *na = [[UINavigationController alloc] initWithRootViewController:VC];
//        //        [self.mainTabbarCtl presentViewController:VC animated:YES completion:nil];
//        //不在这里做跳转,只是发送通知消息,在进入了页面的时候跳转对应页面
//        if ([userInfo[@"mainType"] isEqualToString:@"order"] )
//        {
//            notificationDic = @{@"tabbar":@"0", @"page":@"1"};//订单页面
//        }
//        [[NSNotificationCenter defaultCenter] postNotificationName:@"tiaozhuan" object:nil userInfo:notificationDic];
//    }
    
    Singleton * singleton = [Singleton singleton];
    NSDictionary * jsonDic = [self dictionaryWithJsonString:[userInfo objectForKey:@"mainType"]];
    //不在这里做跳转,只是保存远程推送给的信息,在进入了页面的时候跳转对应页面
    if ([jsonDic[@"info"] isEqualToString:@"order"])
    {
        NSString * extrasStr = [self stringWithJsonString:[userInfo objectForKey:@"extras"]];
        //订单详情页面
        singleton.tabbar = @"0";
        singleton.page = @"1";
        singleton.orderID = extrasStr;
    }
    //用于点击推送消息进入app时,tabbar选择以及跳转的代码设置(主要是tabbar已经创建,不会按照正常层级关系进入app,这里做特殊设置改变app状态)
    self.mainTabbarCtl = [MainTabbarViewController new];
    self.mainTabbarCtl.selectedIndex = singleton.tabbar.integerValue;
    //[self.mainTabbarCtl.tabbar selectIndex:singleton.tabbar.integerValue];
    self.window.rootViewController = self.mainTabbarCtl;
    [self chooseRootController:self.mainTabbarCtl];
}
#pragma mark-
#pragma JSON字符串转化为字典
//JSON字符串转化为字典
-(NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString
{
    if (jsonString == nil) {
        return nil;
    }
    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    NSError *err;
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
    if(err)
    {
        NSLog(@"json解析失败:%@",err);
        return nil;
    }
    return dic;
}
//JSON字符串转化为字符串(截取字符串方式)
-(NSString *)stringWithJsonString:(NSString *)jsonString
{
    if (jsonString == nil) {
        return nil;
    }
    NSString * string = jsonString;
    NSRange range = NSMakeRange(1, string.length-2);
    string = [string substringWithRange:range];
    return string;
}
#pragma mark -
#pragma mark 消息提醒(方法是否进入提醒)
-(void)showAlertViewMessage:(NSString *)message
{
    UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"进入方法提示" message:message delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
    [alert show];
}

3.总结

①极光推送包含跳转对应页面、推送badges数正确显示功能。可以点击跳转浏览详细文章。
②极光推送在合适的位置消角标

//app角标
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:badges];
//向服务器发送推送角标清零请求操作
//极光推送设置清角标
[JPUSHService setBadge:badges];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 不同版本极光推送SDK集成各有差异,集成时一定要注意版本号,楼主已将博文更新成最新的SDK JPush v3.0....
    i顺颂时宜阅读 7,840评论 37 170
  • 版本记录 前言   现在很多APP都有推送功能,其中极光推送就是很多APP的首选。我们最近的几个APP也是用的极光...
    刀客传奇阅读 8,360评论 0 8
  • ** Tips:** 不同版本极光推送SDK集成各有差异,各位童鞋在集成时一定要注意版本号,本人集成的是基于 极光...
    anyurchao阅读 2,401评论 3 26
  • 极光推送: 1.JPush当前版本是1.8.2,其SDK的开发除了正常的功能完善和扩展外也紧随苹果官方的步伐,SD...
    Isspace阅读 6,694评论 10 16
  • 版本记录 前言 前一篇已经对ios的SDK进行了研究,这一篇则对iOS SDK 常见问题进行说明。1. 极光推送集...
    刀客传奇阅读 1,191评论 0 1