Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >推送-JPush(极光推送)的使用

推送-JPush(极光推送)的使用

作者头像
進无尽
发布于 2018-09-12 10:13:47
发布于 2018-09-12 10:13:47
6.9K10
代码可运行
举报
文章被收录于专栏:進无尽的文章進无尽的文章
运行总次数:0
代码可运行

前言

推送服务可以说是所有 App 的标配,不论是哪种类型的 App,推送都从很大程度上决定了 App 的 打开率、使用率、存活率 。因此,熟知并掌握推送原理及方法,对每一个开发者来说都是必备技能,对每一个依赖 App 的公司来说都至关重要。本文主要讨论项目中使用极光推送来实现推送业务。

为什么要使用第三发推送

自己做推送从开发成本上来说需要专人进行开发,并且需要一定数量的服务器和带宽支持,在开发完成后的使用过程中还需要有专人进行维护。 但是如果使用第三方,你只需要集成SDK就可以实现功能,不仅减小了开发成本与维护成本,甚至在推送稳定性上第三方也会比自己做的推送更好一些。第三方推送目前开始尝试精准推送,说白了就是将不同的内容推送给不同的人群,比如将北京的新闻推送给北京的用户。 现在做第三方推送的服务提供商有百度云推送、友盟推送、极光推送等,各有各的优势,但是实现底层都差不多。因此除非公司特别大,特别有实力,不然使用第三方推送服务提供商要远比自己开发好的多。

源码实现推送服务

注册推送
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 引 JPush功能所需头 件
#import "JPUSHService.h"
// iOS10注册APNs所需头 件
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif

<JPUSHRegisterDelegate>


- (void)appSetForLaunchOptions :(NSDictionary *)launchOptions
{
    //*******************************************************************
    
    // Required
    // 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];
    
    
    // Required
    // init Push
    // notice: 2.1.5版本的SDK新增的注册 法,改成可上报IDFA,如果没有使 IDFA直接传nil
    // 如需继续使 pushConfig.plist 件声明appKey等配置内容,请依旧使 [JPUSHService setupWithOption:launchOptions] 式初始化。
    [JPUSHService setupWithOption:launchOptions
                           appKey:@"a8731XXXXXXXXXXXXXXXX"
                          channel:@"App Store"
                 apsForProduction:0
            advertisingIdentifier:nil];
    
    
    [JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID)     {
        if(resCode == 0){
            NSLog(@"registrationID获取成功:%@",registrationID);
            [[MethodTool shareTool]setUserDefaults:registrationID :@"registrationID"];
        }
        else{
            NSLog(@"registrationID获取失败,code:%d",resCode);
        }
    }];
    
    //*******************************************************************
}
  
 // 调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [self appSetForLaunchOptions:launchOptions];
}

#pragma mark ----------------------推送注册结果返回--------------

- (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 系统之前

这个系统级别的方法,被触发的条件:

  • 程序在前台收到推送 (不会有顶部横条提示)
  • 通过点击推送启动程序
  • iOS10的静默式推送
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//ios 7 前端 、点击、静默式推送有   包括iOS10的静默式推送
  - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    
    NSLog(@"fetchCompletionHandler: /n %@",userInfo);
    
    [[MethodTool shareTool]setUserDefaults:@"推送后台" :@"tuisong" ];
    
    // Required, iOS 7 Support
    [JPUSHService handleRemoteNotification:userInfo];
    completionHandler(UIBackgroundFetchResultNewData);
    
    [JPUSHService setBadge:0];//清空JPush服务器中存储的badge值。
    [self getMessageDetail:[[MethodTool shareTool]cleanData:userInfo[@"fid"]]];
}

这个方法可以不用实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    // Required,For systems with less than or equal to iOS6
    
    NSLog(@"didReceiveRemoteNotification: /n %@",userInfo);
    [JPUSHService handleRemoteNotification:userInfo];
}
iOS 10 系统及其之后

这个方法是推送横幅出现之前会被调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// iOS 10 Support  
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger)
                                                                                                                                                 )completionHandler {
    // Required
    NSDictionary * userInfo = notification.request.content.userInfo;
    NSLog(@"111111  didReceiveNotificationResponse: /n %@",userInfo);
    
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]
        ]) {
        [JPUSHService handleRemoteNotification:userInfo];
    }
    completionHandler(UNNotificationPresentationOptionAlert);
    
}

这个方法被触发的条件:

  • 程序在前台受收到推送 ,会有顶部横条提示,点击横幅时
  • 通过点击推送启动程序时
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// iOS 10 Support
- (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];
    }
    completionHandler(); // 系统要求执 这个 法
    
    [JPUSHService setBadge:0];//清空JPush服务器中存储的badge值。
    [self getMessageDetail:[[MethodTool shareTool]cleanData:userInfo[@"fid"]]];
    
}
注销角标
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 - (void)applicationDidEnterBackground:(UIApplication *)application {
      [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
}

极光推送注意事项

  • 集成的时候具体参考iOS SDK集成指南
  • registrationID 只需要在登录时跟账号绑定,在退出的时候跟账号解绑(账号绑定的registrationID为空即可)。如果不在退出的时候清空registrationID,会出现账号退出仍然给该账号发送指定推送的Bug。 registrationID 不会随便改变,在每次登陆后绑定一个就够了。在APP卸载后就会发生改变。
  • 使用极光推送平台时,添加附加字段

APP收到的推送信息 { "_j_business" = 1; "_j_msgid" = 36028797200845676; "_j_uid" = 6126767282; aps = { alert = "\U6d4b\U8bd5"; badge = 1; sound = default; }; fid = 1; }

  • 使用极光推送平台实现静默式推送

静默式推送

  • 后台式推送需要开启后台模式

Paste_Image.png

  • 下面的代码一直执行不了,并且在控制台打印,JIGUANG服务器链接失败,我还以为是我的证书失效了,APPKEY变化了,纠结了一会,过一会居然自动好了,推测是极光服务器异常造成的注册registrationID 没有响应。 [JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) { if(resCode == 0){ NSLog(@"registrationID获取成功:%@",registrationID); [[MethodTool shareTool]setUserDefaults:registrationID :@"registrationID"]; } else{ NSLog(@"registrationID获取失败,code:%d",resCode); } }];
  • 系统推送授权弹框是否允许,如果你选允许,就会走下面第一条代理,上传完 deviceToken 极光会进行下一步 registrationID 的注册返回。 - (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设备是开发环境还是生产环境。

image.png

  • 获取App 运行状态: UIApplicationState state = [UIApplication sharedApplication].applicationState; 说明: UIApplication.h typedef NS_ENUM(NSInteger, UIApplicationState) { UIApplicationStateActive, UIApplicationStateInactive, UIApplicationStateBackground } NS_ENUM_AVAILABLE_IOS(4_0); 1、判断如何启动App 启动App时会自动调用didFinishLaunchingWithOptions方法:如果launchOptions包含UIApplicationLaunchOptionsRemoteNotificationKey ,则表示用户是通过点击APNs 启动App; 如果不含有对应键值,则表示用户可能是直接点击icon启动App。 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // apn 内容获取:NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey] ... } 3、示例代码: // iOS 6 Remote Notificatio - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { // 取得 APNs 标准信息内容 NSDictionary *aps = [userInfo valueForKey:@"aps"]; NSString *content = [aps valueForKey:@"alert"]; //推送显示的内容 NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; //badge数量 NSString *sound = [aps valueForKey:@"sound"]; //播放的声音 // 取得Extras字段内容 NSString *customizeField1 = [userInfo valueForKey:@"customizeExtras"]; //服务端中Extras字段,key是自己定义的 NSLog(@"content =[%@], badge=[%d], sound=[%@], customize field =[%@]",content,badge,sound,customizeField1); }
  • 更新了程序,再次安装后还是没有推送能收到?
    • 关机重启手机
    • 卸载这个程序重新安装(很关键,大部分因为这)

    彻底杀掉程序,点击通知进入应用会加载 application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 然后才会加载通知的点击事件。

给用户设置标签

消息推送,有时候只想推送给指定的人或者指定的版本,那么这时候我们就需要对设备设置标签或者别名了,这样推送的时候可以根据标签或者别名推送给指定的用户

极光设置标签官方文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //设置极光标签
 [JPUSHService setTags:[NSSet setWithObject:@"yk"]callbackSelector:@selector(tagsAliasCallback:tags:alias:) object:self];

  //设置标签的回调
- (void)tagsAliasCallback:(int)iResCode
                 tags:(NSSet *)tags
                alias:(NSString *)alias {
NSLog(@"TagsAlias回调:%d", iResCode);

       // 0 的时候是设置成功了。
}

小结

在实际的产品和运营中经常是使用组合技巧: Push,短信,微信推送组合协同,提高效率。可以在服务端来统计分析用户行为,然后将指定的 tags 发送至手机,手机接收后再为用户打上对应的 tags。这样就可以做到定向产品推广了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.11.01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
推荐使用 腾讯官方 移动推送服务: https://cloud.tencent.com/product/tpns
推荐使用 腾讯官方 移动推送服务: https://cloud.tencent.com/product/tpns
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
极光推送的角标问题——让人又爱又恨的小红点
我们现在无论何时拿出自己的手机,解锁后的主页上,总能看到一个个的小红点,仿佛在呐喊:有消息啦,不管重不重要,快点我,快来消除我。
Iris_jay
2019/04/18
4.3K1
iOS 点击推送消息跳转指定界面 —总结篇app 在后台app被杀死
收到推送的准备: 首先至于说消息推送的原理,证书配置等等这些我在这里就不在累述,有很多写的很好的文章相信您已经可以搞定这块,这里我重点讲下各种情况下的跳转处理。 点击推送触发的几个方法: ios7.0之前 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ // App 收到推送的通知 NSLog(@"********** ios7.
陈雨尘
2018/06/07
8.7K1
app推送-极光推送
现在可以集成各大厂商都自己研发的推送方式,比如小米推送、华为推送。他们自己推送肯定在自己的手机能收到,还有就是只要你有钱什么都能解决。。。。。
猿码优创
2019/07/28
4.6K1
iOS集成极光推送iOS集成极光推送
苹果APNs(英文全称:Apple Push Notification Service)
hrscy
2018/08/30
3.2K0
iOS集成极光推送iOS集成极光推送
iOS集成友盟推送
#2. Enable Push NotificationSerivice, 并创建和下载开发/发布推送证书
周希
2019/10/15
2.4K0
iOS 10前后两种本地通知
远程通知是指服务器发出的通知,通过苹果的推送然后到达用户设备。本地通知是指不通过网络,直接安装应用后就可以接到通知了,典型的例子是日历、待办、闹钟等应用。
Cloudox
2021/11/23
1.4K0
iOS 10前后两种本地通知
推送-iOS本地通知
从 iOS 10 新增的 UserNotifications Framework 可以发现,Apple 整合了原有散乱的 API,并且增加了许多强大的功能。以 Apple 官方的角度来看,也必然是相当重视推送服务对 App 的影响、以及对 Apple iOS 生态圈长远发展的影响。
進无尽
2018/09/12
8K1
推送-iOS本地通知
iOS推送如何实现的?
从图中可以很清楚的看出来推送的原理主要分为以下几步: 1.由App向iOS设备发送一个注册通知,用户需要同意系统发送推送。 2.iOS向APNs远程推送服务器发送App的Bundle Id和设备的UDID。 3.APNs根据设备的UDID和App的Bundle Id生成deviceToken再发回给App。 4.App再将deviceToken发送给远程推送服务器(自己的服务器), 由服务器保存在数据库中。 5.当自己的服务器想发送推送时, 在远程推送服务器中输入要发送的消息并选择发给哪些用户的deviceToken,由远程推送服务器发送给APNs。 6.APNs根据deviceToken发送给对应的用户。 · APNs 服务器就是苹果专门做远程推送的服务器。 ·deviceToken是由APNs生成的一个专门找到你某个手机上的App的一个标识码。 · deviceToken 可能会变,如果你更改了你项目的bundle Identifier或者APNs服务器更新了可能会变。
赵哥窟
2020/06/16
1.2K0
APNs推送
即时通讯中需要对离线消息进行接收,此时就需要离线推送即当应用没有退出登录的情况下,被系统或者用户杀掉进程仍然能收到IMSDK消息提醒。云通讯iOS客户端采用的是APNs推送服务,以下提供整个处理流程及参考代码。
腾讯视频云-Zachary
2019/09/07
2.4K0
APNs推送
iOS初步集成极光推送后你还要做这些事
当我们把推送证书配置好再把极光SDK拖入项目配置,然后注册极光推送,完成代理,这样没有太多意外你就能收到消息了,但是我们都知道还需要做一些处理,都是哪些呢? ● 当收到消息时,app在前台如何处理 ● 在后台如何处理? ● 未启动如何处理? ● 当app在前台收到消息如何跳转到指定页面? ● 在后台收到系统通知,点击通知栏又如何跳转指定页面? ● 未启动时点击通知栏又如何跳转指定页面? ● 收到自定义通知如何显示? ● 怎么给指定用户发送消息? ● 当有多个类型通知的时候,怎么拿到服务
Raindew
2018/06/14
3.1K0
AppDelegate减负之常用三方封装 - 友盟推送篇
http://www.cnblogs.com/zhouxihi/p/6533058.html
周希
2019/10/15
8400
【IOS开发进阶系列】远程消息推送专题
        Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务器。
江中散人_Jun
2023/10/16
1K0
【IOS开发进阶系列】远程消息推送专题
ios入门之消息推送
前言 在去年的苹果大会上,苹果带来的iOS 10 系统中将之前繁杂的推送通知统一成UserNotifications.framework 来集中管理和使用通知功能,还增加一些实用的功能——撤回单条通知、更新已展示通知、中途修改通知内容、在通知中显示多媒体资源、自定义UI等功能。 那么在ios10之前,ios的消息推送是怎么分类的呢? ios 10之前 在ios之前,iOS推送分为Local Notifications(本地推送) 和 Remote Notifications(远程推送)。 本地推送 不需
xiangzhihong
2018/02/06
2.2K0
ios入门之消息推送
分分钟搞定IOS远程消息推送 原
IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://my.oschina.net/u/2340880/blog/405491这篇博客中有详细的介绍,这里主要讨论远程推送的流程与配置过程。
珲少
2018/08/15
1.3K0
分分钟搞定IOS远程消息推送
                                                                            原
iOS 远程推送概念相关准备工作代码实现:(前提:确保bundleID和网站的配置一样)AppDelegate中的全部代码
概念相关 1.什么是远程推送通知? 顾名思义,就是从远程服务器推送给客户端的通知(需要联网) 远程推送服务,又称为APNs(Apple Push Notification Services) 2.为什么需要远程推送通知? 传统获取数据的局限性:只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容 远程推送通知可以解决以上问题:不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知 3.所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接 什么是长连接?
用户2141756
2018/05/18
2.1K0
了解iOS消息推送一文就够:史上最全iOS Push技术详解
1)在线Push:比如QQ、微信等IM界面处于前台时,聊天消息和指令都会通过IM自建的网络长连接通道推送过来,这种Push在本文中暂且称为“在线Push”;
JackJiang
2018/08/29
25.4K1
iOS 开发之实现 App 消息推送(最新)[通俗易懂]
好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适)
全栈程序员站长
2022/08/22
5.7K0
iOS 开发之实现 App 消息推送(最新)[通俗易懂]
推送-推送原理性说明
我们在实现推送功能的时候,更需要了解下推送的原理机制,这样我们在发现问题时候才好定位到问题的解决办法。
進无尽
2018/09/12
4.4K0
推送-推送原理性说明
iOS 10 消息推送(UserNotifications)秘籍总结
单独整理消息通知的内容,但是因为工(就)作(是)的(很)事(懒)没有更新文章,违背了自己的学习的初衷。因为互联网一定要有危机意识,说不定眼一睁,我们就欧了 。
java爱好者
2019/06/19
3K0
iOS开发——推送跳转到指定页面
眨眼2016年就这么走到了结尾,再过两天新年就要开始了。回顾从2016年开始养成的写博客的习惯,一直能延续下来,保持了一整年,还是比较欣慰的一件事情。希望2017年自己的技术能够继续稳步的提升。
Originalee
2018/08/30
2.1K0
相关推荐
极光推送的角标问题——让人又爱又恨的小红点
更多 >
交个朋友
加入[跨境业务] 腾讯云官方方案交流站
共享跨境方案指南 洞察行业动向
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验