极光推送(JPush)详解

663 阅读14分钟

极光推送(JPush)全面详解:功能、集成与最佳实践

极光推送(JPush)作为国内领先的第三方消息推送服务平台,为移动应用开发者提供了高效、稳定的消息推送解决方案。本文将全面解析极光推送的核心功能、技术实现、集成方法以及最佳实践,帮助开发者更好地理解和利用这一强大工具。

极光推送概述与核心优势

极光推送(JPush)是中国市场份额领先的移动消息推送服务商,由极光(Aurora Mobile)公司开发,截至2023年12月,已有超过191.9万款APP通过SDK和API接入极光的各类服务,月度独立活跃设备数量达14.2亿,累计SDK安装量735亿。当前,极光推送每天处理的消息量超过100亿条,已成为App系统生态的重要基座之一。

极光推送的核心优势主要体现在以下几个方面:

  1. 多平台全面支持:全面兼容Android、iOS、HarmonyOS、快应用等系统平台,提供极光通道与APNS(苹果)、FCM(谷歌)、华为、荣耀、小米、OPPO、VIVO、魅族、华硕等系统级消息下发通道的整合。

  2. 高并发高可靠:服务器支持每秒百万级消息下发,毫秒级触达终端用户,面对高频高并发推送需求表现出色。

  3. 精准用户触达:提供用户自定义的标签(tag)和别名(alias)系统,无缝衔接极光全网数据,实现精准用户分群推送。

  4. 全面数据分析:支持分平台分通道的消息数量、送达率、展示率和点击率统计,新增的"推送目标转化"功能让消息推送的转化效果更清晰可见。

  5. 快速集成部署:通过简单易用的控制台和API,可在1小时内为应用构建强大的推送能力。

极光推送特别适合需要"提醒、促活、营销"等能力的应用场景,它帮助应用与用户保持联系,提高用户体验和用户参与度,同时也为企业提供了一个有效的渠道来推广产品和服务,增加用户转化率。

极光推送的技术架构与消息类型

技术架构与协议实现

极光推送的后台主要使用纯C语言实现,采用自定义的二进制协议而非XMPP协议,这种设计旨在尽可能节约流量。系统架构支持10亿级用户并发访问,采用分布式设计确保任何单点失败不会影响整体系统运行,并可实现在线升级。

在消息传输安全方面,极光建议开发者不要通过推送发送保密信息,就像不建议在QQ聊天时发送保密信息一样。对于确实需要传递保密信息的情况,可以考虑先通过JPush推送一条触发消息,这条消息触发客户端App去与开发者服务器交互获取保密信息。

消息类型与表现形式

极光推送提供四种主要的消息形式,每种形式适用于不同的场景:

  1. 通知(Push Notification)

    • 在手机通知栏(状态栏)显示的通知信息
    • 主要用于提示用户,应用于新闻内容、促销活动、产品信息、版本更新提醒、订单状态提醒等场景
    • Android平台依靠JPush Service由SDK实现在手机通知栏的展示
    • 可以定制通知栏样式,通过builder_id参数指定
  2. 自定义消息(Message)

    • 不会被SDK自动展示到通知栏,内容完全由开发者定义
    • 主要用于应用内部业务逻辑,一条自定义消息推送过来可能没有任何界面显示
    • Android不需要应用处于前台即可接收,但需要开发者自己处理接收和展示逻辑
    • 必须配置BroadcastReceiver接收cn.jpush.android.intent.MESSAGE_RECEIVEDAction
  3. 富媒体消息

    • 可以推送Web页面、图片、声音等除普通文本之外更丰富的内容
    • 包括两种形式:信息流模板推送和URL富媒体链接推送
    • 信息流模板推送通过极光控制台创建富文本页面(提供5种模板)
    • URL富媒体推送仅支持Android,需要SDK 1.8.0及以上版本
  4. 本地通知

    • 不依赖于网络,无网条件下依旧可以触发
    • 定时时间是自发送时算起,不受中间关机等操作的影响
    • 与网络推送的通知相互独立,不受保留最近通知条数上限的限制
    • 适用于Todo和闹钟类应用,在固定时间提醒用户

消息长度限制

各平台对消息长度有不同的限制:

  • Android平台:Notification + Message组合长度限制为4000字节
  • iOS平台:Notification中"iOS":{}及大括号内的总体长度不超过2000字节(包括自定义参数和符号),Message部分长度不超过4000字节
  • WinPhone平台:Notification长度限制为1000字节

推送目标受众与精准推送策略

极光推送在推送人群选择上提供了多种灵活的方式,支持开发者根据业务需求实现从广播到精准个人推送的各种场景。

推送受众类型

  1. 广播(所有人)

    • 推送给所有安装App的设备终端
    • 极光对广播推送提供"延迟推送"选项,让推送在一定时长内平均分配,避免短时间内对业务服务器造成过大压力
    • 免费版本每个Appkey每天广播限制为10条,付费版本可提升此限制
  2. 注册ID(RegistrationID)

    • 设备与App组合的唯一标识,由极光服务器分配
    • 最精确的设备定位方式,建议开发者获取并保存到业务服务器,与用户标识对应
    • Android设备重新安装App后RegistrationID可能不变,iOS8+设备重新安装一般会变化
  3. 别名(alias)

    • 基于RegistrationID设置的易理解标识,如用户名
    • 一个设备在一个App里只能设置一个别名
    • 适合单用户推送,一个别名可设置到多设备上(如用户在多设备登录)
    • 本质是将用户ID与RegistrationID对应关系保存到推送服务器
  4. 标签(tag)

    • 分组推送机制,一个设备可设置多个标签
    • 适合业务相关的分组场景,如订阅类型、用户属性等
    • 与别名类似,对应关系保存在推送服务器侧
    • 可用于精细化推送,如按性别、年龄段、喜好等属性推送
  5. 用户分群(Segment)

    • 高级使用方式,根据多种条件组合创建用户分群
    • 可用条件包括:tags、App版本、SDK版本、平台版本、注册时间、活跃时间、所在城市等
    • 基于SegmentID进行推送实现更精准的受众定位

推送人群选择策略

根据不同的业务场景,应选择合适的推送人群类型:

单用户推送场景

  • 使用RegistrationID或别名
  • 别名适合简单场景,特别是用户可能多设备登录的情况
  • RegistrationID方式更灵活,对应关系保存在业务服务器,便于管理变更

用户分群推送场景

  • 标签(tag)适合业务强相关的分组,如订阅频道、用户属性等
  • 用户分群(Segment)适合基于多种条件的复杂组合筛选
  • 避免将别名误用为标签(大量设备设置相同别名)

广播推送场景

  • 适合全量用户通知,如系统公告、版本更新等
  • 可利用延迟推送功能平衡服务器压力
  • 注意免费版的每日广播条数限制(10条/天)

推送频率与并发限制

极光推送对推送频率和并发性有以下限制:

  • 免费版本:每个Appkey的最高推送频率为600次/分钟
  • 付费版本:可享有更高的推送频率和广播条数限制(需联系商务)
  • 系统并发能力:支持10亿级用户并发访问
  • 离线消息保存:默认免费保存5条离线消息,最长可设置保存10天(time_to_live参数)

客户端集成与服务器端配置

极光推送的完整实现需要客户端SDK集成和服务器端配置配合完成。下面分别介绍Android平台和服务器端的配置方法。

Android客户端集成

1. 添加依赖: 在项目的build.gradle文件中添加极光推送的依赖:

dependencies {
    // jpush
    implementation 'cn.jpush.api:jpush-client:3.3.9'
    implementation 'cn.jpush.api:jiguang-common:1.0.3'
}

2. 配置AndroidManifest.xml: 需要配置必要的权限和组件:

<!-- 必需的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

<!-- 接收自定义消息的BroadcastReceiver -->
<receiver
    android:name=".MyReceiver"
    android:enabled="true">
    <intent-filter>
        <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
        <category android:name="${applicationId}" />
    </intent-filter>
</receiver>

3. 初始化JPush: 在Application类中初始化JPush服务:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        JPushInterface.setDebugMode(true);  // 设置调试模式
        JPushInterface.init(this);         // 初始化JPush
    }
}

4. 设置别名和标签: 可以通过以下代码为用户设置别名和标签:

// 设置别名(一个用户只能有一个别名)
JPushInterface.setAlias(context, sequence, alias);

// 设置标签(一个用户可以有多个标签)
Set<String> tags = new HashSet<>();
tags.add("tag1");
tags.add("tag2");
JPushInterface.setTags(context, sequence, tags);

5. 处理接收到的消息: 自定义BroadcastReceiver处理收到的消息:

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
            // 处理自定义消息
            String message = intent.getStringExtra(JPushInterface.EXTRA_MESSAGE);
            // 处理逻辑...
        }
    }
}

服务器端配置

1. 基本配置: 在Spring Boot应用中,可以通过yml文件配置极光推送参数:

# 极光推送参数设定
jpush: 
  appkey: your_app_key
  masterSecret: your_master_secret
  # 离线保存时间 7天 最长10天
  liveTime: 604800
  # 推送开关
  enable: true

2. 配置类: 创建配置类读取yml配置:

@Component
@ConfigurationProperties(prefix="jpush")
public class JPushConfig {
    public static String APP_KEY;
    public static String MASTER_SECRET;
    public static long LIVE_TIME;
    public static Boolean ENABLE;

    public void setAppKey(String appKey) {
        APP_KEY = appKey;
    }
    // 其他setter方法...
}

3. 推送服务实现: 实现推送服务的核心方法:

public class JPushService {
    public void sendPushNotification() {
        JPushClient jpushClient = new JPushClient(JPushConfig.MASTER_SECRET, JPushConfig.APP_KEY);
        
        try {
            PushPayload payload = PushPayload.newBuilder()
                .setPlatform(Platform.all()) // 设置平台
                .setAudience(Audience.all()) // 设置受众
                .setNotification(Notification.newBuilder()
                    .setAlert("Hi, JPush")
                    .addPlatformNotification(AndroidNotification.newBuilder()
                        .setTitle("Android Title")
                        .build())
                    .addPlatformNotification(IosNotification.newBuilder()
                        .setAlert("iOS Alert")
                        .setSound("happy")
                        .setBadge(1)
                        .addExtra("url", "www.example.com")
                        .build())
                    .build())
                .setMessage(Message.newBuilder()
                    .setMsgContent("Message Content")
                    .setTitle("Message Title")
                    .addExtra("url", "www.msg.com")
                    .build())
                .setOptions(Options.newBuilder()
                    .setTimeToLive(JPushConfig.LIVE_TIME)
                    .build())
                .build();
            
            PushResult result = jpushClient.sendPush(payload);
            System.out.println("Got result - " + result);
        } catch (APIConnectionException | APIRequestException e) {
            e.printStackTrace();
        }
    }
}

高级功能与最佳实践

高级推送功能

  1. 地理围栏推送

    • 极光推送提供地理围栏功能,当用户进入或离开特定区域时触发推送
    • 目前地理围栏只支持通过portal端推送,开发者需在portal端创建地理围栏
    • 推送时在可选设置里选择相应的地理围栏进行推送
  2. 短信补充服务

    • 针对推送无法到达的用户(断网、后台禁止运行等)进行短信通道补充
    • 优势包括独享通道、三网合一、极速稳定、低成本等
    • 目前仅有API形式提供服务,需联系商务开通
  3. 推送目标转化分析

    • 新增功能支持以最后一次消息点击归因目标转化事件
    • 当用户在收到推送后触发指定事件(如加入购物车、浏览商品等),视为目标转化
    • 支持极光预置事件(jg_app_show,jg_app_hide)和自定义事件
    • 可在推送后台查看目标转化数据,包括概况数据、推送记录数据和统计应用维度消息指标
  4. 消息覆盖功能

    • 通过override_msg_id参数可以覆盖之前的一条推送
    • 被覆盖的消息离线用户将收到新内容,Android端未清除的通知栏也会更新
    • 覆盖功能时限为1天
  5. 定速推送(缓慢推送)

    • 通过big_push_duration参数设置(分钟)
    • 把快速推送速度降低,在给定时间内均匀向目标用户推送
    • 最大值为1440分钟(24小时)

最佳实践与常见问题解决

1. 推送内容优化

  • 避免推送敏感信息,保密信息应通过推送触发客户端与服务器交互获取
  • 合理控制推送频率,避免用户反感
  • 使用A/B测试优化推送内容和发送时间

2. 推送性能优化

  • 对于大规模推送,使用定速推送功能平衡服务器压力
  • 合理设置time_to_live参数(离线消息保存时间),默认为1天,最长10天
  • 使用厂商通道(华为、小米等)提升Android消息到达率

3. 常见问题解决

问题:找不到目标用户

  • 可能原因:
    • 群发推送:没有客户端成功集成JPush SDK并连接服务器
    • 别名/标签推送:别名或标签未被成功设置
  • 解决方案:
    • 检查客户端日志,排查注册失败原因
    • 确认setAlias/setTags调用成功

问题:Android收不到消息

  • 可能原因:
    • 长连接断开(断网、关机、进程被杀死、调用了stoppush)
    • 手机系统限制导致断网或进程不在
  • 解决方案:
    • 添加极光提供的拉起服务
    • 提示用户对App进行保护(如加入白名单)

问题:别名置空期间消息丢失

  • 现象:别名置空至重设别名期间推送的消息,在重设别名后设备不会收到
  • 解决方案:
    • 服务器端对此期间消息进行判断、保存
    • 客户端重设别名后,重新向极光发起推送请求

问题:通知栏点击无法获取自定义内容

  • 可能原因:
    • extras信息写在Message下而非Notification下
    • 点击通知栏只能获取Notification下的extras信息
  • 解决方案:
    • 确保自定义内容放在Notification的extras中

4. 数据统计与分析

  • 利用极光提供的消息数量、送达率、展示率和点击率统计优化推送策略
  • 使用"推送目标转化"功能精准评估营销转化率
  • 定期分析推送效果,调整推送内容和目标人群

极光推送的扩展与未来

多平台扩展

极光推送已全面支持主流移动平台,并不断扩展新的生态系统:

  • 成为华为HarmonyOS生态市场首家推送类SDK服务商
  • 支持快应用等新型应用形态
  • 产品和服务已上线青云云市场、亚马逊云科技Marketplace等平台

与厂商通道的整合

极光推送通过整合各厂商的系统级通道,显著提升了推送到达率:

  • 支持华为、荣耀、小米、OPPO、VIVO、魅族、华硕等厂商通道
  • 智能选择极光通道与厂商通道的下发策略
  • 在保证推送速度的同时提高各类Android设备的到达率

智能化发展方向

基于人工智能和大数据驱动,极光推送在以下方面持续发展:

  • 智能化推送时间选择(基于用户行为分析)
  • 个性化内容推荐(基于用户画像和偏好)
  • 预测性推送(基于用户行为预测)
  • 自动化推送策略优化(基于机器学习)

企业级解决方案

极光推送正从单一推送服务向综合客户互动解决方案发展:

  • 结合极光分析、极光即时通讯等产品提供完整解决方案
  • 支持从客户触达到营销转化的全流程
  • 满足企业数字化营销的多样化需求

总结

极光推送作为国内领先的消息推送服务平台,提供了从基础推送到高级分析的完整解决方案。通过本文的详细解析,开发者可以了解到:

  1. 极光推送的核心优势在于高并发、高可靠的基础设施和精准的用户触达能力
  2. 支持多种消息类型(通知、自定义消息、富媒体、本地通知)满足不同场景需求
  3. 提供从广播到个人精准推送的多种受众选择策略
  4. 客户端集成和服务器端配置相对简单,文档完善
  5. 高级功能如地理围栏、短信补充、目标转化分析等可满足企业级需求
  6. 持续扩展多平台支持和厂商通道整合,提升服务能力

在实际应用中,开发者应根据业务需求选择合适的推送策略,遵循最佳实践,充分利用极光推送提供的各种工具和数据分析能力,实现高效、精准的用户触达和互动,最终提升用户体验和业务转化率。