前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >推送-JPush(极光推送)的使用

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

作者头像
進无尽
发布2018-09-12 18:13:47
6.4K1
发布2018-09-12 18:13:47
举报
文章被收录于专栏:進无尽的文章進无尽的文章

前言

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

为什么要使用第三发推送

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

源码实现推送服务

注册推送
// 引 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的静默式推送
//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"]]];
}

这个方法可以不用实现

- (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 系统及其之后

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

// 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);
    
}

这个方法被触发的条件:

  • 程序在前台受收到推送 ,会有顶部横条提示,点击横幅时
  • 通过点击推送启动程序时
// 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"]]];
    
}
注销角标
 - (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 然后才会加载通知的点击事件。

给用户设置标签

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

极光设置标签官方文档

 //设置极光标签
 [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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 为什么要使用第三发推送
  • 源码实现推送服务
  • 极光推送注意事项
  • 给用户设置标签
    • 小结
    相关产品与服务
    短信
    腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档