- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
我是3y,一年 CRUD 经验用十年的 markdown 程序员👨🏻💻常年被誉为职业八股文选手 。
今天继续更新Austin,给Austin新增一个发送渠道(PUSH通知栏推送) 。
Push通知栏消息是非常常见的,几乎每个APP都会做这个功能(没有消息推送的APP不是一个好的APP) 。
一般我们认为Push消息能做以下的事情:
1、 唤醒用户,提高用户的留存率,提高产品活跃度 。我手机下载了APP,但我似乎把它已经忘记了(好久没用了),如果此时这个APP给我推送一条我 有兴趣 的内容。我可能会继续用这个APP,甚至从此活跃起来(购买消费) 。
2、告诉用户我有 新的产品上线 了(带动功能模块使用率)。本来APP是做商城的,现在做起直播来了。但好多用户好像都不咋留意到,此时我推送一条直播的消息给用户,可能用户就爱起直播了.
Push消息能够在你手机闭屏时(即便你没有打开APP),通过 通知 来给你推送信息,是一种能够 直接触达用户 的消息推送。相对 短信 而言:成本低、样式多样(支持标题/简介/图片)、链接跳转直接到APP.
不过如果用户收到不感兴趣的推送可能会导致:用户把通知消息给关闭了甚至把APP给卸载了 。
要给用户下发消息,我们得维护APP 客户端和服务端的「 长连接心跳 」。这个长连接心跳如果由我们自行来维护,难度会很大, 绝大部分的公司不会自建推送服务 。目前我们流行手机的操作系统类型分为两种: 安卓和iOS .
1、iOS我们默认走的是官方推送的渠道 APNS 。iOS 在系统层面与苹果 APNs(Apple Push Notification service)服务器建立连接,系统收到 APNs 服务器消息后会帮我们转发到相应的APP上。iOS端我们可以直接接入APNs服务器下发推送消息 。
2、安卓由于Google在国内访问不稳定,在国内 暂未 统一掉推送服务(工信部牵头成立的“安卓统一推送联盟”还在期待中)。目前更多的是众多的手机厂商在其 定制 的系统中也内置了推送功能,如小米、华为等。由于接入成本的问题,也出现了大量的第三方推送服务提供商,比如个推、极光、友盟、信鸽等等。第三方推送服务提供商也会接入对应的手机厂商来实现对消息的下发 。
接入第三方服务商推送的流程大致下:
正常发送PUSH是需要客户端开发的,Austin更多关注的是服务端推送,而非客户端的内容,所以我直接用个推提供的SDK Demo做调试.
文档如下: https://docs.getui.com/getui/start/product/ 。
从文档里以及我的实践后发现要使用该SDK,可以分为以下步骤:
1 、登录注册个推账号,得到appid、appkey、appsecret 。
2 、下载Android版本的消息推送Demo: https://docs.getui.com/download.html 。
3 、下载Android Studio来打开刚才下载的SDK: https://developer.android.com/studio 。
4 、修改 config.gradle 文件的账号相关参数值:
5 、编译成功后,直接build出对应的apk 。
6 、将apk文件给安卓的手机下载,就完事了 。
服务端文档: https://docs.getui.com/getui/server/rest_v2/introduction/ 。
从文档可得知接入无非就是调用HTTP时带有需要token(鉴权)参数。这个好办,我们在接入钉钉工作消息的时候有过类似的操作了,写个定时任务刷新下就完事了:
为了照顾部分还没把xxl-job这个定时任务框架的部署起来的同学,我专门写了个手动刷新Token的接口.
至于服务端其他的貌似没什么好说,无非就增加了一点细节,直接看代码吧: com.java3y.austin.handler.handler.impl.PushHandler 。
推送的内容又可以简单分为以下的几类:
针对上面所说的Push推送好处以及坏处,这就非常考验我们到底推送些什么内容给用户了 。
1、推的内容好:提高用户留存率、提高产品活跃度、提高用户对APP的粘度 。
2、推的内容差:用户对你的内容变得麻木、直接关闭通知消息、甚至卸载APP 。
那么一般我们会考虑些什么因素呢?有以下几个: 文案 、 推送频率 、 推送时机 、、 推送的人群 。
关于 文案 ,有一个叫做爱达法则(AUDA)公式:
爱达法则 。
相信大家都听过UC标题,如果有一个好的文案内容那吸引用户点击的概率就更高一些。目前一般的推送会用一些小技巧去提高用户的 。
“点我揭晓”、“→”、“>>”
数字
:众多品牌3折起,更有10元的裤子,你还等什么? 关于 推送频率 ,推送的频率要 控制 得当,假设我在一天里:
那显然,你肯定会取关我,是不是。一般来说一天用户不能收到3天以上的推送,消息多了,算是骚扰了,甚至不能每天都给用户推送(可能隔天推一次会好一些).
关于 推送时机 ,如果是资讯类的,推送的时机显然是越早越好了,不然别人家的都推送完了,用户都知道了。你才推送,那谁还点进去啊.
(同时作为是 官方推送的,还应保持准确性 ) 。
一般推送内容,我们都是希望在大家相对空闲的时间去推送,比如:
上班路上及早餐时间(9-10点)、午休(12-14点)、下班路上(6-7点)、睡前(21-22点) 。
不同的用户群体,时间可会有一定的调整。所以这就得寻找 相对适宜的时间 了.
我正写着代码,正在烦躁着这个Bug怎么这么的无厘头时,此时一个Push推送过来:“你有一张代金券即将到期!”,那此时我真的是XXX了.
关于 推送人群 ,现在互联网公司都有自己的 用户画像 系统,给同一类人推送合适的消息是较合适的。比如说:
我是一个学Java的,收到的通知消息却是:“Excel从入门到精通,只要30天!”(关键是我也没关注过Excel的内容),那此类的推送如果多了,我很可能就把这个APP删了.
为什么会经常出现类似的事故呢?我认为最主要的原因是: 预发和线上的环境是同一套 .
众所周知,我们的系统都有几套的环境(比如说本地/线下/预发/线上 环境),其中大多数公司的预发和线上环境数据库是同一套的,只是预发环境调用的是预发环境的接口,线上环境调用的是线上环境的接口而已.
推送这种系统的线上和预发环境其实没多大的区别,因为在底层是调用 外部的接口 来实现发送的,所以预发和线上环境其实调的都是 同一个接口 .
于是我们会在预发环境下配置了「 白名单 」,在白名单内的用户才能收到消息来尽可能避免环境的问题 。
其次 ,在大多数情况下,推送事故往往是「运营」的推送导致的。运营要推送消息给用户,首先需要 圈选一个人群 去推送.
人群量需要管控 :我们在圈选的时候,如果运营圈定的人数大于一个阈值,我们会走邮箱让主管确认是否需要圈选这么一个大的人群去推送。这块有两个目的:
1、首先我们是认为推送的人群应该是精细化的,什么标签的人群应该收到什么的推送。不应该圈定一个庞大的人群去推送同一条文案的消息(新闻APP除外).
2、即便出了事故,也只是一部分用户能收到,而不是全体用户.
对于很多系统其实都不需要 全体用户 推送这个功能 。
在运营圈定人群后,我们会有单独的测试功能去「测试 单个 用户」是否能正常下发消息,文案链接是否存在问题。这一个步骤是必须要做的,给用户发出的消息,首先要经过自己的校验.
当确认链接和文案都无问题后,则提交任务, 走工单审批 后才能发送.
如果在启动之后发现文案/链接存在问题,还可以 拦截剩余未发 甚至撤回部分的消息.
在线上环境消息应该有「 平台性去重 」的逻辑:
1、在某段时间内,过滤掉重复消息 。
2、运营类消息推送(圈定人群的方式去下发消息)同一个用户需要相隔一段时间才能下发一次.
虽然说,我们制定了很多的规则去尽量避免事故的发生,但不得不说推送平台还是一个 容易出现事故 的系统.
如果想学Java项目的,我还是强烈推荐我的开源项目消息推送平台Austin,可以用作 毕业设计 ,可以用作 校招 ,又可以看看 生产环境是怎么推送消息 的。 仓库地址(求各位兄弟们三连哟!) 。
最后此篇关于什么是push通知栏消息?的文章就讲到这里了,如果你想了解更多关于什么是push通知栏消息?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我使用 Runtime.getRuntime().exec 来运行 perl 程序。现在我想在执行过程中显示百分比进度条,然后在perl程序执行完成后,它应该关闭进度条。我该怎么做? Runtime.
我已广泛搜索该网站,但找不到答案。请我是新手,我需要你的帮助。 我想创建一个固定的导航栏,但每次在我的 CSS 样式表中放置一个固定的规则时,导航栏都会消失。这是我的 html 代码:
Here's a nice jsFiddle illustrating the problem 我正在尝试创建一个标题栏元素... 永远只有 1 行高 在右上角有始终存在的控件 在左上角有一个标题,如
int fd = open(JOYSTICK_NAME, O_RDONLY | O_NONBLOCK); O_RDONLY 和 O_NONBLOCK 之间的栏是什么意思?我在 OpenGL/GLUT
我注意到我的网页在页脚之后和页面底部有一个空白/栏: 我试图通过使用 Chrome 中的 inspect 元素来查找此问题的原因,但找不到任何内容。我正在使用 Boostrap,这是我的页脚 HTML
我已经对这个主题进行了一些研究,但我找不到完整的解决方案,因此,我一步一步地尝试和错误,我终于找到了如何实现这些结果:透明或彩色Actionbar 和 Statusbar。请参阅下面的答案。 最佳答案
Highcharts 教程中的经典示例是: $(function () { $('#container').highcharts({ chart: { type: 'bar'
注意 :这与 iOS 13 中使用的新默认模态呈现样式无关。 我有一个奇怪的问题,显示模态 UINavigationController . 考虑一个 UIViewController位于 UINav
我需要帮助了解如何在加载页面时隐藏 iPad 地址栏或顶部的整个地址栏。 我正在开发基于在线客户管理系统的系统,需要隐藏 iPad 地址栏,因为它在查看网站时会占用大量空间。 问候涡流 已经尝试了以下
我在向栏中添加文本时遇到了一些问题。我想在栏上方显示值,但我无法向每个栏添加文本。 现在我的dom结构是: g rect rect rect 我想要什么: g g.bar rect
我有 ListView ,数据将从数据表显示在 ListView 中像这样我已经完成了但是我在数据行 6 有问题 dt = classes.xxxxx.GetData(sql,
我使用 opposite 属性将 xAxis 向右移动。条形图怎么可能也从右侧开始? 谢谢! Highcharts.chart('absoluteInterruptions', { chart:
我得到了这张图片,我想在我的导航 Controller 中使用它: 我是这样设置的(根据 this 问题的建议): UINavigationBar *theBar = self.navigationC
这个问题在这里已经有了答案: How to disable breadcrumbs in Eclipse (11 个答案) 关闭 9 年前。 有谁知道如何删除我在 Eclipse 中用红色圈出的栏?
总而言之,我的应用程序中有一个浏览器,我希望它只启动 5 个网站,仅此而已。有没有办法让我的浏览器通过设置自定义字符串来启动 5 个网站,例如 if {用户键入此字符串} 转到该网站,然后 else
我想在我的应用程序中实现一个进度条。发生的过程是应用程序将一个目录复制到 iOS 文档目录中。通常需要 7-10 秒(iPhone 4 测试)。我对进度条的理解是你在事情发生时更新进度条。但是根据目录
我正在寻找一种创建交互式子弹图的方法,它允许用户单击图中的任意位置并设置一个标记,然后根据该标记所在的位置计算一些简单的值。例如,我希望它看起来类似于: http://www.usrecordings
我目前在一个网站上工作,我有一张人的照片。在图片的右侧,我想要名称和描述。名称应与描述具有不同的背景。我上传了一张它应该是什么样子的图片:http://www.tiikoni.com/tis/view
我将 div 栏设置为不滚动,因此它将始终显示在网站顶部。在这个栏内,我有另一个 div 框,里面有两个按钮,它们向右浮动,所以它们总是在右上角。 问题是我希望按钮居中于页面的右上角而不是右上角。相反
因此,我在我的网站中使用了一个选择栏。我试图在悬停时更改选项的背景颜色。此外,如果有人知道设置垂直 slider 样式的好方法,那就太棒了。 这是我正在尝试做的事情的 fiddle : http://
我是一名优秀的程序员,十分优秀!