JPush(极光推送)实战总结

简介: 关于JPush极光推送是国内的服务厂商提供的一站式push服务(同时支持iOS、android),后面也加入了即时通讯的能力供app使用。致力于打造简单、可靠、价格有竞争力的服务(简单功能全免费,高级版才收费),让应用开发商可以聚焦业务开发,push相关的技术实现全部通过极光推送来解决,仅需调用极光推送的api即可。

关于JPush

极光推送是国内的服务厂商提供的一站式push服务(同时支持iOS、android),后面也加入了即时通讯的能力供app使用。致力于打造简单、可靠、价格有竞争力的服务(简单功能全免费,高级版才收费),让应用开发商可以聚焦业务开发,push相关的技术实现全部通过极光推送来解决,仅需调用极光推送的api即可。正因为如此,开发者小伙伴们对其的评价相当不错。笔者的app新增了从服务器往移动客户端下发简单消息的需求,多方权衡下,我们准备尝试jpush的服务来解决问题(这里仅介绍iOS端的集成过程)。

集成步骤

step1:去极光推送注册账号:https://www.jpush.cn/,并注册应用。

step2:上传apns证书到极光,apns证书的生成步骤参考:

http://docs.jpush.io/client/ios_tutorials/#ios_1
仔细阅读该文档,上传成功后控制台的应用详情里面会显示“已验证”,说明证书有效。

step3:对你的app工程重新配置,使用新的支持apns的provision文件(若此前应用已支持apns,可以不用换),否则后面无法正常获得device token.

step4:集成其sdk,包括一个.a和一个.h文件,最新版本大约是2.1,其sdk中也包含了demo,注意在2.1版本之前需要创建一个plist文件用于保存秘钥信息等,在最新版本不需要此文件。


step5:主要代码修改如下:

appdelegate.h:

static NSString *appKey = @"Your_app_key";
static NSString *channel = @"Your_channel_identifier";
static BOOL isProduction = NO;

appdelegate.m:

#import "JPUSHService.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
                                                      UIUserNotificationTypeSound |
                                                      UIUserNotificationTypeAlert)
                                          categories:nil];
    [JPUSHService setupWithOption:launchOptions appKey:appKey
                      channel:channel apsForProduction:isProduction];
    // your codes
    return YES;
}

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSLog(@"%@", [NSString stringWithFormat:@"Device Token: %@", deviceToken]);
    [JPUSHService registerDeviceToken:deviceToken];
}

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

- (void)application:(UIApplication *)application
didReceiveLocalNotification:(UILocalNotification *)notification
{

    //[JPUSHService showLocalNotificationAtFront:notification identifierKey:nil];
}

监听自定义消息相关的通知(建议在你应用中创建一个单例的manager中专门管理):

        NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
        [defaultCenter addObserver:self
                          selector:@selector(networkDidSetup:)
                              name:kJPFNetworkDidSetupNotification
                            object:nil];
        [defaultCenter addObserver:self
                          selector:@selector(networkDidClose:)
                              name:kJPFNetworkDidCloseNotification
                            object:nil];
        [defaultCenter addObserver:self
                          selector:@selector(networkDidRegister:)
                              name:kJPFNetworkDidRegisterNotification
                            object:nil];
        [defaultCenter addObserver:self
                          selector:@selector(networkDidLogin:)
                              name:kJPFNetworkDidLoginNotification
                            object:nil];
        [defaultCenter addObserver:self
                          selector:@selector(networkDidReceiveMessage:)
                              name:kJPFNetworkDidReceiveMessageNotification
                            object:nil];
        [defaultCenter addObserver:self
                          selector:@selector(serviceError:)
                              name:kJPFServiceErrorNotification
                            object:nil];
// handler
- (void)networkDidSetup:(NSNotification *)notification
{
    NSLog(@"networkDidSetup %@, alias=%@", [notification userInfo], [NSString stringWithFormat:@"iOS_%@", GSignInConfig.userID]);
    //针对设备给极光服务器反馈了别名,app服务端可以用别名来针对性推送消息
    [JPUSHService setTags:nil
                    alias:[NSString stringWithFormat:@"iOS_%@", GSignInConfig.userID]
         callbackSelector:nil
                   target:nil];
}

- (void)networkDidClose:(NSNotification *)notification
{
    NSLog(@"networkDidClose %@", [notification userInfo]);
}

- (void)networkDidRegister:(NSNotification *)notification
{
    NSLog(@"networkDidRegister %@", [notification userInfo]);
}

- (void)networkDidLogin:(NSNotification *)notification
{
    NSLog(@"networkDidLogin %@", [notification userInfo]);
}

- (void)networkDidReceiveMessage:(NSNotification *)notification
{
    NSLog(@"networkDidReceiveMessage notification = %@", notification);
}

- (void)serviceError:(NSNotification *)notification
{
    NSDictionary *userInfo = [notification userInfo];
    NSString *error = [userInfo valueForKey:@"error"];
    NSLog(@"serviceError %@", error);
}

api参考:http://docs.jpush.io/client/ios_api/#api-ios

step6:在控制台发送消息,对其进行测试。


在此处可以发送自定义消息和push消息,其中自定义消息只在前台接收,通过长连接发送。笔者这里只使用自定义消息,用于应用在前台时服务器向应用下发消息,实时性比较好。

错误排查

http://docs.jpush.io/client/ios_tutorials/
参考上面链接的思维导图,结合demo(将demo的bundle id修改成你工程的bundle id,并配置你自己的mobile provision文件来对比测试),一般就可以解决常见问题。

总结

经过笔者几个小时的实战,即在应用内集成了Jpush的服务,应该说还是相当效率的。Jpush在速度、可靠性、文档等各方面表现都很不错,对开发者很友好。有此类需求的开发者小伙伴们可以优先考虑JPush的方案。

目录
相关文章
|
9月前
|
关系型数据库 MySQL 应用服务中间件
站库分离技术--反向代理技术-雷池云WAF-给自己搭建一个安全点的网站
站库分离技术--反向代理技术-雷池云WAF-给自己搭建一个安全点的网站
371 3
|
9月前
|
SQL 安全 网络安全
网络安全与信息安全:防范措施与加密技术解析
【10月更文挑战第9天】在数字化时代,网络安全与信息安全已成为我们日常生活中不可或缺的一部分。本文将深入探讨网络安全漏洞、加密技术和安全意识等方面的内容,以帮助读者更好地了解和应对网络安全威胁。通过分享相关知识和案例分析,我们希望提高大家对网络安全的认识和重视程度,共同维护一个安全、可靠的网络环境。
743 0
|
11月前
|
网络架构
“跨国企业通信新选择:揭秘CN2 GT与GIA线路差异,为何GIA能引发业界关注?
【8月更文挑战第22天】随互联网发展,网络线路对企业至关重要。CN2线路因低延迟广受好评,分为CN2 GT和GIA。本文通过案例分析两者差异:某跨国企业测试显示,CN2 GT基于动态路由,速度有所提升但高峰时段可能波动;CN2 GIA基于静态路由,速度更快、更稳定,但成本更高。企业应根据需求和预算做出选择。
238 2
|
11月前
|
缓存 定位技术 数据库
如何优化大表的查询速度?
如何优化大表的查询速度
189 1
【网络奇缘】——奈氏准则和香农定理从理论到实践一站式服务|计算机网络
【网络奇缘】——奈氏准则和香农定理从理论到实践一站式服务|计算机网络
317 0
|
敏捷开发 数据可视化 测试技术
理解并实现敏捷开发方法论:技术视角的深入探讨
【5月更文挑战第28天】本文深入探讨了敏捷开发方法论,强调其以人为本、快速迭代、灵活适应和关注价值的核心思想。文章介绍了Scrum、XP和Kanban等敏捷实践,并概述了实现敏捷开发的步骤,包括组建团队、明确目标、选择方法、实施开发和持续改进。同时,提醒注意保持开放沟通、注重质量效率、灵活应对变化及培养敏捷文化。敏捷开发旨在适应软件行业快速变化的需求,通过迭代和增量方式提高效率与质量,确保项目成功。
|
存储 NoSQL 关系型数据库
如何根据不同场景选择合适的云数据库|学习笔记
快速学习如何根据不同场景选择合适的云数据库
如何根据不同场景选择合适的云数据库|学习笔记
|
负载均衡 网络协议 数据管理
深入解析Nacos:服务发现、配置管理与更多特性解析
深入解析Nacos:服务发现、配置管理与更多特性解析
1144 0
|
数据可视化 算法 JavaScript
数字孪生核心技术揭秘(一):渲染引擎
从2017年“数字孪生城市”概念走红开始,全国各地“数字孪生城市”如雨后春笋般涌现,迅速推动了整个行业快速发展。与此同时,整个“数字孪生城市”产业链路上的技术瓶颈开始显现,尤其是数字孪生城市构建的核心环节之一的三维渲染引擎已经成为制约数字孪生城市项目正真实战落地的核心痛点。
6354 4