.NET快速对接极光消息推送

什么是消息推送?

很多手机APP会不定时的给用户推送消息,例如一些新闻APP会给用户推送用户可能感兴趣的新闻,或者APP有更新了,会给用户推送是否选择更新的消息等等,这就是所谓的“消息推送”。

常见的一些APP消息推送示例

强营销类:

直接把营销力度,营销模式以一种叫卖式方式展现出来,目的通过优惠,时效性勾起用户贪小便宜的心理,好奇心理,如下所示:

图片

强关联性:

在信息爆炸的时代,大脑会自动筛选对自己有价值的信息和没价值的信息,如果在一条信息中有@你,您之类的言语,大脑会自动识别,使用直接关联的技巧在于巧用“你”相关的字眼。

图片

强话题性:

营销界有这么一句话,没有违和感就创造不了传播,不出位就制造不了话题,那么强话题性的文案自带传播属性,一般都会击中用户内心的某个感触,比如对社会的愤世嫉俗,对高房价的逆反心理,对旅游的文艺心等等。

图片

极光推送介绍

极光推送(JPush)是日均消息量超百亿级规模的 App 消息推送专业服务平台,极光推送支持 Android、iOS、QuickApp、Web 等平台,SDK 接入方便快捷,推送通道高速稳定且支持海外专线,API 开放接口强大、灵活和易用、WEB 端支持创建通知、后效分析、标签别名管理和故障排查等运营功能。 极光推送(JPush)在为开发者提供基础推送服务的同时,还提供了用户精准标签、用户分群、地理围栏、应用内消息、智能发送策略、智能促活等服务能力,可有效提升消息的送达率、展示率和点击率,通过精细化运营触达助力 APP 提升日活和留存。

平台类型支持

图片

消息类型支持

图片

通知样式支持

图片

为什么选择极光作为APP的消息推送平台?

  • 首先极光推送支持多平台推送。

  • 支持大规模的消息推送。

  • 极光推送对接方便,不同后端语言都提供了对应的SDK。

  • 对于免费账号支持也非常的友好(不过免费账号高峰期有资源瓶颈,假如需要及时性很强的话可以购买高级版收费服务)。

图片

快速对接Jpush极光推送

  • 到极光推送官方网站注册开发者帐号;

  • 登录进入管理控制台,创建应用程序,得到 Appkey(SDK 与服务器端通过 Appkey 互相识别);

  • 在推送设置中给 Android 设置包名、给 iOS 上传证书、启用 WinPhone,根据你的需求进行选择;

.NET FX 4.5项目快速接入

该项目是基于C#/.NET(.NET Framework4.5.1的示例)极光推送对接实例,主要是对接极光集成为我们.Neter提供的SKD。在这里我主要封装了单个设备注册ID推送,设备注册ID批量推送和广播推送三种推送三种方式,其他的推送方式大家可以参考文档去进行封装。

  • JPuhs-Sample👉(封装示例源码):https://github.com/YSGStudyHards/JPuhs-Sample

1、在项目中引入Jiguang.JPush nuget包

图片

2、极光推送调用

namespace Jpush.Controllers
{/// <summary>/// 极光推送管理/// </summary>public class JPushManageController : Controller{private readonly JPushClientUtil _jPushClientUtil;public JPushManageController(JPushClientUtil jPushClientUtil){ this._jPushClientUtil=jPushClientUtil;}/// <summary>/// 单个设备注册ID推送/// </summary>/// <returns></returns>public ActionResult SendPushByRegistrationId(){var isOk = _jPushClientUtil.SendPushByRegistrationId("追逐时光者欢迎你!", "2022新年快乐", "1507bfd3f715abecfa4", new Dictionary<string, object>(), true);return Json(new { result = isOk });}/// <summary>/// 设备注册ID批量推送(一次推送最多1000个)/// </summary>/// <returns></returns>public ActionResult SendPushByRegistrationIdList(){var registrationIds = new List<string>() { "1507bfd3f715abecfa455", "1507bfd3f715abecfa433", "1507bfd3f715abecfa422" };var isOk = _jPushClientUtil.SendPushByRegistrationIdList("追逐时光者欢迎你!", "2022新年快乐", registrationIds, new Dictionary<string, object>(), true);return Json(new { result = isOk });}/// <summary>/// 广播推送/// </summary>/// <returns></returns>public ActionResult BroadcastPush(){var isOk = _jPushClientUtil.BroadcastPush("追逐时光者欢迎你!", "2022新年快乐", new Dictionary<string, object>(), true);return Json(new { result = isOk });}}
}

3、极光推送工具类(JPushClientUtil)

namespace Jpush.Common
{/// <summary>/// 极光推送工具类/// </summary>public class JPushClientUtil{private const string appKey = "youAppKey";private const string masterSecret = "youMasterSecret";private static JPushClient client = new JPushClient(appKey, masterSecret);/// <summary>/// 单个设备注册ID推送/// </summary>/// <param name="title">推送标题(Android才会存在)</param>/// <param name="noticeContent">通知内容</param>/// <param name="registrationid">设备注册ID(registration_id)</param>/// <param name="extrasParam">拓展参数(传入App接收的一些参数标识)</param>/// <param name="isApnsProduction">注意:iOS是否推送生产环境(true是,false否推开发环境)</param>/// <returns></returns>public bool SendPushByRegistrationId(string title, string noticeContent, string registrationid, Dictionary<string, object> extrasParam = null, bool isApnsProduction = true){//设备标识参数拼接var pushRegistrationId = new RegistrationIdList();pushRegistrationId.registration_id.Add(registrationid);return JPushBaseSendMessage(title, noticeContent, isApnsProduction, pushRegistrationId, extrasParam);}/// <summary>/// 设备注册ID批量推送(一次推送最多1000个)/// </summary>/// <param name="title">推送标题(Android才会存在)</param>/// <param name="noticeContent">通知内容</param>/// <param name="registrationIds">注册ID(registration_id)列表,一次推送最多1000个</param>/// <param name="extrasParam">拓展参数(传入App接收的一些参数标识)</param>/// <param name="isApnsProduction">注意:iOS是否推送生产环境(true是,false否推开发环境)</param>/// <returns></returns>public bool SendPushByRegistrationIdList(string title, string noticeContent, List<string> registrationIds, Dictionary<string, object> extrasParam = null, bool isApnsProduction = true){//设备标识参数拼接var pushRegistrationId = new RegistrationIdList();pushRegistrationId.registration_id.AddRange(registrationIds);return JPushBaseSendMessage(title, noticeContent, isApnsProduction, pushRegistrationId, extrasParam);}/// <summary>/// 广播推送/// </summary>/// <param name="title">推送标题(Android才会存在)</param>/// <param name="noticeContent">通知内容</param>/// <param name="extrasParam">拓展参数(传入App接收的一些参数标识)</param>/// <param name="isApnsProduction">注意:iOS是否推送生产环境(true是,false否推开发环境)</param>/// <returns></returns>public bool BroadcastPush(string title, string noticeContent, Dictionary<string, object> extrasParam = null, bool isApnsProduction = true){return JPushBaseSendMessage(title, noticeContent, isApnsProduction, null, extrasParam, true);}/// <summary>/// 极光消息推送公共方法/// </summary>/// <param name="title">推送标题(Android才会存在)</param>/// <param name="noticeContent">通知内容</param>/// <param name="pushRegistrationId">设备注册ID(registration_id)</param>/// <param name="isApnsProduction">iOS是否推送生产环境(true是,false否推开发环境)</param>/// <param name="extrasParam">拓展参数</param>/// <param name="isRadioBroadcast">是否广播</param>/// <returns></returns>private bool JPushBaseSendMessage(string title, string noticeContent, bool isApnsProduction, RegistrationIdList pushRegistrationId, Dictionary<string, object> extrasParam, bool isRadioBroadcast = false){try{object audience = pushRegistrationId;if (isRadioBroadcast){audience = "all";}var pushPayload = new PushPayload(){Platform = new List<string> { "android", "ios" },//推送平台设置Audience = audience,//推送目标//notifacation:通知内容体。是被推送到客户端的内容。与 message 一起二者必须有其一,可以二者并存。Notification = new Notification{Alert = noticeContent,//通知内容Android = new Android{Alert = noticeContent,//通知内容Title = title,//通知标题URIActivity = "com.king.sysclearning.platform.app.JPushOpenClickActivity",//该字段用于指定开发者想要打开的 activity,值为 activity 节点的 “android:name”属性值;适配华为、小米、vivo厂商通道跳转URIAction = "com.king.sysclearning.platform.app.JPushOpenClickActivity",//该字段用于指定开发者想要打开的 activity,值为 "activity"-"intent-filter"-"action" 节点的 "android:name" 属性值;适配 oppo、fcm跳转Extras = extrasParam //这里自定义JSON格式的Key/Value信息,以供业务使用。},IOS = new IOS{Alert = noticeContent,Badge = "+1",//此项是指定此推送的badge自动加1Extras = extrasParam //这里自定义JSON格式的Key/Value信息,以供业务使用。}},Options = new Options//可选参数{//iOS 环境不一致问题:API 推送消息给 iOS,需要设置 apns_production 指定推送的环境,false 为开发,true 为生产。IsApnsProduction = isApnsProduction// 设置 iOS 推送生产环境。不设置默认为开发环境。}};var response = client.SendPush(pushPayload);//200一定是正确。所有异常都不使用 200 返回码if (response.StatusCode == HttpStatusCode.OK){return true;}else{return false;}}catch (Exception ex){return false;}}}public class RegistrationIdList{/// <summary>/// 设备注册ID/// </summary>public List<string> registration_id { get; set; } = new List<string>();}
}

参考文章

  • 十分钟带你了解APP消息推送(Push):https://www.woshipm.com/operate/526224.html

  • 极光详细对接文档:https://docs.jiguang.cn/jpush/quickstart/3m_dem

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/192698.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】【uni-app】工单管理页面实现

用的是uni-app的uni-ui拓展组件实现的 功能是对工单进行一个展示&#xff0c;并对工单根据一些筛选条件进行搜索 目前是实现了除了日期之外的搜索功能&#xff0c;测试数据是下面这个tableData.js&#xff0c;都是我自己手写的&#xff0c;后端请求也稍微写了一些&#xff0c;…

vue3 el-menu初始化时选中没有高亮的问题(default-active和index的问题)

首先看官方文档的示例&#xff1a; 需要注意的是&#xff1a; 1、default-active的值是字符串&#xff0c;那么index绑定的值也要是字符串&#xff0c;且数字对应。不能default-avtive绑定的是1&#xff0c;而menu-item的index绑定的是45 2、default-active的值是当前选中me…

C++面向对象编程(4)——浅谈C++内存模型

目录 一. 说明 二. GDB实验 2.1 实验1&#xff1a;栈 2.2 实验2&#xff1a;堆 一. 说明 不同的操作系统对程序内存的管理和划分会有所不同。如上图所示的C内存区域划分主要是针对一般的情况&#xff0c;说明如下&#xff1a; 1. Stack&#xff1a;栈。由编译器管理分配和回…

远程登录Linux方法(Linux平台相互远程;Windows远程登录Linux、远程编码、文件传输;无法远程登录的问题解决;c程序的编译)

在实际使用Linux系统过程中我们不可避免的需要远程登录Linux&#xff0c;这是因为未来大家使用Linux服务器的时候你所对应的那台Linux服务器不一定提供界面(服务器可能在外地)。本篇将会介绍远程登录Linux的方法。 文章目录 1. SSH介绍2. Linux平台相互远程及文件传输2.1 Linux…

MySQL MHA高可用切换

MySQL MHA 1&#xff0e;什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在…

【PG】PostgreSQL高可用方案repmgr部署(非常详细)

目录 简介 1 概述 1.1 术语 1.2 组件 1.2.1 repmgr 1.2.2 repmgrd 1.3 Repmgr用户与元数据 2 安装部署 2.0 部署环境 2.1 安装要求 2.1.1 操作系统 2.1.2 PostgreSQL 版本 2.1.3 操作系统用户 2.1.4 安装位置 2.1.5 版本要求 2.2 安装 2.2.1 软件包安装 2.2…

【C++】日期类实现,与日期计算相关OJ题

文章目录 日期类的设计日期计算相关OJ题HJ73 计算日期到天数转换KY111 日期差值KY222 打印日期KY258 日期累加 在软件开发中&#xff0c;处理日期是一项常见的任务。为了方便地操作日期&#xff0c;我们可以使用C编程语言来创建一个简单的日期类。在本文中&#xff0c;我们将介…

从0到0.01入门 Webpack| 001.精选 Webpack面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

四川竹哲电子商务有限公司怎么样?是真的吗

在当今数字化时代&#xff0c;抖音电商服务逐渐成为了企业营销的重要手段。在这个充满机遇与挑战的领域&#xff0c;四川竹哲电子商务有限公司以其卓越的服务质量&#xff0c;成为了行业内的佼佼者。本文将详细介绍四川竹哲电子商务有限公司的抖音电商服务&#xff0c;帮助您了…

vue离线地图(瓦片)

最近公司要弄一个这样的离线地图&#xff0c;要求在图上打点画线之类的。折腾了几天&#xff0c;学习了三种方式&#xff1a; 1.拿到各省市区的经纬度json&#xff0c;通过echarts来制作&#xff0c;再套一个卫星图的地图背景 2.下载地图瓦片&#xff0c;再通过百度/高德的离线…

Java学习之路 —— 异常、集合、Stream

文章目录 1. 异常2. 集合2.1 遍历2.1.1 迭代器2.1.2 增强for循环2.1.3 Lambda 2.2 List2.3 Set2.3.1 HashSet2.3.2 LinkedHashSet2.3.3 TreeSet 2.4 Map 3. Stream 1. 异常 Exception&#xff1a;叫异常&#xff0c;是程序员可以捕捉的。异常又分为了2类&#xff1a; 运行时异…

数据结构:红黑树的原理和实现

文章目录 红黑树的概念红黑树的性质红黑树的模拟实现红黑树的平衡问题 整体实现和测试 本篇用于进行红黑树的拆解和模拟实现&#xff0c;为之后的map和set的封装奠定基础 红黑树的概念 红黑树也是一种二叉搜索树&#xff0c;但是在每一个节点的内部新增了一个用以表示该节点颜…

pytorch框架学习(tensorboard的使用)

什么是tensorboard&#xff1f; tensorboard是一个可视化工具&#xff0c;它可以把训练过程中的数据变化以图像的形式绘制出来&#xff0c;或者记录训练过程中使用的图片 tensorboard的安装&#xff1a; 在pycharm的终端中输出安装命令后自动安装—— pip install tensorbo…

IP地址查询在社交行业中的崭新应用

在社交媒体蓬勃发展的今天&#xff0c;IP地址查询技术IP66_ip归属地在线查询_免费ip查询_ip精准定位平台正在成为社交行业中的一项强大工具。这项技术不仅为社交平台提供了更多个性化服务的可能&#xff0c;还在用户安全和内容管理等方面发挥了关键作用。本文将深入探讨IP地址查…

什么是集成测试?集成的方法有哪些?

前言 综合测试整合测试非常复杂&#xff0c;需要一些开发和逻辑技能。的确如此&#xff01;那么把这个测试整合到我们的测试策略中的目的是什么呢&#xff1f;这个问题我们先不着急回答&#xff0c;让我们一步步往下看你就知道了。 为什么要进行集成测试&#xff1f; 以下是一…

UE4动作游戏实例RPG Action解析四:装备系统

导语: 以加血道具为例,详细分析拆解ActionRPG的装备系统,包含装备系统需求和数据结构设计,以及实现 一、装备系统需求: 装备槽: 已获取装备和未获取装备: 当已经装备一个道具时,再次捡到道具,会把道具放在装备库,不会放在装备槽中, 当没有装备道具时,会拾取道具…

算法通关村第十六关青铜挑战——原来滑动窗口如此简单!

大家好&#xff0c;我是怒码少年小码。 从本篇开始&#xff0c;我们就要开始算法的新篇章了——四大思想&#xff1a;滑动窗口、贪心、回溯、动态规划。现在&#xff0c;向我们迎面走来的是——滑动窗口思想&#xff01;&#x1f61d; 滑动窗口思想 概念 在数组双指针里&am…

别试错了,是该关注一下软件内在质量了

太多这种例子了&#xff0c;老板们早上出的新想法&#xff0c;恨不得第二天就能上线。。每个互联网公司都试图突破固定领地&#xff0c;不断地尝试新的业务&#xff0c;一旦发现不行&#xff0c;就立刻砍掉&#xff0c;名曰“试错”。 研发部门&#xff0c;为了应对压力&#…

vue中通过.style.animationDuration属性,根据数据长度动态设定元素的纵向滚动时长的demo

根据数据长度动态设定元素的animation 先看看效果&#xff0c;是一个纯原生div标签加上css实现的表格纵向滚动动画&#xff1a; 目录 根据数据长度动态设定元素的animationHTMLjs逻辑1、判断是数据长度是否达到滚动要求2、根据数据长度设置滚动速度 Demo完整代码 HTML 1、确…

【机试题】LazyIterator迭代器懒加载问题

将下面这个未完成的Java工具类补充完成&#xff0c;实现懒加载的功能&#xff0c;该类需要实现Iterable接口&#xff0c;能够遍历所有数据。具体要求如下&#xff1a; 工具类提供了一个ValueLoader接口&#xff0c;用于获取数据&#xff0c;其中ValueLoader的接口定义为&#x…