iOS极光推送开发入门

一、什么叫极光推送

极光推送(JPush)是独立的第三方云推送平台,致力于为全球移动应用开发者提供移动消息推送服务。极光,是国内领先的移动大数据的服务商。拥有开发者服务、广告服务和数据服务三大产品体系,开发者服务助力app精细运营,覆盖极光推送、极光IM、极光短信、极光统计、社会化分享、极光认证,广告服务(极光效果通助力精准营销,数据服务,极光大数据 助力企业运营。
说白了,极光推送类似于我们每天在手机上接收到的消息。那我们怎么在自己的app中实现这种功能呢?

二、实现极光推送的准备工作

准备的工作主要步骤:

第一步:在苹果开发者网站中利用开发者账号创建出app Id,即创建应用程序ID。
第二步:配置极光推送端需要的两种证书:开发证书,生产证书。
第三步:把配置好的证书,传递到极光开发平台上。

详细操作过程:

第一步:创建App ID

1.登录苹果开发者网站,登录开发者账户。

极光推送4.png

2.添加新的APP ID,并填写相关的Name和Bundle ID。


极光推送5.png

极光推送6.png

极光推送7.png

注意:

bundle ID可以翻译成包ID,也可以叫APP ID 或应用ID,它是每一个ios应用的全球唯一标识。无论代码怎么改,图标和应用名称怎么换,只要bundle id没变,ios系统就认为这是同一个应用。每开发一个新应用,首先都需要到member center->identifier->APP IDS去创建一个bundle id。但是bundle id分为两种:
Explicit App ID(明确的APP ID),一般格式是:com.domainname.appname。这种id只能用在一个app上。每一个新应用都要创建一个,其中domainname可以使用公司的缩写,全拼。
Wildcard App ID(通配符APP ID), 一般格式是:com.domainname.*。这种id可以用在多个应用上,虽然方便,但是使用这种id的应用不能使用通知功能,所以并不常用。

3.为创建的APP ID 开启Push Notification功能,已有的appID也可以继续添加Push Notification功能。


极光推送8.png

4.完成以上操作,依次点击Continue,点击Register,完成APP ID的注册。

第二步:配置开发证书,生产证书,以及相关证书的导出

首先要有一个CSR文件(Certificate Signing Request)
1.打开系统里自带的“钥匙串访问”,创建 Certificate Signing Request。


极光推送1.png

极光推送2.png

2.填写“用户邮箱”和“常用名称” ,并选择“存储到磁盘”,证书文件后缀为.certSigningRequest 。


极光推送3.png

配置开发证书流程:
1.开发证书的生成(点击左侧的development)


开发证书0.png

2.点击Continue,来进入到AppId界面


开发证书2.png

3.说明让自己上传的CSR(Certificate Signing Request)文件,然后Continue。


开发证书3.png

4.上传请求生成的CSR文件,然后Continue(如果不知道怎么生成CSR文件,请看这里的链接)

开发证书4.png

5.生成证书后,点击downLoad将证书下载到本地中,后缀为.cer文件。


开发证书5.png

6.点击生成的证书,在钥匙串中打开,导出为.p12文件,并存储到本地。


开发证书6.png

开发证书7.png
开发证书8.png

配置生产证书流程:
1.生产证书的生成(点击左侧的Production),其他的操作步骤都是类似于上面的配置开发证书。


生产证书0.png

生成好的证书展示:


展示1.png
第三步:证书上传极光平台

如果你还没有注册极光账号,请看这里--->连接
在极光官网上登录开发账号,点击极光开发者服务,找到推送设置,选择iOS,选中证书,进行证书的配置。就是一些简单的文件上传,期间可能要输入一些密码,这个密码就是证书导出时候输入的密码,这个千万不要弄错了!

开发证书9.png

至此,一些关于极光推送的准备工作全部完成,接下来就让我们开始在自己的项目中进行实战吧。

三、项目中极光SDK的配置,代码功能的实现

  • 第一步:导入极光SDK

    方法1:可以通过CocoaPods进行导入JPush。

    方法2:手动导入可以参考链接:极光文档-iOS SDK集成指南

  • 第二步:代码功能的实现
    1.进入项目中的appDelegate导入头文件,遵循代理

#import <JPUSHService.h>
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif

<JPUSHRegisterDelegate,UNUserNotificationCenterDelegate>

2.在didFinishLaunchingWithOptions中进行JPush的相关初始化设置

 [self inintJPushWithOption:launchOptions];
-(void)inintJPushWithOption:(NSDictionary *)launchOptions{
    // Override point for customization after application launch.
    //  NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
    //添加APNs代码 JPush的初始化操作
    self.messageSum = 0;
    JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
    entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;
//    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
//        //可以添加自定义categories
//        //    if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
//        //      NSSet<UNNotificationCategory *> *categories;
//        //      entity.categories = categories;
//        //    }
//        //    else {
//        //      NSSet<UIUserNotificationCategory *> *categories;
//        //      entity.categories = categories;
//        //    }
//    }
    //注册极光
    [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
    //如不需要使用IDFA,advertisingIdentifier 可为nil
    // isProduction NO为开发环境,YES为生产环境
    [JPUSHService setupWithOption:launchOptions appKey:appKey
                          channel:channel
                 apsForProduction:isProduction
            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);
        }
    }];
    //☆☆☆ 添加一个notification来捕捉极光的自定义消息 只能在前台展示
    NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
    [defaultCenter addObserver:self selector:@selector(networkDidReceiveMessage:) name:kJPFNetworkDidReceiveMessageNotification object:nil];
    //极光推送的角标问题
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
    [JPUSHService setBadge:0];
  

3.注册DevieceToken

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    /// Required - 注册 DeviceToken
    NSLog(@"system deviceToken is %@",deviceToken);
    [JPUSHService registerDeviceToken:deviceToken];
}

4.接下来我们处理一下极光推送的回调方法

#pragma mark ----- 获取消息数据的处理
//handle JPush customize remote message 处理从服务器端发送来的极光通知
- (void)networkDidReceiveMessage:(NSNotification *)notification{
    
    self.messageSum++;
    NSDictionary * userInfo = [notification userInfo];
    NSString *title = [userInfo valueForKey:@"title"];
    
    //先将jsonStr转换为字典
    NSDictionary *content = [self dictionaryWithJsonString:[userInfo valueForKey:@"content"]];
    
    //来一个url的参数
    self.messageUrl = [content valueForKey:@"messageLink"];
    self.messageNavTitle = [content valueForKey:@"messageName"];
    
    NSString * messageTitle = [content valueForKey:@"messageTitle"];
    NSString * messageContent = [content valueForKey:@"messageContent"];
    
    NSString *messageID = [userInfo valueForKey:@"_j_msgid"];
    NSDictionary *extras = [userInfo valueForKey:@"extras"];
    
    NSString *customizeField1 = [extras valueForKey:@"customizeField1"]; //服务端传递的Extras附加字段,key是自己定义的
    
    NSLog(@"这里获取的参数值title:%@,content:%@,extra:%@,messageID:%lu,messaeTitle:%@,messageContent-%@",title,content,extras,(unsigned long)messageID,messageTitle,messageContent);
    
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    
    [dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
    self.messageTime =  [NSDateFormatter localizedStringFromDate:[NSDate date]
                                   dateStyle:NSDateFormatterNoStyle
                                                       timeStyle:NSDateFormatterMediumStyle];
    
    NSString *currentContent = [NSString
                                stringWithFormat:
                                @"APP代理中收到自定义消息:%@\ntitle:%@\ncontent:%@\nextra:%@\nmessage:%ld\n,messageCount:%d\n",
                                [NSDateFormatter localizedStringFromDate:[NSDate date]
                                                               dateStyle:NSDateFormatterNoStyle
                                                               timeStyle:NSDateFormatterMediumStyle],
                                title, content, [self logDic:extras],(unsigned long)messageID,self.messageSum];
    NSLog(@"代理中获取到数据参数为:%@", currentContent);
    
    //跳转啊 啊啊
   // [self goToMssageViewControllerWith:userInfo];
    

 /**
  * 通过 UNUserNotificationCenter 将自定义的消息推送到前台显示
  */
    
    //建立本地通知,如果程序在后台的时候也会收到推送通知一样的消息。也可以判断在程序在前台的时候做一些特别的操作。
   // [JPUSHService setLocalNotification:[NSDate dateWithTimeIntervalSinceNow:3] alertBody:messageContent badge:1 alertAction:messageTitle identifierKey:nil userInfo:userInfo soundName:nil];

     NSString *dateString = [dateFormatter stringFromDate:[NSDate date]];
    UNMutableNotificationContent * uucontent = [[UNMutableNotificationContent alloc] init];
    uucontent.title = messageTitle;
    uucontent.body = messageContent;
    uucontent.badge = @(self.messageSum);//@(+1);
    NSString *requestIdentifier = [NSString stringWithFormat:@"%@%@",dateString,MANAGER_ID];
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifier                                                                              content:uucontent                                                                             trigger:nil];

    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        //界面的跳转 啊
       // [self goToMssageViewControllerWith:userInfo];
    }];

    //移除通知
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:kJPFNetworkDidLoginNotification
                                                  object:nil];
}

5.iOS10以上接收消息的处理

//iOS 10以上接收消息处理消息
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
      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;  // 推送消息的标题
    
      NSLog(@"iOS10122 点击通知栏收到远程通知:%@", userInfo);
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
        //[self logDic:userInfo]
        NSLog(@"iOS10 点击通知栏收到远程通知:%@", userInfo);
       
        //点击通知栏进行消息界面的跳转 0
        [[UIApplication sharedApplication]setApplicationIconBadgeNumber:0];
        [JPUSHService setBadge:0];//清空Jpush中存储的badge值
        
        //点击消息进行跳转到消息的详情界面中
        [self goToMssageViewControllerWith:userInfo];
        
    }
    else {
        // 判断为本地通知
        NSLog(@"iOS10 收到本地通知:{\nbody:%@,\ntitle:%@,\nsubtitle:%@,\nbadge:%@,\nsound:%@,\nuserInfo:%@\n}",body,title,subtitle,badge,sound,userInfo);
        //处理自定义参数的数据
        //点击通知栏进行消息界面的跳转
        [[UIApplication sharedApplication]setApplicationIconBadgeNumber:0];
        [JPUSHService setBadge:0];//清空Jpush中存储的badge值
         //点击消息进行跳转到消息的详情界面中
        [self goToMssageViewControllerWith:content];
         [JPUSHService handleRemoteNotification:userInfo];
    }
    
    completionHandler();  // 系统要求执行这个方法 UIBackgroundFetchResultNewData
}

四、相关的问题的集中处理

这里可以参考一下链接:极光官方文档-iOS SDK FAQ

至此极光推送部分简单的实现已经全部完成,后面将会继续更新编辑新加的内容。
谢谢观赏!

相关的参考文献:

极光官方文档
极光官方文档-iOS证书设置指南
极光官方文档-iOS SDK集成指南
iOS开发证书的名词解释
2018iOS极光推送完整流程

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

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生x阅读 15,967评论 3 119
  • (2017-02-08-周三 04:12:51) 提取想法内的文件夹(虚拟想法只显示不可修改)
    菜五阅读 124评论 0 0
  • 峰峦叠嶂容山水,油菜花开遍野香。 满目梯田披锦绣,风轻正好赏春光。
    文贝阅读 6,240评论 73 126
  • 啪啪啪,啪啪啪,爸爸又在打我了。至于为什么被打那要从半小时前说起了。 “快跑,快放大招,快打他。”我正在玩手机。“...
    Y竹清WY阅读 1,735评论 3 10