网站打包app极光推送如何介入

标题:将网站打包为 APP 并实现极光推送

随着科技的不断发展,越来越多的企业和个人选择建立自己的网站。然而许多人发现,尽管网站可以提高知名度,但与手机 APP 相比仍存在局限性。因此,将网站打包为 APP 并加入推送功能变得愈发重要。在此,我们将详细介绍如何使用极光推送为你的网站 App 添加推送

功能。

一、什么是极光推送?

极光推送(JPush)是一款第三方推送服务平台,致力于为开发者提供高效、稳定、智能的推送解决方案。极光推送可以真正实现跨平台(Android、iOS、Windows Phone 等)、低成本和即时送达的推送服务。借助极光推送,你可以为用户发送即时消息、通知和广告,从而提高你的网站移动端用户的活跃度和粘性。

二、网站打包为 APP 的原理

1. WebView

WebView 是一种可以嵌入在原生应用中,用于显示网页内容的控件。通过将网站内容嵌入到 WebView 中,你可以将现有的网站以移动端应用的形式呈现。这种方法苹果app封装签名的优点是重用现有的网站代码,开发速度较快,成本相对较低。

2. Hybrid App

混合应用(Hybrid App)是一种将网页技术(HTML网址变为app、CSS、JavaScript)与原生技术相结合的应用开发方式。通过使用 PhoneGap、Ionic、React Native 等框架,可以将网站内容转换成原生应用程序。这种方法比 WebView 更优越,因为它允许使用原生应用程序的功能,例如访问摄像头、通讯录等。

三、添加极光推送功能

要将极光推送功能添加到你的网站 APP 中,需要完成以下步骤:

1. 注册极光推送账号并创建应用

访问极光推送官网(https://www.jiguang.cn/),注册一个免费账号。登录后,在“管理应用”页面中创建一个新的应用,并分别为 Android 和 iOS 平台配置应用信息。

2. 集成极光推送 SDK

下载极光推送官方提供的 SDK,并将其集成至你的网站 APP 中。具体操作请参考官方文档(https://docs.jiguang.cn/)并按照步骤操作。

3. 编写代码实现推送功能

使用你的开发工具编写代码来实现推送功能。你需要调用 SDK 中提供的接口,例如初始化推送服务、注册别名、接收消息等。具体用法请参考官方文档的示例代码。

4. 优化推送消息

为了更好地吸引用户,你可以考虑添加图片、声音、自定义消息等多样化推送内容。此外,务必注意推送频率,以避免用户因反感接收到过多信息而卸载你的应用。

四、总结

通过以上介绍,你已经初步了解了如何为你的网站 APP 添加极光推送功能。本文只是提供一个基本的知识框架,具体实现仍需多加练习和研究。希望本文能对你在将网站打包为 APP 并加入推送功能方面的探索提供有益的帮助。祝你成功!

极光消息推送如何实现短信补充服务?

极光消息推送如何实现短信补充服务?

针对开发者提供推送补充服务,如果 App 侧一段时间内无法收到推送的消息(可能由于断网、后台禁止运行、消息延迟等原因)的用户进行短信通道信息补充。对于到达强需求的业务优先使用推送可以一定程度减少短信费用开销,又能保证信息最终的传递到达。

优势

极光推送的短信服务有如下优势:

  • 独享通道:享有独立通道,高速稳定;
  • 三网合一:目前支持中国移动,中国联通,中国电信三大运营商的手机用户,短信推送及时准确送达。(暂不支持国外的手机号)
  • 极速稳定:极光千台服务器强力支持,覆盖范围广,极致提升短信推送效率;
  • 低成本:发送短信的费用低;
  • 灵活性:模板与模式可随心定制。

数据指标

下发速度:与运营商合作,下发速度 200 条/秒;
送达时间:送达时间由运营商控制,一般情况下是几秒送达;
短信内容:内容要求符合国家规定,正常的营销信息可正常发送,手机用户可以选择是否接收。

充值与开通

短信价格按照月消费数量会有所不同,详细价目表请咨询商务。
如果您想开通短信服务,请向商务提供相关登记信息,并预存费用至极光推送的账户即可开通。
联系商务开通服务

使用指南

目前仅有 API 形式提供服务。原有 App 推送功能不变,仅是新增了短信接口。

参考文档:服务器端-sms_message

极光消息推送如何实现个性化文案推送?

极光消息推送如何实现个性化文案推送?

  • 极光推送提供个性化文案推送服务,用户可以通过绑定设备的用户属性值进行个性化参数下发,实现更高的用户点击率。
  • 用户属性:某一类用户信息的统一标识。如:用户昵称、喜好、所在省市等。

支持版本

  • Android SDK 4.8.0 及之后的版本。
  • iOS SDK 4.8.0 及之后的版本。

使用场景

商品促活场景:

          Hi @{{nickname}},你的会员还有{{days}}过期,现在充值可享3折优惠!

        

社交应用场景:

          Hi @{{nickname}},你的评论有{{answer_num}}位好友回复,快来看看吧>>>

        

新增用户属性

支持通过控制台和服务端两种方式新增用户属性。

控制台设置

进入【配置管理】-【用户属性】页面,点击“新增用户属性”。  填写字段属性名称和属性描述,选择字段类型后点击“确定”即可完成用户属性创建。 

服务端设置

服务端调用参考 新增用户属性 API

设置设备的用户属性

支持通过客户端或服务端两种方式绑定设备的用户属性。

客户端设置

服务端设置

详情参考 新增/更新设备的用户属性 API

创建个性化推送文案

参数说明

需要在 options 字段下配置 alternate_set 参数,并在支持的消息类型、平台下配置 title、alternate_title、alert/content/msg_content、alternate_alert/alternate_content 等参数,参数详情详见下表。

若开启个性化文案功能时,无法获取用户属性值,也没有设置备用文案,则属性值会显示为空。如:“Hi @{{nickname}},现在充值会员可享3折优惠!”会显示为“Hi @ ,现在充值会员可享3折优惠!”。

关键字类型父项目含义说明
alertstringnotificationnotification.androidnotification.iosnotification.quick_app通知内容支持设置个性化文案,如:{{name}},name 为应用的用户属性,具体值为设备绑定的属性值。ios 支持 string 或 JSON Object 类型, alert 和 alternate_alert 必须使用同种数据类型。
alternate_alertstringmessagenotificationnotification.androidnotification.iosnotification.quick_appalert 的备用文案仅开启个性化文案功能时有效。当后台查询个性文案的属性值为空时,使用备用文案的值定义 alert。ios 支持 string 或 JSON Object 类型, alert 和 alternate_alert 必须使用同种数据类型。
titlestringmessagenotification.androidnotification.quick_appnotification_3rd通知标题支持设置个性化文案,如:{{name}},name 为应用的用户属性,具体值为设备绑定的属性值。
alternate_titlestringmessagenotification.androidnotification.quick_appnotification_3rdtitle 的备用文案仅开启个性化文案功能时有效。当后台查询个性文案的属性值为空时,使用备用文案的值定义 title。
contentstringnotification_3rd通知内容通知内容
msg_contentstringmessage通知内容通知内容
alternate_contentstringmessagenotification_3rdcontent 或 msg_content 的备用文案仅开启个性化文案功能时有效。当后台查询个性文案的属性值为空时,使用备用文案的值定义 content 或 msg_content。
alternate_setbooleanoptions个性化文案功能开关是否启用个性化文案功能,默认为 false。true: 启用个性化文案功能。false: 关闭个性化文案功能。

示例

          {
    "platform": "all",
    "audience": {
        "registration_id": [
            "160a3797c806b5dbb10"
        ]
    },
    "message": {
        "msg_content": "Hi,{{name}}",
        "alternate_content": "Hi, JPush",
        "title": "msg title {{title}}",
        "alternate_title": "default msg title"
    },
    "notification": {
        "alert": "notification {{content}}",
        "alternate_alert": "notification hello world",
        "android": {
            "alert": "android alert {{content}}",
            "alternate_alert": "android alert hello world",
            "title": "android title {{title}}",
            "alternate_title": "android title hello world"
        },
        "ios": {
            "alert": {
                "title": "ios alert title {{title}}",
                "subtitle": "ios alert subtitle {{subtitle}}",
                "body": "ios alert body {{content}}"
            },
            "alternate_alert": {
                "title": "ios alert title hello",
                "subtitle": "ios alert subtitle hello",
                "body": "ios alert body hello"
            }
        },
        "quickapp": {
            "alert": "quickapp alert {{content}}",
            "alternate_alert": "quickapp alert hello world",
            "title": "quickapp title {{title}}",
            "alternate_title": "quickapp title hello world"
        },
        "winphone": { // winphone不支持
            "alert": "winphone alert",
            "title": "winphone title"
        }
    },
    "notification_3rd": {
        "content": "notification_3rd content {{content}}",
        "alternate_content": "notification_3rd content hello world",
        "title": "notification_3rd title {{title}}",
        "alternate_title": "notification_3rd title hello world"
    },
    "options": {
        "alternate_set": true
    }
}

        

极光消息推送通知下发策略?

极光消息推送通知下发策略?

随着厂商服务器对 厂商限额及 QPS 限制 的逐步收紧,推送的抵达率和下发速度也受到相应的影响。为了更好地提升抵达率和下发速度,极光推送提供通知下发策略功能,您可以在推送时自定义不同通道的通知下发策略,详情参考下文。

通道说明

通知下发策略仅对 Android 平台集成了厂商通道的设备有效,集成厂商通道参考 厂商通道 SDK 集成指南

通道描述支持手机类型
极光通道极光通道是自建通道,需要依赖长连接才能收到推送,设备离线时消息不会下发。所有可以成功注册极光通道的机型。
厂商通道厂商通道是系统通道,设备离线也可以收到推送。支持小米、华为、OPPO、vivo、魅族、FCM 通道。小米、华为、OPPO、vivo、魅族、谷歌手机等。

使用说明

服务端使用

下发时在 options 字段下配置 third_party_channel 字段,并在对应的厂商 key 下配置策略参数即可按照策略进行推送。

  • options.third_party_channel 的 key 只支持 xiaomi、huawei、meizu、oppo、vivo、fcm 类型用户。 key 可以为上述 6 个类型中的其中一个或者多个同时存在,未传递的 key 其对应的厂商下发走默认下发逻辑。
  • 默认下发逻辑:
    • 免费用户:distribution 默认值为 secondary_push,distribution_fcm 默认值为 secondary_fcm_push。
    • VIP 用户:distribution 默认值为 first_ospush,distribution_fcm 默认值为 fcm。
  • 厂商类型的 key 对应的 3 个策略参数说明如下:
关键字类型选项含义说明
distributionstring可选通知栏消息下发逻辑取值不能为空字符串。first_ospush(VIP):成功注册厂商通道的设备走厂商通道,仅注册极光通道的设备走极光通道送。ospush(VIP):表示推送强制走厂商通道下发。 需要特别注意,只要指定此值的厂商对应配额不够时,推送请求会失败,返回 1012 错误码。
举例:假设指定一个小米用户的 RegistrationID 推送,请求时针对小米、OPPO 等厂商通道都指定了“ospush”,且 OPPO 厂商通道都配额已经用完,则推送同样会返回 1012 错误,提示厂商配额不足。jpush:表示推送强制走极光通道下发。secondary_push:表示推送优先走极光,极光不在线再走厂商,厂商作为辅助(建议此种方式)。
distribution_fcmstring可选通知栏消息 fcm+ 国内厂商组合类型下发逻辑取值不能为空字符串。jpush:表示推送强制走极光通道下发。fcm(VIP):表示推送强制走 fcm 通道下发。pns(VIP):表示推送强制走小米 / 华为 / 魅族 /oppo/vivo 通道下发。secondary_fcm_push:表示针对 fcm+ 国内厂商组合类型用户,推送优先走极光,极光不在线再走 fcm 通道,fcm 作为辅助。secondary_pns_push:表示针对 fcm+ 国内厂商组合类型用户,推送优先走极光,极光不在线再走厂商通道,厂商作为辅助。
distribution_customizestring可选自定义消息国内厂商类型下发逻辑定义国内厂商类型用户(当前仅对 xiaomi、huawei 生效)下发自定义消息的逻辑,取值不能为空字符串,此功能生效需 Android push SDK ≥ V3.9.0。jpush:表示推送强制走极光通道下发。first_ospush(VIP):成功注册厂商通道的设备走厂商通道,仅注册极光通道的设备走极光通道。secondary_push:表示推送优先走极光,极光不在线再走厂商,厂商作为辅助。

API 示例

          "third_party_channel":{
    "xiaomi":{
              "distribution":"jpush",
              "distribution_fcm":"fcm",
              "distribution_customize":"first_ospush",
    },
    "huawei":{
              "distribution":"secondary_push", 
              "distribution_fcm":"jpush", 
              "distribution_customize":"first_ospush",
    },
    "meizu":{
              "distribution":"jpush",
              "distribution_fcm":"pns" 
    },
    "fcm":{   // 这个参数不支持 distribution_fcm 字段
              "distribution":"jpush"  
    },
    "oppo":{
              "distribution":"ospush", 
              "distribution_fcm":"secondary_fcm_push", 
    },
    "vivo":{
            "distribution":"jpush",
            "distribution_fcm":"secondary_pns_push", 
    }
}

        

控制台使用

通知消息

进入【极光推送】-【创建推送】-【通知消息】页面,点击【Android 平台】-【高级设置】-【通知下发策略】,选择需要配置的通知下发策略。

厂商通道状态显示了当前应用开通和配置厂商通道的情况,通知下发策略仅对集成了厂商通道的设备有效。

自定义消息

进入【极光推送】-【创建推送】-【自定义消息】页面,点击【Android 平台】-【高级设置】-【通知下发策略】,选择需要配置的通知下发策略。

厂商通道状态显示了当前应用开通和配置厂商通道的情况,通知下发策略仅对集成了厂商通道的设备有效。

极光消息推送如何使用别名与标签?

极光消息推送如何使用别名与标签?

别名与标签

别名:可以近似地被认为,是用户帐号里的昵称。使用别名推送指给某特定用户推送消息。
标签:类似于博客里为文章打上 tag ,即为某资源分类。使用标签推送指给某一群人推送消息。

为什么使用别名与标签

推送消息时,要指定推送的对象:全部,某一个人,或者某一群人。
全部指针对某应用“广播所有人”,控制台与 API 都支持向指定的 AppKey 广播消息。
要指定向某一个特定的人,或者某一群特定的人,则相对复杂。因为对于 JPush 来说,某一个人就是一个注册 ID(Registration ID),这个注册 ID 与开发者 App 没有任何关系,或者说对开发者 App 是没有意义的。
如果要对开发者 App 有意义的某个特定的用户推送消息,则需要:把 JPush 注册用户与开发者 App 用户绑定起来。
这个绑定有两个基本思路:

  • 把绑定关系保存到 JPush 服务器端
  • 把绑定关系保存到开发者应用服务器中

前者,就是这里要说到的:别名与标签的功能。这个机制简单易用,适用于大多数开发者。
后者,则是 JPush 提供的另外一套 Registration ID 机制。这套机制开发者需要有应用服务器来维护绑定关系,不适用于普通开发者。Android SDK 1.6.0 版本开始支持。

使用方式

别名与标签的机制,其工作方式是:

  • 客户端开发者 App 调用 setAlias 或者 setTags API 来设置注册用户和 App 用户的关系。
  • JPush SDK 把该关系设置保存到 JPush Server 上。
  • 在服务器端推送消息时,指定向之前设置过的别名或者标签推送。

客户端设置

SDK 支持的 Alias 与 Tags 接口请参考相应的文档:别名与标签 API(Android)标签与别名 API(iOS),部分接口如下:

设置别名

这个接口是覆盖逻辑,而不是增加逻辑,调用此接口会覆盖之前设置的别名。

Android 接口:

          public static void setAlias(Context context, int sequence, String alias);

        

iOS 接口:

          + (void)setAlias:(NSString *)alias
  completion:(JPUSHAliasOperationCompletion)completion
         seq:(NSInteger)seq;

        

设置标签

这个接口是覆盖逻辑,而不是增加逻辑,调用此接口会覆盖之前设置的全部标签。

Android 接口:

          public static void setTags(Context context, int sequence,Set<String> tags);

        

iOS 接口:

          + (void)setTags:(NSSet<NSString *> *)tags
 completion:(JPUSHTagsOperationCompletion)completion
        seq:(NSInteger)seq;

        

注意事项

  • 1.5.0 版本开始提供的旧版 tag、alias 设置接口已不再维护,建议开发者使用 3.0.7 版本开始提供的新的 tag、alias 接口,支持对别名标签进行增删改查。
    • init 后直接 set 操作有极大可能导致失败,可能会在回调里拿到 6022,6002 等,测试的时候可以做个 7、8 秒的延时,正式业务里一般配合用户注册使用,延时基本上够用。
    • 在 callback 返回结果中如果返回 6002 (超时)或 6014(服务繁忙)则建议重试,具体错误码定义请参考 错误码定义
  • 极光于 2020/03/10 对「别名设置」的上限进行限制,最多允许绑定 10 个设备。如需更高上限,请 联系商务,详情请阅读 公告
    • JPush Android v3.5.8 及以上、JPush iOS v3.3.2 及以上版本将返回错误码:6027。
    • JPush Android v3.5.8 以下、JPush iOS v3.3.2 以下版本将会返回错误码:6017。
  • 控制台上推送或者 API 调用向别名或者标签推送时,可能会报错:显示“1011”错误码或提示“没有满足条件的推送目标”。该报错表明,JPush Server 上还没有针对你所推送的别名或者标签的用户绑定关系,所以没有推送目标。这时请开发者检查确认,开发者 App 是否正确地调用了 alias 和 tags API,以及调用时是否网络不好,JPush SDK 暂时未能保存成功。

查询绑定状态

控制台查询

查询别名:进入【极光推送】-【别名管理】页面,选择“别名/Registration ID”,选择对应的别名点击“详情”,查看当前 Registration ID 是否有绑定该别名。
查询标签:进入【极光推送】-【标签管理】页面,选择“标签/Registration ID”,选择对应的标签点击“详情”,查看当前 Registration ID 是否有绑定该标签。

Registration ID 获取方法:AndroidiOS

Rest API 查询

调用地址:https://device.jpush.cn
此接口可以获取当前设备的所有属性,包含 tags, alias 和手机号码 mobile,详情参考 查询设备的别名与标签
Request Header

          GET /v3/devices/{registration_id}
  Authorization: Basic (base64 auth string)
  Accept: application/json

        

Response Data

          {
    "tags": [
        "1122"
    ],
    "alias": "112233",
    "mobile": "13333333333"
}

        

使用别名/标签进行推送

控制台推送

别名推送:目标人群选择“设备别名(Alias)”,添加别名后按 Enter 键结束。

标签推送:目标人群选择“设备标签(Tag)”,选择标签规则并添加标签,按 Enter 键结束。

Rest API 推送

API 推送 时推送目标 audience 字段填写标签/别名进行下发,详细的参数说明如下:

关键字类型含义说明备注
tagJSON Array标签 OR数组。多个标签之间是 OR 的关系,即取并集。用标签来进行大规模的设备属性、用户属性分群,此功能为 VIP 用户功能。一次推送最多 20 个。有效的 tag 组成:字母(区分大小写)、数字、下划线、汉字、特殊字符 @!#$&*+=.|¥。限制:每一个 tag 的长度限制为 40 字节。(判断长度需采用 UTF-8 编码)
tag_andJSON Array标签 AND数组。多个标签之间是 AND 关系,即取交集。此功能为 VIP 用户功能, 注意与 tag 区分。一次推送最多 20 个。
tag_notJSON Array标签 NOT数组。多个标签之间,先取多标签的并集,再对该结果取补集。此功能为 VIP 用户功能。一次推送最多 20 个。
aliasJSON Array别名数组。多个别名之间是 OR 关系,即取并集。用别名来标识一个用户,一个设备只能绑定一个别名,但多个设备可以绑定同一个别名。一次推送最多 1000 个。有效的 alias 组成:字母(区分大小写)、数字、下划线、汉字、特殊字符 @!#$&*+=.|¥。限制:每一个 alias 的长度限制为 40 字节。(判断长度需采用 UTF-8 编码)
  • 推送给多个标签(只要在任何一个标签范围内都满足):在深圳、广州、或者北京
          {
    "audience" : {"tag" : [ "深圳", "广州", "北京"]
    }
}

        
  • 推送给多个标签(需要同时在多个标签范围内):在深圳并且是“女”
          {
    "audience" : {"tag_and" : [ "深圳", "女"]
    }
}

        
  • 推送给多个别名:
          {
    "audience" : {"alias" : [ "4314", "892", "4531"]
    }
}

        

高级场景

动态标签

JPush 提供的设置标签的 API 是在客户端的。开发者如何做到在自己的服务器端动态去设置分组呢? 比如一个企业 OA 系统,经常需要去变更部门人员分组。以下是大概的思路:

  • 设计一种自定义消息格式(业务协议),App 解析后可以调用 JPush SDK setTags API 来重新设置标签(分组),从 3.0.7 版本开始支持对标签进行增删改查,更便于对标签进行更新操作。
    • 例:{“action”:”resetTags”, “newTags”:[“dep_level_1″:”A 公司”, “dep_level_2″:”技术部”, “dep_level_3″:”Android 开发组”, “address”:”深圳”, “lang”:”zh”]}
  • 要动态设置分组时,推送这条自定义消息给指定的用户。
    • 使用别名的机制,推送到指定的用户。
  • 客户端 App 调用 JPush SDK API 来设置新的标签。

别名与标签设置异常处理

由于网络连接不稳定的原因,有一定的概率 JPush SDK 设置别名与标签会失败。
App 开发者合理地处理设置失败,则偶尔失败对应用的正常使用 JPush 影响是有限的。
以下以 Android SDK 作为示例,更为详细的请参考 example。
基本思路:

  • 设置成功时,往 SharePreference 里写状态,以后不必再设置
  • 遇到 6002 超时,则稍延迟重试。
          // 这是来自 JPush Example 的设置别名的 Activity 里的代码,更详细的示例请参考 JPush Example。一般 App 的设置的调用入口,在任何方便的地方调用都可以。
private void handleAction(int sequence,TagAliasBean tagAliasBean) {
    if(tagAliasBean == null){
        Log.w(TAG,"tagAliasBean was null");
        return;
    }
    if(tagAliasBean.isAliasAction){
        switch (tagAliasBean.action){
            case ACTION_GET:
                JPushInterface.getAlias(getApplicationContext(),sequence);
                break;
            case ACTION_DELETE:
                JPushInterface.deleteAlias(getApplicationContext(),sequence);
                break;
            case ACTION_SET:
                JPushInterface.setAlias(getApplicationContext(),sequence,tagAliasBean.alias);
                break;
            default:
                Log.w(TAG,"unsupport alias action type");
                return;
        }
    }else {
    //tag operation
    }
}

        

极光消息推送如何实现消息覆盖和撤回?

极光消息推送如何实现消息覆盖和撤回?

支持通道

平台覆盖撤回
Android极光通道小米通道魅族通道OPPO 通道FCM 通道华为通道(EMUI10 及以上的设备)极光通道小米通道
iOSAPNs 通道

消息覆盖

说明

JPush Android 基于 override_msg_id ,iOS 基于 apns_collapse_id 来定义消息覆盖逻辑。
即对于同一个应用,如果新的一条消息其 override_msg_id 或 apns_collapse_id 存在并与老的一条消息相同,则会被认为是要覆盖老的消息。
这个情况对于是否保存离线消息有所不同:

  • 如果客户端已经收到,用户已经点击打开通知:则新的消息(override_msg_id 存在的消息)还是会显示在通知栏,用户看到的是有新的一条消息。
  • 如果客户端已经收到,但还在通知栏:则新的消息会在通知栏上覆盖老的消息。用户看到新的消息内容。
  • 如果 Android 客户端还未收到,消息还在离线消息里,则:新的消息会覆盖老的消息,用户不会收到老的消息。
  • 如果 iOS 客户端还未收到,由于 Apple 服务器仅保留一条 apns 消息,所以上线后用户也不会收到老的消息。

服务端使用

下发时在 options 字段下配置 override_msg_id 和 apns_collapse_id 参数,可以实现消息覆盖。

关键字类型选项含义说明
override_msg_idlong可选要覆盖的消息 ID如果当前的推送要覆盖之前的一条推送,这里填写前一条推送的 msg_id 就会产生覆盖效果,即:该 msg_id 离线收到的消息是覆盖后的内容,即使该 msg_id Android 端用户已经收到,如果通知栏还未清除,则新的消息内容会覆盖之前这条通知。覆盖功能起作用的时限是:1 天,如果在覆盖指定时限内该 msg_id 不存在,则返回 1003 错误,提示不是一次有效的消息覆盖操作,当前的消息不会被推送。该字段仅对 Android 有效仅支持极光通道、小米通道、OPPO 通道、FCM 通道、魅族通道和华为通道(EMUI10 及以上的设备)。
apns_collapse_idstring可选更新 iOS 通知的标识符APNs 新通知如果匹配到当前通知中心有相同 apns_collapse_id 字段的通知,则会用新通知内容来更新它,并使其置于通知中心首位。collapse id 长度不可超过 64 bytes。

Android 示例

          {
    "platform": "all",
    "audience": {
        "registration_id": [
            "1507bfd3f710de7a40a"
        ]
    },
    "notification": {
        "android": {
            "alert": "Hi, JPush!fvdgtredfgerg",
            "title": "Send to androidre"
        }
    },
    "options": {
        "override_msg_id": 67554224848096790,//要覆盖的消息 ID
        "third_party_channel": {
            "oppo": {
                "distribution": "jpush"
            }
        }
    }
}

        

iOS 示例

          {
    "platform": "all",
    "audience": {
        "registration_id": [
            "101d855909917e5faf8"
        ]
    },
    "notification": {
        "ios": {
            "alert": "Hi, JPush!!!",
            "sound": "default",
            "badge": "+1",
            "thread-id": "default",
            "extras": {
                "key": "my_extra1"
            }
        }
    },
    "options": {
        "apns_production": false,
        "apns_collapse_id": "12345"//需要与覆盖的消息使用相同的id,APNs 新通知如果匹配到当前通知中心有相同 apns_collapse_id 字段的通知,则会用新通知内容来更新它,并使其置于通知中心首位。
    }
}

        

消息撤回

撤销操作首先会从服务端尝试撤销(Android消息,排队中/发送中状态可以服务端撤销;iOS消息,排队中状态可以服务端撤销);其次,针对 Push SDK(JPush Android SDK v3.5.0 及以上),会尝试从设备端撤销已展示但未被点击的消息。

注意:仅安卓极光通道和小米通道支持消息撤回。

调用地址

DELETE https://api.jpush.cn/v3/push/{msgid}

请求示例

          DELETE /v3/push/{msgid}
    Authorization: Basic (base64 auth string)
    Content-Type: text/plain
    Accept: application/json

        

请求响应

成功响应

          HTTP/1.0 200 
  Content-Type: application/json
  Content-Length: 0

        

失败响应

          HTTP/1.0 400 
  Content-Type: application/json
  Content-Length: 0

        
          {
  "error":{
    "code":1003,
    "message":"msgid doesn't exist"
  }
}

        

极光消息推送如何实现图标设置?

极光消息推送如何实现图标设置?

本文旨在指导用户如何设置通知栏小图标、右侧图标以及大图片。

iOS

小图标

进入 Images.xcassets-AppIcon,设置 iPhone Notification 的图标,大小分别为 40 x 40px、60 x 60px。

iOS 不支持服务端动态下发消息设置小图标。

右侧图标 / 大图片

App 在前台时收到推送弹窗,下拉消息可以查看大图片,其他情况无大图片展示。

支持版本

从 JPush iOS SDK v2.1.9,iOS 10 开始支持。

客户端设置

  • 创建一个 Service Extension 服务,详情参考 iOS 10 Service Extension
  • 将 jpush-extension-ios-xxx.a 和 JPushNotificationExtensionService.h 两个文件引入到您的 Service Extentsion 工程中。
  • 添加 Framework:libz.tbd 和 libresolv.tbd。
  • 调用 [jpushSetAppkey:] 方法设置您的 appkey,请注意这里的 appkey 应该和您极光应用的 appkey 相同。
  • 在 [didReceiveNotificationRequest:] 回调方法中获取图片链接,详情参考 SDK 的 demo ,示例如下:
          - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
  self.contentHandler = contentHandler;
  self.bestAttemptContent = [request.content mutableCopy];
  self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [NotificationService]", self.bestAttemptContent.title];
  
  NSString * attachmentPath = self.bestAttemptContent.userInfo[@"my-attachment"];
  //if exist
  if (attachmentPath) {
    //download
    NSURL *fileURL = [NSURL URLWithString:attachmentPath];
    [self downloadAndSave:fileURL handler:^(NSString *localPath) {if (localPath) {UNNotificationAttachment * attachment = [UNNotificationAttachment attachmentWithIdentifier:@"myAttachment" URL:[NSURL fileURLWithPath:localPath] options:nil error:nil];
        self.bestAttemptContent.attachments = @[attachment];
      }
      [self apnsDeliverWith:request];
    }];
  }else{[self apnsDeliverWith:request];
  }
}

- (void)downloadAndSave:(NSURL *)fileURL handler:(void (^)(NSString *))handler {NSURLSession * session = [NSURLSession sharedSession];
  NSURLSessionDownloadTask *task = [session downloadTaskWithURL:fileURL completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    NSString *localPath = nil;
    if (!error) {NSString * localURL = [NSString stringWithFormat:@"%@/%@", NSTemporaryDirectory(),fileURL.lastPathComponent];
      if ([[NSFileManager defaultManager] moveItemAtPath:location.path toPath:localURL error:nil]) {localPath = localURL;}
    }
    handler(localPath);
  }];
  [task resume];
  
}

        

服务端设置

图片展示需要在 ios 下配置 mutable-content 和 extras 字段。

关键字类型选项父项目含义说明
mutable-contentboolean可选notification.ios通知扩展推送的时候携带 ”mutable-content”:true 说明是支持 iOS 10 的 UNNotificationServiceExtension,如果不携带此字段则是普通的 Remote Notification,详情参考:UNNotificationServiceExtension
extrasJSON Object可选notification.ios附加字段这里自定义 key / value 信息,这个 key(my-attachment)值,需要与客户端的值对应,客户端工程拿到 key 值对应的 url 图标加载出来。
          "notification": {
    "ios": {
        "alert": {
            "title": "title",
            "subtitle": "subtitle"
        },
        "mutable-content": true,
        "extras": {
            // 这个 key(my-attachment)值,需要与客户端的值对应,客户端工程拿到 key 值对应的 url 图标加载出来。
            "my-attachment": "https://raw.githubusercontent.com/Tikon/imgRepo/master/ic_launcher.png"
        }
    }
}  

        

控制台下发

Android

支持版本

极光通道从 JPush Android SDK v3.1.7 开始支持,厂商通道图标从 JPush SDK 3.9.0 开始支持。

通道支持情况

通道动态设置小图标右侧图标大图片
极光支持支持(魅族手机本身不支持)支持
小米支持支持支持
华为支持支持(仅服务与资讯消息支持)不支持
oppo不支持支持支持
FCM不支持支持支持
魅族不支持不支持不支持
vivo不支持不支持不支持

说明:

  • 华为服务与资讯消息类申请参考 消息分类(Channel ID)
  • OPPO 单点推送不支持右侧图标和大图片,若 OPPO 推送目标小于 20 个,极光后台调用 OPPO 的单点推送接口下发消息,详情参考 OPPO 说明文档
  • OPPO 推送目标大于 20 个且 ColorOS 版本 >5.0 ,在连接 wifi 的状态下通知栏第一条消息展示大图,非第一条消息不显示大图。

小图标

客户端设置

  • 如果项目中有 res/drawable-xxxx/jpush_notification_icon 资源,则默认使用 jpush_notification_icon 作为通知小图标。
  • 如无 jpush_notification_icon 资源,则默认使用应用图标。
  • FCM 通道设置默认小图标:
          <!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
     See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/jpush_notification_icon" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
     notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />

        

服务端设置

若需要动态设置通知栏小图标,可在 android 下配置 small_icon_uri 字段,厂商通道可在 options.third_party_channel 下配置对应厂商的 small_icon_uri 字段,优先使用厂商字段, 厂商字段没有填充,则使用 android 下的 small_icon_uri 字段。

注意:若使用小米通道,small_icon_uri 必须使用极光图片上传接口得到的图片路径(建议使用 media_id 值),详情参考 图片 API

关键字类型选项父项目含义说明
small_icon_uristring可选notification.
android
通知栏小图标图标大小不超过 30 k (注:从 JPush Android SDK v4.0.0 版本开始,图片大小限制提升至 300 k)。可以是以 http 或 https 开头的网络图片。可以是通过极光图片上传接口得到的 media_id 值,详情参考 图片 API(推荐使用)。此字段值,若是 media_id, 则对其它厂商通道生效,若非 media_id,则对走华硕通道和极光通道下发的消息生效,不影响请求走其它厂商通道。
small_icon_uristring可选options.
third_party_channel. 厂商
厂商消息小图标样式目前支持小米 / 华为两个厂商。优先使用厂商字段, 厂商字段没有填充,则使用 android 里面定义 small_icon_uri 字段。小米支持极光的 media_id 及小米厂商的小图标 id,华为支持极光的 media_id 及华为厂商本地路径。(小米官方后续不再支持自定义小图标,建议开发者不要继续使用小米 small Icon 相关特性功能)。
small_icon_colorstring可选options.
third_party_channel.
xiaomi
小米厂商小图标样式颜色为了适配小米厂商的消息小图标样式颜色,不填充默认是灰色。

示例如下:

          "notification": {
    "android": {
        "alert": "Hi, JPush!",
        "title": "Send to Android",
        // 此字段值,若是极光 media_id, 则对其它厂商通道也会使用这个 media_id 下发,若非 media_id,则对走华硕通道下发和极光自有通道下发生效,不影响请求走其它厂商通道。
        "small_icon_uri": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699"
    }
},
"options": {
    "time_to_live": 60,
    "third_party_channel": {
        "xiaomi": {
            "distribution": "ospush",
            // 通知样式需切换到原生样式传值才生效,但是原生样式默认是灰白,需要传值 small_icon_color 染色
            "small_icon_uri": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
            "small_icon_color": "#00FF00" // 染绿色
        },
        "huawei": {
            "distribution": "ospush",
            "small_icon_uri": "/raw/icon_hw" // 后台指定的路径,在客户端工程需要有这个图片, 放置目录为 res/raw/xxx.png               
        }
    }
}

        

右侧图标 / 大图片

通过服务端下发指定参数即可实现右侧图标和大图片展示。

注意:若使用小米通道, large_icon/big_pic_path 必须使用极光图片上传接口得到的图片路径(建议使用 media_id 值),详情参考 图片 API

服务端设置

关键字类型选项父项目含义说明
styleint可选notification.
android
通知栏样式类型默认为 0,还有 1,2,3 可选,用来指定选择哪种通知栏样式,其他值无效。有三种可选分别为 bigText=1,Inbox=2,bigPicture=3。
big_pic_pathstring可选notification.
android
大图片通知栏样式当 style = 3 时可用,目前支持 .jpg 和 .png 格式的图片。支持网络图片 url、本地图片的 path、极光 media_id。如果是 http/https 的 url,会自动下载;如果要指定开发者准备的本地图片就填 sdcard 的相对路径。
large_iconstring可选notification.
android
通知栏大图标图标大小不超过 30 k(注:从 JPush Android SDK v4.0.0 版本开始,图片大小限制提升至 300 k)。可以是以 http 或 https 开头的网络图片。可以是位于 drawable 资源文件夹的图标路径。可以是通过极光图片上传接口得到的 media_id 值。此字段值,若是 media_id, 则对其它厂商通道生效,若非 media_id,则对走华硕通道和极光通道下发的消息生效,不影响请求走其它厂商通道。
styleint可选options.
third_party_channel.
厂商
厂商消息大文本 /inbox/ 大图片样式为了适配厂商的消息大文本 /inbox/ 大图片样式,不填充默认是 0。对应关系 bigText=1,Inbox=2,bigPicture=3。
big_pic_pathstring可选options.
third_party_channel.
厂商
厂商大图片通知栏样式支持小米 /oppo 两个厂商。优先使用厂商字段, 厂商字段没有填充,则使用 android 里面定义 big_pic_path 字段。建议使用 极光 media_id,需配合各自厂商的 style 使用。
large_iconstring可选options.
third_party_channel.
厂商
厂商消息大图标样式支持小米 / 华为 /oppo 三个厂商。优先使用厂商字段, 厂商字段没有填充,则使用 android 里面定义 large_icon 字段 android 内的 large_icon。其中小米支持极光的 media_id(详见: 图片 API) 及小米厂商的大图标 id, 但必须配合小米 big_text 或者是 big_pic_path 使用,否则无效。华为支持极光的 media_id 及网络 https 路径。oppo 支持极光的 media_id 及 oppo 厂商的大图标 id。

示例如下:

          {
    "notification": {
        "android": {
            "alert": "Hi, JPush!",
            "title": "Send to Android",
            "large_icon": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
            "big_pic_path": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
            "style": 3
        }
    },
    "options": {
        "third_party_channel": {
            // 此处所传的 large_icon 和 big_pic_path,必须是调用极光图片 API 返回的路径,否则推送到厂商将会报错。
             "xiaomi": {
                "distribution": "ospush",
                "big_text": "testbigtext",
                // 必须配合小米 big_text 或者是 big_pic_path 使用
                "large_icon": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
                "big_pic_path": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
                "style": 3
            },
            // 华为只支持右侧图标,不支持大图片
            "huawei": {
                "distribution": "ospush",
                "large_icon": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
                "style": 1
            },
            //oppo 单推不支持大图片和右侧图标,极光内部目前如果推送的 OPPO 目标小于 20 都会用 oppo 的单推接口下发推送,因此推送目标小于 20 个大图片和右侧图标是不生效的
            "oppo": {
                "distribution": "ospush",
                "large_icon": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
                "big_pic_path": "jgmedia-2-98dc326f-f2f4-48ab-bb6b-1b87a803d699",
                "style": 3
            }
        }
    }
}

        

FAQ

小图标

1. 小图标显示为灰色

  • 谷歌原生 Android 5.0 以上的 ROM 都会对 target sdk 大于等于 21 的 App 的小图标进行处理,增加一层颜色,导致图标变灰。我们可以定义 没有阴影和渐变色、镂空背景 的 icon 同名替换项目中 res/drawable-xxxx/jpush_notification_icon 这个文件,该方式显示的小图标即可为灰色(但是图标有形状)。请严格按照要求制作图片,并将 res 文件夹下的 所有 icon 文件 都替换成自己的图标文件。
  • 由于部分系统(一加手机、google 手机 android10 系统等)对图标有限制,目前无法处理。
  • 小米手机的 launcher 可能有缓存,按照上述要求配置好后, 需 重启手机 后再测试。
  • 小米手机无论走极光通道还是小米通道,都需要切换到原生样式才可以生效。

2. 客户端更换 icon 图标不生效

由于系统、厂商服务器会缓存图标,小米和魅族手机可能会出现此现象,建议卸载应用,重启手机后重新安装新包后测试。

右侧图标 / 大图片

推送的时候做了以上处理,右侧图标 / 大图片还是无法展示?

1.极光通道
如果走极光通道也不生效,请确认用户是否调用过 设置默认通知栏样式构建类 接口更改过极光默认样式。如果有调用,请删除此接口,卸载重装 App 后重试。

2.APNs 通道
iOS 的右侧图标和大图片是一图两用的情况,App 在前台时收到推送弹窗,下拉消息可以查看大图片,其他情况仅展示为右侧图标。

3.FCM 通道
Firebase 官网的右侧图标和大图片是一图两用的情况,指定右侧图标和大图片推送,未展开消息时显示为右侧图标,展开消息后展示为大图片,详情如下图。

极光消息推送如何实现自定义铃声?

极光消息推送如何实现自定义铃声?

通知和自定义消息均支持自定义铃声,实现方式如下:

消息类型实现方法注意事项
通知1. 客户端创建自定义渠道并设置自定义铃声。2. 服务端指定渠道 ID(channel_id)下发推送。仅部分厂商通道支持自定义铃声,详情参考 支持通道说明
自定义消息客户端收到自定义消息回调后,自行处理响铃逻辑。自定义消息回调依赖极光推送长链接,App 必须在线才可以收到自定义消息,否则无法处理播报逻辑。

支持通道说明

消息类型通道备注
通知极光通道FCM 通道一加的 OPPO 通道小米通道华为通道小米需要在小米官网上申请并创建。华为仅 数据处理位置 在海外地区支持 channel id,中国区需下发华为的 sound 和 default_sound 字段设置自定义铃声。其他通道直接创建带有自定义铃声的 channel,推送时带 channel_id 进行下发。
自定义消息极光通道小米通道华为通道自定义消息回调依赖极光推送长链接,App 必须在线才可以收到自定义消息。

从 Android 8.1(API 级别 27)开始,应用程序每秒不能多次发出通知声音。如果您的应用在一秒钟内发布多个通知,它们都会按预期显示,但每秒只有第一个通知发出声音。

极光/OPPO/FCM 通道通知实现

客户端设置

1.在项目工程 src/main/res/raw 下放入声音文件,这个文件对应服务端指定的 sound 字段(适配 8.0 以下系统)。
2.创建 channel 并设置 sound,详情参考 NotificationChannel 配置

          private void initChannel(){if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            if (nm != null){NotificationChannelGroup notificationChannelGroup = new NotificationChannelGroup("MyGroupId", "自定义通知组");
                nm.createNotificationChannelGroup(notificationChannelGroup);

                NotificationChannel notificationChannel = new NotificationChannel("m_channel123", "自定义通知 1", NotificationManager.IMPORTANCE_HIGH);
                notificationChannel.setGroup("MyGroupId");
                notificationChannel.enableLights(true);
                notificationChannel.enableVibration(true);
                notificationChannel.setSound(Uri.parse("android.resource:// 包名 /raw/ 铃声文件名称"), null); 

                nm.createNotificationChannel(notificationChannel);
            }
        }
    }

        

服务端设置

推送时需要在 notification 下配置 sound 和 channel_id 字段,channel_id 需与客户端 创建的 channel 一致。

关键字类型选项含义说明
soundString可选填写 Android 工程中 /res/raw/ 路径下铃声文件名称,无需文件名后缀注意:针对 Android 8.0 以上,当传递了 channel_id 时,此属性不生效。
channel_idString可选通知栏消息分类不超过 1000 字节,Android 8.0 开始可以进行 NotificationChannel 配置,这里根据 channel_id 来指定通知栏展示效果。

示例如下:

          {
    "notification": {
        "android": {
            "alert": "message alert",
            "title": "title",
            // 如果 sound 和 channel_id 都有传,那么会以 channel_id 的铃声为准
            "sound": "coin",
            "channel_id": "m_channel123"
        }
    }
}

        

小米通道通知实现

自 2021 年 5 月 20 日起,小米官方将消息分为重要级别和普通级别两大类。普通级别消息为运营消息,振动、响铃、呼吸灯、悬浮、锁屏效果均无;如有响铃、振动等需求,需要您申请和接入重要级别 channel,以便享受重要级别的权限。​

申请渠道方法

1.以开发者账号登录 小米推送运营平台,单击“应用管理 – 通知类别”菜单。
2.在“通知类别”页面中单击“申请重要级别消息 Channel”,进入重要级别消息申请页面。

3.申请页面中默认展示“服务提醒”channel 的申请入口,如下图所示:
 4.单击“服务提醒”操作栏中的“申请”,填写申请信息,单击“确认”提交申请。

5.特殊场景下,如果一个“服务提醒” channel 不能满足您的业务需要,您需要使用多个重要级别 channel 或者需要给不同的 channel 设置个性化的提醒效果,待“服务提醒” channel 的申请审核通过后变为“启用中”状态时,可点击“申请其他个性化重要级别消息 Channel”按钮申请其他 channel。

6.配置自定义铃声地址。配置放在 res/raw 目录下的铃声文件,不用加后缀,示例:android.resource://PACKAGENAME/raw/voice1

服务端处理

推送时在 notification 下指定 channel_id 字段进行下发。

          {
    "notification": {
        "android": {
            "alert": "你好!xiaomi",
            "title": "你有一个快递信息",
            "channel_id": "MyChannelId"
        }
    }
}

        

华为通道通知实现

根据消息内容,华为推送将通知分类为服务与通讯、资讯营销两大类别,并对不同类别消息的提醒方式、消息样式进行差异化管理,具体如下:

消息类型服务与通讯资讯营销
推送内容包括社交通讯类消息和服务提醒类消息。包括资讯类消息和营销类消息,指的是运营人员向用户发送的活动信息、内容推荐、资讯等。
提醒方式(EMUI 10.0 及以上)锁屏、铃声、振动静默通知,仅在下拉通知栏展示消息
消息样式文本 + 小图仅有文本
配置方式需要向华为申请自分类权益,审核通过后将信任开发者提供的分类信息,消息不经过智能分类。默认

注意:2021 年 11 月开始,若您在华为官网申请的应用数据处理位置为中国区时,channel_id 字段无效,所以华为通道仅海外地区可以使用 channel_id 来实自定义铃声。 

  • 自定义渠道功能不再适用于 数据处理位置 为中国区的应用,您的推送消息将按照智能分类系统或消息自分类权益确认的消息级别,归类为 服务与通讯类 或 资讯营销类 消息。
  • 静默通知指的是消息到达终端没有震动、铃声、状态栏图标、弹窗和锁屏,只展示在下拉通知栏界面。
  • 用户终端上对应渠道的开关控制和提醒方式决定消息最终提醒方式。

中国区设置

若您在华为官网申请的应用数据处理位置为中国区,可以通过服务端首次给应用推送 服务与通讯消息 时,携带 sound 和 default_sound 字段来实现自定义铃声,sound、 default_sound 和 importance 参数都在 option.third_party_channel.huawei 字段下。

注意:由于铃声是通知渠道的属性,因此铃声仅在首次创建渠道(设置 sound)有效,后续无法修改。

服务端设置

关键字类型选项含义说明
soundstring可选华为自定义铃声铃声文件必须存放在应用的 /res/raw 路径下,例如“/res/raw/shake.mp3”,对应 sound 值参数为“/raw/shake”,无需后缀,支持的格式包括 MP3、WAV、MPEG 等。仅首次给应用推送服务与通讯消息时设置有效,需要配合 default_sound 一起使用。
default_soundboolean可选华为默认铃声控制开关设置自定义铃声时与 sound 字段配合使用,且 default_sound 值设置为 false。注意:由于铃声是通知渠道的属性,因此自定义铃声仅在首次创建渠道(设置 sound)有效,后续无法修改。true:使用系统默认铃声。false:使用 sound 自定义铃声。
importancestring可选华为通知栏消息智能分类取值为 “LOW” 时,表示消息为资讯营销类型。取值为 “NORMAL” 时,表示消息为服务与通讯类型。
          {
    "platform": "all",
    "audience": {
        "registration_id": ["1104a8979278ae64e75"]
    },
    "notification": {
        "android": {
            "alert": "message alert"
        }
    },
    "options": {
        "third_party_channel": {
            "huawei": {
                "sound":"/raw/shake",
                "default_sound":false,
                "importance": "NORMAL"//表示消息为服务与通讯类型
            }
        }
    }
}

        

海外地区设置

客户端设置

若您在华为官网申请的应用数据处理位置为非中国区时,可以使用自定义渠道去设置自定义铃声,客户端设置详情参考 创建自定义渠道

华为自分类权益申请

创建渠道后,需要申请服务与通讯类型的通知,申请详情参见 华为消息分类管理方案

  • 若应用没有自分类权益,则应用的推送消息将通过智能分类进行自动归类。
  • 若应用有自分类权益,将信任开发者提供的分类信息,消息不经过智能分类。

服务端设置

消息分类的申请审核通过后,即可在 options.third_party_channel.huawei 字段下指定 channel_id 和 importance 参数进行下发。

关键字类型选项含义说明
channel_idstring可选通知栏消息分类不超过 1000 字节,Android 8.0 开始可以进行 NotificationChannel 配置,这里根据 channel_id 来指定通知栏展示效果。
importancestring可选华为通知栏消息智能分类取值为 “LOW” 时,表示消息为资讯营销。取值为 “NORMAL” 时,表示消息为服务与通讯。
          {
    "platform": "all",
    "audience": {
        "registration_id": ["1104a8979278ae64e75"]
    },
    "notification": {
        "android": {
            "alert": "message alert"
        }
    },
    "options": {
        "third_party_channel": {
            "huawei": {
                "channel_id": "自定义 channel id"
                "importance": "NORMAL"//表示消息为服务与通讯类型
            }
        }
    }
}

        

自定义消息实现

若需要动态播报自定义铃声,可下发自定义消息,客户端在自定义消息回调中自行处理播放逻辑。

          import cn.jpush.android.service.JPushMessageReceiver;

public class PushMessageReceiver extends JPushMessageReceiver {
    private static final String TAG = "PushMessageReceiver";
    @Override
    public void onMessage(Context context, CustomMessage customMessage) {Log.e(TAG,"[onMessage]"+customMessage);
        // 在此回调中处理播报

  }

        

极光消息推送如何实现数字角标?

极光消息推送如何实现数字角标?

通道支持说明

由于不同手机系统的限制,仅部分通道支持角标展示,支持情况如下:

手机类型极光通道厂商通道是否需要配置
iOS支持
华为支持​支持
小米支持支持
vivo支持不支持
OPPO不支持不支持
魅族不支持不支持

注意:仅 JPush SDK 4.4.0 及以上版本支持 vivo 角标。

iOS 角标

 JPush 封装 badge 功能,允许应用上传 badge 值至 JPush 服务器,由 JPush 后台帮助管理每个用户所对应的推送 badge 值,简化了设置推送 badge 的操作。

支持的版本

开始支持的版本:1.7.4

上传本地角标值

设置 JPush 服务器中存储的 badge 值,接口如下:

          + (BOOL)setBadge:(int)value

        
  • value 取值范围:[0,99999]
  • 本地仍须调用 [application setApplicationIconBadgeNumber:0] 函数设置图标上显示的 badge 值。

服务端设置

服务端推送时需要在 ios 字段下设置 badge 值。

关键字类型选项含义说明
badgeint可选应用角标可设置为 N、+N、-N,N 的取值范围为 [0,99]。若上传的角标值 value 为 10,表示角标会设置为 N、10+N、10-N(值小于 0 时默认清除角标)。为 0 或空字符串,则表示清除角标。如果不填,表示不改变角标数字。JPush 官方服务端 SDK 会默认填充 badge 值为 “+1″,详情参考:badge +1
          //服务端发送 json 消息串
{
    "notification": {
        "ios": {
            "alert": "hello, JPush!",
            "badge": "+1" //可传值为N,+N,-N, 0表示清除。
        }
    }
}

        

清除角标

1.点击通知时,客户端需要调用原生接口 setApplicationIconBadgeNumber 清除本地角标显示值。

          - (void)applicationWillEnterForeground:(UIApplication *)application {
  [application setApplicationIconBadgeNumber:0];
  [application cancelAllLocalNotifications];
}

        

2.清空 JPush 服务器中存储的 badge 值,即 [setBadge:0],接口如下:

          + (void)resetBadge

        

华为/荣耀角标

支持的版本

华为开始支持的版本:3.3.6 荣耀开始支持的版本:4.7.0

客户端配置

华为设备 EMUI 8.0 及以上、荣耀设备 Magic UI 5.0+ 支持数字角标展示,需要在 AndroidManifest.xml 里配置指定的权限 :

          <uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE "/>
<uses-permission android:name="com.hihonor.android.launcher.permission.CHANGE_BADGE" />

        

服务端设置

完成客户端配置后,服务端推送时在 android 字段下配置 badge_class、badge_add_num 或 badge_set_num 字段,则可显示角标。

  • badge_add_num 表示设置角标数字累加值,在原角标的基础上进行累加。
  • badge_set_num 表示设置角标数字固定值。
关键字类型选项含义说明
badge_add_numint可选设置角标数字累加值,在原角标的基础上进行累加此属性目前仅针对华为 EMUI 8.0 及以上、小米 MIUI 6 及以上、vivo、荣耀设备生效。此字段如果不填,表示不改变角标数字。取值范围为:1-99,若设置了取值范围内的数字,下一条通知栏消息配置的 badge_add_num 数据会和原角标数量进行相加,建议取值为 1。
举例:badge_add_num 取值为 1,原角标数为 2,发送此角标消息后,应用角标数显示为 3。针对华为 / 荣耀通道,如果 badge_set_num 与 badge_add_num 同时存在,则以 badge_set_num 为准。
badge_set_numint可选设置角标数字固定值此属性目前仅针对华为 EMUI 8.0 及以上、荣耀设备走厂商通道时生效,如果 badge_set_num 与 badge_add_num 同时存在,则以 badge_set_num 为准。取值范围为:1-99,若设置了取值范围内的数字,对应下一条通知栏消息配置的 badge_set_num 数字则为角标数值,举例:badge_set_num 取值为 1,无论应用之前角标数为多少,发送此角标消息后,应用角标数均显示为 1。
badge_classstring可选桌面图标对应的应用入口 Activity 类, 比如“com.test.badge.MainActivity”仅华为和荣耀通道推送时生效,此值如果填写非主 Activity 类,以厂商限制逻辑为准。若需要实现角标累加功能,需配合 badge_add_num 使用,二者需要共存,缺少其一不可。若需要实现角标固定值功能,需配合 badge_set_num 使用,二者需要共存,缺少其一不可。
          //服务端发送 json 消息串
{
    "notification": {
        "android": {
            "alert": "hello, JPush!",
            "badge_add_num": 1, //角标增加值,取值范围1-99
            "badge_set_num": 1, //角标固定值,取值范围1-99
            "badge_class": "com.test.badge.MainActivity", //默认为 APP 的主 Activity
        }
    }
}

        

控制台设置

需要在【消息推送】-【推送设置】-【集成设置】-【华为/荣耀】点击编辑配置应用入口 Activity 类。注意必须是应用入口 Activity 类,且荣耀和华为厂商配置一致,否则无法显示角标。

清除角标

点击通知时,客户端需要手动清除角标数:

接口定义

          public static void setBadgeNumber(Context context, int num)

        

参数说明

  • context 是应用的 ApplicationContext
  • num 新的角标数字,传入负数将会修正为0

示例如下:

          JPushInterface.setBadgeNumber(this,0);

        

小米角标

小米 MIUI 6 及以上设备支持数字角标,小米系统自动处理数字角标展示功能,默认收到通知+1处理,打开 App 清零。

vivo 角标

vivo 设备仅支持走极光通道时可以显示角标。

支持版本

开始支持的版本:4.4.5

客户端配置

1.vivo 需要在 AndroidManifest.xml 里配置指定的权限:

          <uses-permission android:name="com.vivo.notification.permission.BADGE_ICON" /> />

        

2.“桌面图标角标”默认关闭,需要用户手动开启。

  • 开启路径:“设置”-“通知与状态栏”-“应用通知管理”-应用名称-“桌面图标角标”。
  • 未成功接入“桌面图标角标”的应用,无“桌面图标角标”选项。
  • 视OS版本差异,“桌面图标角标”名称可能为“应用图标标记”或“桌面角标”。

3.只有走极光通道,有 onNotifyMessageArrived 回调的前提下,角标才可生效。

服务端设置

完成客户端配置后,服务端推送时在 android 字段下配置 badge_add_num 和 badge_class 字段,则可显示角标。

关键字类型选项含义说明
badge_add_numint可选角标数字,取值范围1-99此字段如果不填,表示不改变角标数字;若设置了取值范围内的数字,下一条通知栏消息配置的 badge_add_num 数据会和之前角标数量进行增加。
建议 badge_add_num 配置为1; 举例:badge_add_num 配置1,应用之前角标数为2,发送此角标消息后,应用角标数显示为3。
          //服务端发送 json 消息串
{
    "notification": {
        "android": {
            "alert": "hello, JPush!",
            "badge_add_num": 1, //角标增加值,取值范围1-99
            "badge_class": "com.test.badge.MainActivity", //默认为 APP 的主 Activity
        }
    }
}

        

清除角标

点击通知时,客户端需要手动清除角标数:

接口定义

          public static void setBadgeNumber(Context context, int num)

        

参数说明

  • context 是应用的 ApplicationContext
  • num 新的角标数字,传入负数将会修正为0

示例如下:

          JPushInterface.setBadgeNumber(this,0);

极光消息推送SDK 隐私合规问题处理

极光消息推送SDK 隐私合规问题处理

主要处理思路

  • 更新 SDK 至 最新版本
  • 在隐私条款中引用 极光隐私政策
  • 添加合规授权相关接口的调用,接口详情参考 隐私政策与合规引导
    • 在初始化 SDK 之前,如果用户尚未同意隐私条款,须调用 JCollectionAuth.setAuth(context,false),以告知 SDK 不进行初始化。
    • 如果用户已同意过隐私条款或者用户触发了同意隐私条款,再调用 JCollectionAuth.setAuth(context,true)。
    • 在用户同意隐私条款之前,不要调用极光 SDK 的任何接口。包括 JPushInterface、JCoreInterface、JVerificationInterface 以及厂商相关接口,例如:JPluginPlatformInterface。并且华为不能配置 <meta-data android:name="push_kit_auto_init_enabled" android:value="true"/>

代码样例如下:

          // 调整点一:初始化代码前增加setAuth调用
boolean isPrivacyReady; // app根据是否已弹窗获取隐私授权来赋值
if(!isPrivacyReady){
    JCollectionAuth.setAuth(context, false); // 后续初始化过程将被拦截
}
JPushInterface.init()
  
  
// 调整点二:隐私政策授权获取成功后调用
JCollectionAuth.setAuth(context, true); //如初始化被拦截过,将重试初始化过程

        

隐私政策

极光 SDK 隐私政策

集成极光推送 SDK 需要在《隐私政策》中向用户告知,内容如下:

极光推送 SDK
第三方主体:深圳市和讯华谷信息技术有限公司
SDK 用途:为 APP 用户提供信息推送服务
收集个人信息类型:
设备参数及系统信息(设备类型、设备型号、系统版本、及相关硬件信息):用于识别用户的设备类型、设备型号、系统版本等,确保消息准确下发;
设备标识符(IMEI、IDFA、Android ID、GID、 MAC、OAID、VAID、AAID、IMSI、MEID、UAID、SN、ICCID、SIM信息):用于识别唯一用户,保证推送的精准送达及推送信息的准确统计;
网络信息(IP 地址、WiFi 信息、基站信息、DNS地址、DHCP地址、SSID、BSSID)与位置信息(经纬度):用于优化SDK与极光服务器的网络连接请求,保证服务的稳定性和连续性,同时实现区域推送功能;
应用列表信息(应用崩溃信息、通知开关状态、APP 应用列表及活跃状态、APP 应用页面信息、APP 功能事件相关信息):当一个设备有多个 APP 的推送链路同时活跃时,我们采用合并链路技术,随机合并成一条链路,以达到为用户节省电省流量的目的。
数据处理方式:通过去标识化、加密传输及其他安全方式
官网链接:https://www.jiguang.cn/push
隐私政策链接:https://www.jiguang.cn/license/privacy

第三方 SDK 隐私政策

若通过极光推送 SDK 同时集成了厂商通道,请在《隐私政策》中增加对于厂商通道的隐私政策说明,内容如下:

小米推送 SDK
涉及的个人信息类型:设备标识符(如 Android ID、OAID、GAID)、设备信息
使用目的:推送消息
使用场景:在小米手机终端推送消息时使用
第三方主体:北京小米移动软件有限公司
数据处理方式:通过去标识化、加密传输及其他安全方式
官网链接:https://dev.mi.com/console/appservice/push.html
隐私政策:https://dev.mi.com/console/doc/detail?pId=1822

华为 HMS SDK
涉及的个人信息类型:应用基本信息、应用内设备标识符、设备的硬件信息、系统基本信息和系统设置信息
使用目的:推送消息
使用场景:在华为手机终端推送消息时使用
第三方主体:华为软件技术有限公司
数据处理方式:通过去标识化、加密传输及其他安全方式
官网链接:https://developer.huawei.com/consumer/cn/
隐私政策:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/sdk-data-security-0000001050042177

荣耀推送 SDK
涉及的个人信息类型:应用匿名标识 (AAID),应用 Token
使用目的:推送消息
使用场景:在荣耀手机终端推送消息时使用
第三方主体:荣耀终端有限公司
数据处理方式:通过去标识化、加密传输及其他安全方式
官网链接:https://developer.hihonor.com/cn/promoteService
隐私政策:https://www.hihonor.com/cn/privacy/privacy-policy/

OPPO 推送 SDK
涉及的个人信息类型:设备标识符(如 IMEI、ICCID、IMSI、Android ID、GAID)、应用信息(如应用包名、版本号和运行状态)、网络信息(如 IP 或域名连接结果,当前网络类型)
使用目的:推送消息
使用场景:在 OPPO 手机终端推送消息时使用
第三方主体:广东欢太科技有限公司
数据处理方式:通过加密传输和处理的安全处理方式
官网链接:https://open.oppomobile.com/new/introduction?page_name=oppopush
隐私政策:https://open.oppomobile.com/wiki/doc#id=10288

vivo 推送 SDK
涉及的个人信息类型:设备信息
使用目的:推送消息
使用场景:在 vivo 手机终端推送消息时使用
第三方主体:广东天宸网络科技有限公司及将来受让运营 vivo 开放平台的公司
数据处理方式:通过去标识化、加密传输及其他安全方式
官网链接:https://dev.vivo.com.cn/promote/pushNews
隐私政策:https://www.vivo.com.cn/about-vivo/privacy-policy

魅族推送 SDK
涉及的个人信息类型:设备标识信息、位置信息、网络状态信息、运营商信息
使用目的:推送消息
使用场景:在魅族手机终端推送消息时使用
第三方主体:珠海市魅族通讯设备有限公司
数据处理方式:通过去标识化、加密传输及其他安全方式
官网链接:https://open.flyme.cn/service?type=push
隐私政策:https://www.meizu.com/legal.html

常见工信部问题处理

工信部通报问题类型工信部通报问题类型详细描述极光建议
违规收集个人信息未经用户同意,存在读取设备 mac 地址的行为,且隐私政策中未见清晰明示 mac 地址、软件安装列表和 IMEI 的收集使用规则1. 需要检查隐私政策是否完整披露收集相关个人信息类型、目的等信息。

2. 需要检查是否在用户同意隐私政策前就开始调用接口,收集个人信息。

3. 一键登录本质是手机号码登录,需要获取 IMEI、IMSI 信息;是用户授权后行为并不影响隐私合规
注册登录环节默认勾选同意隐私政策改为用户主动点击的形式“同意”隐私政策
APP 在同意隐私政策的环节未提供拒绝按钮为在同意隐私政策环节添加“拒绝”或者“不同意”的选项
超范围收集个人信息未见向用户告知且未经用户同意,在后台运行时,存在每 1 小时读取一次位置信息的行为,非服务所必需且无合理应用场景,超出与收集个人信息时所声称的目的具有直接或关联的范围1. 在隐私政策中阐明收集个人信息的目的,体现所收集个人信息对于提供服务的。

2. 如无合理使用场景,则建议根据工信部的要求,关闭相关端口,停止收集超出合理范围的个人信息。
违规使用个人信息APP 未见向用户告知且未经用户同意,存在将“IMEI、IMSI、设备 MAC 地址”个人信息发送给第三方 SDK 的行为详情参考 主要处理思路
APP 频繁自启动和关联启动APP 未向用户告知,未经用户同意,且无合理的使用场景,存在频发自启动和关联启动的行为1. 在隐私政策中阐明自启动和关联启动的合理场景(为提升消息的送达率,及时地为您进行消息提醒,我们会默认为您开启关联启动功能,以保持应用的活跃度。如您不想开通此功能,我们建议您手动进行关闭,一般关闭路径:设置 – 应用 – 应用启动管理 – 选择应用“搜狐视频”- 关闭关联启动功能)
2. 关闭相关启动端口
强制、频繁、过度索取权限APP 首次启动时,申请存储权限,用户拒绝授权后,应用陷入弹窗循环,无法正常使用去除首次启动时的权限申请,仅在功能使用时申请相关权限
点击 APP“我的”,未见使用权限对应的相关产品或服务不索取与提供服务无关的相关权限。如确实为提供服务所必需,建议在隐私政策中详细说明
强制用户使用定向推送功能明示存在定向推送功能,但未见提供退出或关闭个性化展示模式的选项,如拒绝接收定向推送消息,或停止、退出、关闭相应功能的机制在 APP 界面内为终端用户设置对应的关闭选项

极光消息推送iOS 通知点击跳转

极光消息推送iOS 通知点击跳转

推送时下发附加参数,客户端获取参数后做相应的业务跳转逻辑。

服务端使用

控制台使用

API 使用

关键字类型选项含义说明
extrasJSON Object可选附加字段这里自定义 Key / value 信息,以供业务使用。
          "ios": {
    "alert": "hello, JPush!",
    "badge": 1,
    "extras": {
        "news_id": 134,
        "my_key": "a value"
    }
}

        

客户端获取参数

通知

iOS 设备收到通知推送(APNs ),用户点击推送通知打开应用时,应用程序根据运行状态进行不同处理:

  • App 在前台运行:
          - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger options))completionHandler {
  NSDictionary * userInfo = notification.request.content.userInfo;
  
  UNNotificationRequest *request = 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;  // 推送消息的标题
  
  if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    [JPUSHService handleRemoteNotification:userInfo];
    NSLog(@"iOS10 前台收到远程通知:%@", [self logDic:userInfo]);

    [rootViewController addNotificationCount];
  }
  else {
    // 判断为本地通知
    NSLog(@"iOS10 前台收到本地通知:{\nbody:%@,\ntitle:%@,\nsubtitle:%@,\nbadge:%@,\nsound:%@,\nuserInfo:%@\n}",body,title,subtitle,badge,sound,userInfo);
  }
  completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以设置
}

        
  • App 在后台时(需要点击通知才能触发回调):
          - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(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;  // 推送消息的标题
  
  if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    [JPUSHService handleRemoteNotification:userInfo];
    NSLog(@"iOS10 收到远程通知:%@", [self logDic:userInfo]);
    [rootViewController addNotificationCount];

  }
  else {
    // 判断为本地通知
    NSLog(@"iOS10 收到本地通知:{\nbody:%@,\ntitle:%@,\nsubtitle:%@,\nbadge:%@,\nsound:%@,\nuserInfo:%@\n}",body,title,subtitle,badge,sound,userInfo);
  }
  
  completionHandler();  // 系统要求执行这个方法
}

        
  • App 未启动状态:
          - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; 
// apn 内容获取:
NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]

        

自定义消息

  • 仅 APP 在前台运行时才能收到自定义消息的推送。
  • 从 JPush 服务器获取用户推送的自定义消息内容和标题以及附加字段等。

实现方法
获取 iOS 的推送内容需要在 delegate 类中注册通知并实现回调方法。
在方法- (BOOL)application:(UIApplication _)application didFinishLaunchingWithOptions:(NSDictionary _) launchOptions 加入下面的代码:

          NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self selector:@selector(networkDidReceiveMessage:) name:kJPFNetworkDidReceiveMessageNotification object:nil];

        

实现回调方法 networkDidReceiveMessage

          - (void)networkDidReceiveMessage:(NSNotification *)notification {
    NSDictionary * userInfo = [notification userInfo];
    NSString *content = [userInfo valueForKey:@"content"];
    NSString *messageID = [userInfo valueForKey:@"_j_msgid"];
    NSDictionary *extras = [userInfo valueForKey:@"extras"]; 
    NSString *customizeField1 = [extras valueForKey:@"customizeField1"]; //服务端传递的 Extras 附加字段,key 是自己定义的  
}

极光消息推送Android 通知点击跳转教程

本文旨要介绍有目标地址时如何使用 intent、deeplink 和直接打开应用的方式实现点击通知跳转到目标页面。极光强烈建议你升级 SDK 至 4.6.0 及以上版本,并配置通知跳转目标地址来实现点击通知跳转功能。

支持版本

Rest API 的 intent 字段包括 intent、deeplink 和直接打开应用的跳转方式。

  • SDK<4.2.2 的版本,intent 字段值仅走华硕通道和极光通道时生效,不影响请求走其它厂商通道。
  • SDK ≥ 4.2.2 的版本,API 推送时建议填写 intent 字段,否则点击通知可能无跳转动作。

配置目标地址说明

配置通知跳转目标地址指推送下发时有在控制台或者 API 中完成以下配置。

控制台配置

控制台下发时配置 “Android 点击通知打开”中任意一个选项。 

API 使用

API 推送时在 notification.android 下发 intent 或者 uri_activity、uri_action 字段。

  • SDK ≥ 4.2.2 的版本,只需要填写 intent 参数。
  • SDK<4.2.2 的版本,且配置过 uri_activity 和 uri_action 跳转的,只需要填写 uri_activity 和 uri_action。
关键字类型选项含义说明
intentJSON Object可选指定跳转页面使用 intent 里的 url 指定点击通知栏后跳转的目标页面;SDK<4.2.2的版本,此字段值仅对走华硕通道和极光自有通道下发生效,不影响请求走其它厂商通道。SDK≥4.2.2的版本,API 推送时建议填写 intent 字段,否则点击通知可能无跳转动作。此字段支持以下三种类型:
1. 跳转到目标页:
intent:#Intent;action=action 路径;component=包名/Activity 全名;end
(OPPO 和 FCM 通道必须传”action 路径”, 其他厂商必须传”Activity 全名”, 否则将出现对应厂商无法跳转问题)
2. 跳转到 deeplink 地址:
scheme://test?key1=val1&key2=val2
3. 应用首页: intent:#Intent;action=android.intent.action.MAIN;end (固定为此地址)
uri_activitystring可选指定跳转页面该字段用于指定开发者想要打开的 activity,值为 activity 节点的 “android:name”属性值。适配华为、小米、vivo 厂商通道跳转。Jpush SDK≥V4.2.2,可不再填写本字段,仅设置 intent 字段即可。
uri_actionstring可选指定跳转页面该字段用于指定开发者想要打开的 activity,值为 “activity”-“intent-filter”-“action” 节点的 “android:name” 属性值。适配 oppo、fcm跳转。Jpush SDK≥V4.2.2,可不再填写本字段,仅设置 intent 字段即可,但若需兼容旧版 SDK 必须填写该字段。

intent 方式(推荐)

格式说明

固定格式 :intent:#Intent;action=”action 路径”;component=”包名”/”Activity 组件路径”;end

  • intenturi 必须以 “intent:#Intent;” 开头,以 “;end” 结尾。
  • 不允许存在多个 “action=” 字符或 “component=” 字符。

示例:

          intent:#Intent;action=cn.jiguang.myaction;component=cn.jiguang.jumptest/cn.jiguang.jumptest.OpenClickActivity;end

        

携带参数格式:intent:#Intent;action=“action 路径”;component=”包名”/”Activity 组件路径”;S.key1=value1;i.key2=2;end

  • “S.”:代表参数值是 String 格式。
  • “i.”:代表参数值是 Int 格式。

示例:

          intent:#Intent;action=cn.jiguang.myaction;component=cn.jiguang.jumptest/cn.jiguang.jumptest.OpenClickActivity;S.key1=value;i.key2=2;end

        

客户端配置

在 AndroidManifest 中完成以下配置。

OPPO 通道和 FCM 通道必须配置 action 和 category 才可以跳转。

          <activity
    android:name="cn.jiguang.jumptest.OpenClickActivity"
    android:exported="true"
    android:launchMode="singleTask"
    android:screenOrientation="portrait">
    <intent-filter>
        <action android:name="cn.jiguang.myaction" ></action>
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

        

服务端使用

控制台使用

进入【消息推送】-【推送管理】-【创建推送】页面,选择 Android 平台, 并在 “Android 点击通知打开”中选择“intent(推荐)”,填写 intent 。

API 使用

  • SDK ≥ 4.2.2 的版本,只需要填写 intent 参数,参数详情参考 API 使用
  • SDK<4.2.2 的版本,且配置过 uri_activity 和 uri_action 跳转的,只需要填写 uri_activity 和 uri_action。
          {
    "notification" : {
        "android" : {
             "alert" : "hello, JPush!", 
             "title" : "JPush test", 
             "intent": {
                "url": "intent:#Intent;action=cn.jiguang.myaction;component=cn.jiguang.jumptest/cn.jiguang.jumptest.OpenClickActivity;S.key1=value;i.key2=3;end"
            },
            "uri_activity": "cn.jiguang.jumptest.OpenClickActivity",//兼容4.2.2以下版本
            "uri_action": "cn.jiguang.jumptest.OpenClickActivity"//兼容4.2.2以下版本
            
        }
    }
}

        

客户端获取参数

若需要跳转至页面指定位置,推送时可以下发自定义参数,获取参数后自行处理业务跳转逻辑。

获取 intent 携带参数

SDK 针对 intent 配置的参数均是透传的,所以在目标 Activity 直接获取 intent 跳转获取参数即可。

          package cn.jiguang.jumptest;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        handleIntent();
    }
 
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        handleIntent();
    }
    void handleIntent(){
        if(getIntent()!=null){
            String value1 =getIntent().getStringExtra("key1");
            int value2 =getIntent().getIntExtra("key2",0);
            Log.e("MainActivity",""+value1);
            Log.e("MainActivity",""+value2);
        }
    }
}

        

获取 Extras 附加参数

  • SDK < 4.6.0 版本时,极光通道有 onNotifyMessageOpened 点击回调,厂商通道没有 onNotifyMessageOpened 点击回调。
  • SDK ≥ 4.6.0 版本时,Android 极光通道和厂商通道统一处理:无通知跳转目标地址有 onNotifyMessageOpened 点击回调,有通知跳转目标地址时没有 onNotifyMessageOpened 点击回调。

1.有配置通知跳转目标地址时:

  • SDK<4.6.0 版本
    • 华为通道使用getIntent().getData().toString()方法获取参数。
    • 小米、vivo、OPPO、FCM、魅族通道使用 getIntent().getExtras().getString(“JMessageExtra”) 方法获取参数。
    • 极光通道在回调的函数 onNotifyMessageOpened(Context context, NotificationMessage message) 中的 message 中获取参数。
  • SDK ≥ 4.6.0 版本
    • 华为通道使用getIntent().getData().toString()方法获取参数。
    • 小米、vivo、OPPO、FCM、魅族、荣耀、极光通道使用 getIntent().getExtras().getString(“JMessageExtra”) 方法获取参数。

2.无配置通知跳转目标地址时:

  • SDK<4.6.0 版本时:
    • 厂商通道没有点击回调,点击无法跳转,无法获取参数。
    • 极光通道在回调的函数 onNotifyMessageOpened(Context context, NotificationMessage message) 中的 message 中获取参数。
  • SDK ≥ 4.6.0 版本时,所有通道在回调的函数 onNotifyMessageOpened(Context context, NotificationMessage message) 中的 message 中获取参数。

示例如下

          package com.HuananThirdPush.cn;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import cn.jpush.android.api.JPushInterface;

public class OpenClickActivity extends Activity {
    private static final String TAG = "OpenClickActivity";
    /**通知附加字段**/
    private static final String KEY_EXTRAS = "n_extras";
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mTextView = new TextView(this);
        setContentView(mTextView);
        handleOpenClick();
    }

    /**
     * 处理点击事件,当前启动配置的Activity都是使用
     * Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK
     * 方式启动,只需要在onCreat中调用此方法进行处理
     */
    private void handleOpenClick() {
        Log.d(TAG, "用户点击打开了通知");
        String data = null;
        
        //获取华为平台附带的jpush信息
        if (getIntent().getData() != null) {
            data = getIntent().getData().toString();
        }

        //获取fcm/oppo/小米/vivo/魅族/荣耀 平台附带的jpush信息
        if (TextUtils.isEmpty(data) && getIntent().getExtras() != null) {
            data = getIntent().getExtras().getString("JMessageExtra");
        }

        Log.w(TAG, "msg content is " + String.valueOf(data));
        if (TextUtils.isEmpty(data)) return;
        try {
            JSONObject jsonObject = new JSONObject(data);
            String extras = jsonObject.optString(KEY_EXTRAS);
            StringBuilder sb = new StringBuilder();
            sb.append("extras:");
            sb.append(String.valueOf(extras));
            sb.append("\n");
            mTextView.setText(sb.toString());

    }
}

        

格式说明

固定格式:

  • scheme://
  • scheme://host
  • scheme://host/path

携带参数格式:
scheme://host/path?key1=val1&key2=val2

客户端配置

在 AndroidManifest 中完成以下配置。

  • action、category 必须按照下列示例配置。
  • data 的 scheme 必须配置,其他参数可选。
          
<activity android:name=".DeeplinkTestActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:scheme="jiguang"
            android:host="deeptest"
            android:path="/index"/>
    </intent-filter>
</activity>

        

服务端使用

控制台使用

进入【消息推送】-【推送管理】-【创建推送】页面,选择 Android 平台, 并在 “Android 点击通知打开”中选择“DeepLink”,填写 DeepLink。 

API 使用

  • SDK ≥ 4.2.2 的版本,只需要填写 intent 参数,参数详情参考 API 使用
  • SDK<4.2.2 的版本,且配置过 uri_activity 和 uri_action 跳转的,只需要填写 uri_activity 和 uri_action。
          {
    "notification" : {
        "android" : {
             "alert" : "hello, JPush!", 
             "title" : "JPush test", 
             "intent": {
                "url": "jiguang://deeptest/index?key1=val1&key2=val2"
            },
            "uri_activity": "cn.jiguang.jumptest.DeeplinkTestActivity",//兼容4.2.2以下版本
            "uri_action": "cn.jiguang.jumptest.DeeplinkTestActivity"//兼容4.2.2以下版本
            
        }
    }
}

        

打开应用方式

API 使用

控制台使用

进入【消息推送】-【推送管理】-【创建推送】页面,选择 Android 平台, 并在 “Android 点击通知打开”中选择“打开应用”。 

API 使用

  • SDK ≥ 4.2.2 的版本,只需要填写 intent 参数,参数详情参考 API 使用
  • SDK<4.2.2 的版本,且配置过 uri_activity 和 uri_action 跳转的,只需要填写 uri_activity 和 uri_action。
          {
    "notification": {
        "android": {
            "alert": "hello, JPush!",
            "title": "JPush test",
            "intent": {
                "url": "intent:#Intent;action=android.intent.action.MAIN;end"
            },
            "uri_activity": "cn.jiguang.jumptest.MainActivity", //兼容4.2.2以下版本
            "uri_action": "cn.jiguang.jumptest.MainActivity" //兼容4.2.2以下版本
        }
    }
}

        

极光消息推送回执设置集成教程

极光消息推送回执设置集成教程

开启回执功能,可以将送达、点击、抵达成功、地理围栏等数据信息返回至填写的回执地址,方便用户自行处理数据。回执详情参考 回执功能说明文档

回执地址说明

回执地址必须以 http 或者 https 开头,不支持自定义端口,不支持 IP 为 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 私有网段。

送达回执

进入【消息推送】-【推送设置】-【回执设置】-【送达回执】页面,点击“启用”,并新增回执地址。

点击回执

进入【消息推送】-【推送设置】-【回执设置】-【点击回执】页面,点击“启用”,并新增回执地址。 

推送成功回执

进入【消息推送】-【推送设置】-【回执设置】-【推送成功回执】页面,点击“启用”,并新增回执地址。

地理围栏回执

进入【消息推送】-【推送设置】-【回执设置】-【地理围栏回执】页面,点击“启用”,并新增回执地址。 

极光消息推送安全管理操作教程

极光消息推送安全管理操作教程

为了防止推送事故,极光控制台提供安全管理设置。本文旨在指导用户如何在极光控制台设置安全管理。

IP 白名单

说明

不填该项表示 API 调用无 IP 限制;一旦填写,则表示该 AppKey 仅接受指定 IP 的推送请求。

设置

进入【消息推送】-【推送设置】-【安全管理】-【IP 白名单】页面,填写可以调用的 IP 地址并点击保存。

推送审核

说明

创建推送后,需要审核人员审核通过后才能下发消息。

即使您拥有此应用的审核权限,您也无法审核自身账号发出的推送请求。

审核人员

  • 您可以选择任意有审核权限的账号进行审核操作。
  • 默认管理员拥有审核权限,您也可以选择管理员下面的子账号对此应用的推送进行审核操作。
  • 如果没有其它子账号,可联系管理员添加子账号并且给子账号分配此应用的推送审核权限。

审核目标

  • 目前仅支持针对在极光官网页面发出的推送请求进行审核。

设置

1.点击开启“启用推送审核”。
2.选择审核人员,点击保存。

黑词管理

说明

启用后,发送消息时将对消息内容进行黑词检测,最多可添加 100 个黑词。

设置

1.点击开启“进行推送内容黑词检测”。
2.添加黑词,选择开启/关闭。

避免重复发送

说明

开启后从技术层面绝对避免同样的消息在同一天内重复发送给单个用户。

设置

点击开启“避免重复发送”。

极光消息推送集成设置,设置APP接口设置包名签名操作教程

极光消息推送集成设置,设置APP接口设置包名签名操作教程

本文旨在引导客户如何查看应用的集成设置。

前提条件

已经 创建应用 并完成了推送设置。

Android

进入【极光控制台】-【消息推送】-【推送设置】-【集成设置】-【Android】页面,可以查看应用包名、SDK 集成度和厂商通道配置信息。

  • 应用包名:Android 应用程序的包名(Package Name),在 AndroidManifest.xml 里配置使用。该包名推送、认证、分享、IM等业务共同使用,一旦指定,不可更改。
  • 集成度:SDK 集成度可以帮助用户了解整体集成情况。
  • 厂商通道配置:使用厂商通道需要在控制台配置厂商参数,详情参考 厂商通道参数申请指南

iOS

进入【极光控制台】-【消息推送】-【推送设置】-【集成设置】-【iOS】页面,可以查看鉴权详情,鉴权方式配置参考 证书设置指南

  • Bundle ID:用来唯一标识一个 APP ID 的字符串。
  • 是否将生产证书用于开发环境:Apple 的生产推送证书允许用于开发环境的推送,勾选将生产证书用于开发环境,开发者可以仅上传生产证书,即可在官网推送平台处选择开发环境做推送,不用再生成和上传开发证书。
  • 若 APNS 证书文件显示“已过期”、“已注销”,请及时更新证书。
  • 需要配置送达展示回调才可以统计展示数据,详情参考 通知展示统计

Quick App

进入【极光控制台】-【消息推送】-【推送设置】-【集成设置】-【Quick App】页面,可以查看应用包名和启用状态。

  • 此处设置的是快应用的包名,请区别于 Android 应用的包名;包名设置后不可更改;如果要适用厂商快应用推送,请保持和在厂商设置的快应用包名一致。
  • 需要先集成快应用推送 SDK,才能启用快应用推送功能;快应用厂商为可选配置,配置后快应用推送走厂商系统通道下发;如果不配置,默认通过极光通道下发,不影响功能使用。

Winphone

进入【极光控制台】-【消息推送】-【推送设置】-【集成设置】-【Winphone】页面,可以查看启用状态。

极光消息推送查看用户属性操作教程

极光消息推送查看用户属性操作教程

本文旨在引导用户如何使用控制台得用户属性功能。

  • 用户属性:某一类用户信息的统一标识。如:用户昵称、喜好、所在省市等。
  • 使用场景:通知栏推送时,推送文案中可加入用户属性字段,系统自动补齐属性值后下发,增强推送个性化,提升运营效率的同时提升点击率 。

属性管理

进入【配置管理】-【用户属性】页面,可以查看所有已经创建的用户属性,支持通过日期、用户属性名称、属性描述进行筛选。

新增用户属性

在属性管理页面,点击“新增用户属性”。

填写字段属性名称和属性描述,选择字段类型后点击“确定”即可完成用户属性创建。

  • 属性名称支持小写字母、数字、下划线,必须字母开头。
  • 属性类型支持 STRING、NUMBER、BOOL、DATETIME。

编辑用户属性

如果需要更改用户属性描述,点击“编辑”进行修改。

修改完成后,点击“确定”即可完成变更。

删除用户属性

如果需要删除某个用户属性,点击“删除”,经过二次确认后即可删除该属性。

属性一旦删除,不可恢复,填写个性化文案时也无法正常展示,请谨慎使用!

极光消息推送排查工具操作教程

极光消息推送排查工具操作教程

排查工具包括消息查询和配额查询功能,通过查看消息的生命周期和厂商额度来判断消息是否正常下发,旨在帮助客户快速排查问题。

消息查询

推送收不到时,可以进入【极光控制台】-【消息推送】-【配置管理】-【排查工具】-【消息查询】页面进行生命周期排查,输入 Message ID 和 Registration ID,点击查询即可查看消息的生命周期,查询结果如下图:

消息生命周期:如果发送失败,会在相应的失败环节展示错误码+错误提示信息。
特殊消息生命周期:如果消息类型为通知消息+自定义消息,则消息生命周期会产生两条分叉路径。
消息基本信息:展示消息类型、发送策略和消息体,点击消息体可以查看消息体 json。
设备基本信息:展示通知权限开关状态、厂商注册情况、最近在线时间等设备基本信息。

Message ID 获取方法

控制台获取

进入【极光控制台】-【消息推送】-【推送管理】-【推送记录】页面,即可获取 Message ID。

API 获取

API 调用后在应答参数中获取:

          {
    "sendno": "0",
    "msg_id": "54043471036732219"
}

        

Registration ID 获取方法

客户端初始化 JPush 成功后,JPush 服务端会分配一个 Registration ID,作为此设备的标识(同一个手机不同 App 的 Registration ID 是不同的),因此排查时需要获取 Registration ID 定位问题,获取方法:AndroidiOS

配额查询

如果已经成功集成了厂商通道但推送没有走厂商通道时(VIP 默认推送策略为厂商通道优先),可以进入【极光控制台】-【消息推送】-【配置管理】-【排查工具】-【配额查询】页面,查看当前的厂商通道配额是否有剩余,若配额已全部消耗,当天的通知都将通过极光通道进行下发。

查询频率说明

厂商品牌当日配额查询最新余量(厂商)查询实时余量(极光)计算逻辑
小米支持,间隔 10min 查询并记录支持,间隔 300s 查询并记录最新余量-提交成功数量,30s 计算 1 次
OPPO支持,间隔 10min 查询并记录支持,间隔 300s 查询并记录最新余量-提交成功数量,30s 计算 1 次
vivo支持,间隔 10min 查询并记录支持,间隔 300s 查询并记录最新余量-提交成功数量,30s 计算 1 次
华为不支持,当前未查询不支持,当前未查询不计算配额直接下发
魅族不支持,当前未查询不支持,当前未查询不计算配额直接下发
华硕不支持,当前未查询不支持,当前未查询不计算配额直接下发
FCM不支持,当前未查询不支持,当前未查询不计算配额直接下发

极光消息推送标签管理查看教程

极光消息推送标签管理查看教程

标签查询

进入【极光控制台】-【消息推送】-【配置管理】-【标签管理】页面,输入标签/Registration ID,可以查询该标签/Registration ID 是否存在。

点击详情可以查看该标签下的所有 Registration ID。

Registration ID 获取方法

客户端初始化 JPush 成功后,JPush 服务端会分配一个 Registration ID,作为此设备的标识(同一个手机不同 App 的 Registration ID 是不同的),因此排查时需要获取 Registration ID 定位问题,获取方法:AndroidiOS

标签绑定

若查询当前 Registration ID 没有绑定该标签,需要你重新绑定标签后再推送。

添加标签

若需要新增标签,点击“添加标签”,填写标签和 Registration ID/Alias(别名) 即可添加绑定关系。

添加 Registration ID

若该标签需要绑定新的设备,点击 “RID 绑定”,填写需要绑定设备的 Registration ID 即可添加绑定关系。

标签删除

若需要删除标签,点击“删除”操作,该标签以及标签和应用所有设备的绑定关系均被删除。

标签解绑

若需要删除标签下的部分设备,可以进入标签详情页面,点击“解绑”即可删除标签与该设备的的绑定关系。

极光消息推送地理围栏操作教程

极光消息推送地理围栏操作教程

本文旨在指导用户如何在极光控制台上使用地理围栏功能。

地理围栏说明

地理围栏就是用一个虚拟的栅栏围出一个虚拟地理边界,当用户进入、离开或者在圈内这个区域时,手机可以接收自动通知;实现准确的消息推送,把有用的信息,在合适的地方,推送给合适的人。目前地理围栏只支持通过极光控制台进行推送。

创建地理围栏

1.进入【消息推送】-【配置管理】-【地理围栏】页面,点击“创建地理围栏”。

2.在搜索框输入需要定位的地址,在地图上点击地址即可创建地理围栏。

3.填写围栏名称和围栏半径。

围栏设置

  • 重复提醒:可以设置每周、每日、每条推送的频率,如果创建时未设置频率,则默认触发频率为:60 分钟,每条展示频率最小为 3 分钟,每 3 分钟进行递增。如:设置每条频率为 100 秒,则触发频率为 3 分钟;设置每条频率为 300 秒,则触发频率为 6 分钟。
  • 状态设置:代表触发条件为进入、离开、圈内。
  • 结束时间:地理围栏失效的时间。
  • 围栏类型:
    • 触发展示:SDK 客户端触发地理围栏条件后,推送消息直接展示。
    • 触发回调(仅对 VIP 应用提供):SDK 客户端触发地理围栏条件后,会将满足条件的客户端 registration_id 等信息和地理围栏 ID 值回调给用户,用以满足个性化推送场景。

编辑地理围栏

在【地理围栏】页面,点击“编辑”即可对已经创建的“地理围栏”进行修改。

删除地理围栏

在【地理围栏】页面,点击“删除”,经过二次确认后即可删除该地理围栏。

使用地理围栏

在【创建推送】页面,在【高级设置】模块选择需要推送的地理围栏,即可对触发条件的用户进行消息下发。

iOS 注意事项

iOS 创建通知消息进行地理围栏下发时,实际是通过静默通知下发地理围栏信息。由于 iOS 14 及之后版本,静默通知有推送次数限制,直接下发通知消息会出现经常收不到推送的情况。因此建议创建自定义消息进行地理围栏推送:
1.创建自定义消息,客户端触发地理围栏回调后, APP 处理并展示自定义消息。
2.付费用户可以使用触发回调服务完成个性化推送。

  • 创建地理围栏时,选择“触发回调”。
  • 创建自定义消息,当触发地理围栏回调后,SDK 将满足条件的 registration_id 等信息和地理围栏 ID 值回调给用服务器,用户可以根据回执信息完成个性化推送。详情参考 回执功能说明文档