关于推送push中notification的一点问题

Apple Push Notification Service Server Certificate Update 【对接三方推送平台无需操作、自建服务对接APNs则需手动更新】 阅读详情

         对于推送,一般的APP都会有这种功能,这是一种拉回用户,使其重新用我们APP增强用户粘性的一种方法,所以这也是一种很常见的功能。但是之前一直没注意 ,所以也忽略了一些问题,最近正好碰到了,记录下来,防止大家再次踩坑。

         因为最近的业务场景的需要,一个用户会在很短的时间内收到比较多的推送,但是在之前的应用中,其实这种业务场景不会那么多的。但是现在出现了,也出现了两个问题。那么出现的问题是什么呢?问题一:当收到多条推送时候,在通知栏里面后面的会覆盖前面的。问题二:解决问题一后,点击了通知栏里面的notification,我们会传递一些值到广播接收器中,但是发现后面的值依然是会覆盖前面的值。

        其实看了下代码中,关于发送notification部分的代码就只有如下几行:

    //接收服务端发送过来的自定义消息 (服务器里面必须不能有其他设置,只是设置EXTRA_MESSAGE就好,title、content等都不要)
    private void processCustomMessage(Context context,String message){
        final NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Intent intent = new Intent(context, PushIntentRecever.class);
        PersonalMessageBean personalMessageBean = GsonUtils.getModel(message,PersonalMessageBean.class);
        intent.putExtra(ConstantValue.PARCELABLE_DATA,personalMessageBean);
        intent.setAction("xxx");//如果是以PendingIntent方式发送广播,action必须设置对
        //第四个参数如果不是FLAG_UPDATE_CURRENT,那么传递的参数可能会收不到;如果第二个参数每次不是唯一的,那么传递的参数会覆盖
        PendingIntent pi = PendingIntent.getBroadcast(context, (int) System.currentTimeMillis(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        int defaults = 0;
        defaults |= Notification.DEFAULT_SOUND;//系统提示音
        defaults |= Notification.DEFAULT_VIBRATE;//系统震动
        defaults |= Notification.DEFAULT_LIGHTS;//系统灯光
        builder.setContentIntent(pi)
                .setSmallIcon(R.mipmap.ic_launcher).setTicker(ResourcesUtil.getString(R.string.app_name)).setWhen(System.currentTimeMillis())
                .setOnlyAlertOnce(true).setAutoCancel(true).setContentTitle(ResourcesUtil.getString(R.string.app_name))
                .setContentText(personalMessageBean.getMessageContent()).setDefaults(defaults);
        Notification notification = builder.build();
        //第一个参数是消息的notification的id,如果相同的话,那么通知就会覆盖啦
        nm.notify((int) System.currentTimeMillis(), notification);
    }
         当然上面是我修改之后的代码,其实关键的地方就在于我上面写注释的地方,解决问题一的关键在于NotificationManager的notify方法的第二个参数了。解决问题二关键就在于PendingIntent的getBroadcast方法的第二个参数。

          那我们先看看notify方法的注释:

          

/**
     * Post a notification to be shown in the status bar. If a notification with
     * the same id has already been posted by your application and has not yet been canceled, it
     * will be replaced by the updated information.
     *
     * @param id An identifier for this notification unique within your
     *        application.
     * @param notification A {@link Notification} object describing what to show the user. Must not
     *        be null.
     */
    public void notify(int id, Notification notification)
    {
        notify(null, id, notification);
    }
       可以看到注释写的很清楚,会向状态栏发送一个通知,如果我们自己应用已经发送了一个相同id的通知且没有被取消,那么之前的相同的id的notification就会被后面新发送的覆盖。这块原来也是没仔细看,既然想要唯一id,所以上面就直接放了个时间戳上去了,当然需要强转成int类型的。

      然后看第二个问题的解决方案,我们来看看getBroadcast方法的注释:

     

/**
     * Retrieve a PendingIntent that will perform a broadcast, like calling
     * {@link Context#sendBroadcast(Intent) Context.sendBroadcast()}.
     *
     * <p class="note">For security reasons, the {@link android.content.Intent}
     * you supply here should almost always be an <em>explicit intent</em>,
     * that is specify an explicit component to be delivered to through
     * {@link Intent#setClass(android.content.Context, Class) Intent.setClass}</p>
     *
     * @param context The Context in which this PendingIntent should perform
     * the broadcast.
     * @param requestCode Private request code for the sender
     * @param intent The Intent to be broadcast.
     * @param flags May be {@link #FLAG_ONE_SHOT}, {@link #FLAG_NO_CREATE},
     * {@link #FLAG_CANCEL_CURRENT}, {@link #FLAG_UPDATE_CURRENT},
     * {@link #FLAG_IMMUTABLE} or any of the flags as supported by
     * {@link Intent#fillIn Intent.fillIn()} to control which unspecified parts
     * of the intent that can be supplied when the actual send happens.
     *
     * @return Returns an existing or new PendingIntent matching the given
     * parameters.  May return null only if {@link #FLAG_NO_CREATE} has been
     * supplied.
     */
    public static PendingIntent getBroadcast(Context context, int requestCode,
            Intent intent, @Flags int flags) {
        return getBroadcastAsUser(context, requestCode, intent, flags,
                new UserHandle(UserHandle.myUserId()));
    }
        哇,这个注释还是蛮多的。大致意思就是 获取生成一个PendingIntent,就会发送一个广播,就像调用了Context.sendBroadcast()方法一样子,下面说 为了安全考虑,这个方法的第三个参数intent,最好是使用显示的方式,就是使用setClass的方式声明出意向类,最好不要使用隐式意图,而我上面竟然是用的隐示意图(捂脸笑表情一个);第一个参数context就是要发送广播的上下文对象了,第二个参数requestCode,这个就是对于发送者的请求code,有点类似于我们startActivityForResult时候传递的requestCode了,所以说如果这个requestcode的值所有notification都一样,那么就会被认为是同一个意图,自然extra数据是会被覆盖的。第三个参数刚说过了,第四个参数也是蛮重要的,意思大概是说这个参数会控制当实际的发送notification发生时候可以提供哪些我们未指定的intent,应该就是intent携带的数据了;通过看注释我们发现FLAG_UPDATE_CURRENT比较适合我们的业务场景:

/**
     * Flag indicating that if the described PendingIntent already exists,
     * then keep it but replace its extra data with what is in this new
     * Intent. For use with {@link #getActivity}, {@link #getBroadcast}, and
     * {@link #getService}. <p>This can be used if you are creating intents where only the
     * extras change, and don't care that any entities that received your
     * previous PendingIntent will be able to launch it with your new
     * extras even if they are not explicitly given to it.
     */
    public static final int FLAG_UPDATE_CURRENT = 1<<27;
它的大致意思是如果描述的PendingIntent已经存在,然后会保持它,但是也会用新的intent的extra替换老的extra data;这种方式可以用于如果你创建了一个只有extras发生变化的intent并且不在意之前的PendingIntent所收到的实体,所以它将会用新的extra来启动通知(当点击通知栏的通知时候)即使你不明确的指定。

         以上就是遇到的问题以及解决方法,有不对之处欢迎指正。

使用Leancloud实现React Native App的消息推送(Push Notification)- iOS篇 前言 React Native现在是越来越火,一套代码同时构建iOS、Android两种应用真的是太爽了,而且有了ES6和React的加成开发效率出奇的高。 虽然坑奇多无比但是还是阻挡不了市场对它的热爱。但是使用React Native也并非总是那么舒服,尤其涉及到需要用objective-c或者java实现某些原生功能的时候,让广大前端出生没有原生App开发经验的同学们苦不堪言,但是没有办法,... 阅读详情

相关推荐

uniapp:3分钟搞定在线推送uni.createPushMessage,uni.onPushMessage

uniapp在线推送

sunluyi的博客 8046

uniapp推送功能

2023-08-15 如何在 uni-app 中检测 APP 端是否有通知权限 - 知乎 (zhihu.com)有遇到问题uni.createPushMessage无效,是因为把它写在了uni.onPushMessage中。App 和微信小程序端。App 和微信小程序端。

m0_65720832的博客 1348

CST新手必看:共面波导色散曲线绘制全流程(附参数设置详解)

本文为CST新手提供了绘制共面波导色散曲线的完整流程与参数设置详解。从模型搭建、周期性边界条件设置,到本征模求解器配置和参数扫描技巧,逐步解析关键步骤,并分享后处理与结果验证方法,帮助用户高效完成仿真任务。

j0k1l2m3n的博客 422

四种后台模式push notification 总结(另附送极光推送)

iOS 7 中, app 有四种后台运行模式 ,对应苹果的后台接口实现. 1. 无后台仅推送, 出现在 iOS 3.x 以下大部分系统版本, 表现为 按下 home 键就关闭退出,数据有 apple 的推送服务器传输,并不需要应用后台运行 这样做,每次退出后,重新进入都需要重新加载,重新请求下载,都需要耗费电量,而且用户体验不佳. 2.墓碑式后台,iOS 4后被大量采用,人称伪多

jerry129GT的博客 7811

scannet数据集下载文件

scannet数据集下载文件 由于大家会申请scannet数据集,审批比较慢,我将下载的文件里面的内容贴出来,大家可以复制放进py文件中,运行就可以下载 ps:别再私信要数据集了,这个自己下载,如果光三维数据的话,还是很快的,当然如果路由器翻了墙的话,下载会更快。 #!/usr/bin/env python # Downloads ScanNet public data release # Run with ./download-scannet.py (or python download-scannet.

weixin_40766438的博客 9231

VFIO框架源码分析(一)- 从初始化到设备访问

本文深入剖析了Linux内核中的VFIO(Virtual Function I/O)框架,详细解读了其从初始化到设备访问的全过程。VFIO通过Container->Group->Device的层次化设计,利用IOMMU提供安全隔离,允许用户空间直接访问物理设备。文章基于Linux v5.15版本,重点分析了vfio_init模块入口、Container创建与配置、Group关联以及最终设备访问等关键环节,揭示了VFIO如何通过逐层授权机制构建安全可靠的设备直通模型,为虚拟化技术提供核心支持。

qq_36071928的博客 380

uniapp 消息推送2.0版本

uniapp 消息推送2.0版本

qq_36944548的博客 4667

YOLOv11改进策略【模型轻量化】| 替换华为的极简主义骨干网络:VanillaNet

本文记录的是基于VanillaNet的YOLOv11轻量化改进方法研究。VanillaNet的极简主义在于无 shortcut 连接,并且在网络的每个阶段仅使用一层卷积,无额外复杂模块,仅通过自身简洁的架构设计和训练策略,实现有效地训练和优化。本文在替换骨干网络中配置了原论文中的、和11种模型,以满足不同的需求。

Limiiiing的博客 1724

Push Notification总结系列(一)

Notification系列概括: 1.Push Notification简介和证书说明及生成配置 2.Push Notification的iOS处理代码和Provider详解 3.Push Notification的移动客户端定位服务 正文: PushNotification简介和证书说明及生成配置 一、推送通知,个人理解,指的是苹果公司通过服务器向设备终端...

afei000001981的博客 478

用 SE84 反查 SAP 消息号:弹窗一闪而过也能抓到 Message ID 和 Number 的小技巧

SAP开发技巧:通过消息文本反查Message ID和编号 在SAP开发中,经常遇到系统只显示错误消息文本而缺少技术信息的情况。本文介绍两种实用方法: 使用SE84工具:通过输入带通配符的短文本(如"错误文本")反向查找消息类和编号 直接查询T100表:利用消息文本在T100表中检索完整的消息技术信息 这些技巧特别适用于处理弹窗消息、框架层错误等无法直接获取技术细节的场景。掌握消息ID和编号后,开发者可以更高效地进行问题定位、代码调试和错误处理,尤其在SAP Gateway、RAP等现代

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 373

RK3568平台(电源篇)电源域IO配置

在kernel之前需要修改电源域,主控电源域的IO电平要与对接外设芯片的IO电平匹配,还要注意软件的电压配置要跟硬件的电压一致,否则,最坏的情况可能会导致IO的损坏。其实就是管理 IO 输出的电平;假如硬件上 IO 电源域配置为 3.3V,则 IO 输出最大电平为 3.3V;同理 IO 电源域硬件配置为 1.8V,则 IO 输出最大电平是 1.8V;这样有利于 IO 电平的灵活配置;

weixin_49303682的博客 3478

React Native Push Notification 常见问题排查指南

在移动应用开发中,推送通知是提升用户参与度和留存率的重要功能。react-native-push-notification 是一个流行的 React Native 推送通知库,但在使用过程中开发者可能会遇到各种问题。本文将系统性地梳理常见问题及其解决方案,帮助开发者更好地使用该库。 ## 已知问题 ### Android 平台问题 1. **通知点击事件未触发** 在某些 Andr...

gitblog_00747的博客 601

多周期路径约束(set_multicycle_path )

1.由慢到快的多周期约束 如下图所示,发射时钟周期是接受时钟周期的4倍。默认情况下,按照1T原则来进行静态时序分析和布局布线的。即建立时间是在发射沿后的第一个捕获沿检查,而保持时间是同一时刻下源时钟和捕获时钟的触发边沿下检查的(建立时间检查边沿的前一个触发沿)。 但是这样导致的问题就是该路径过于苛刻,为了满足这条路径的要求,不得不放弃其他路径。或者根本没办法保证这个默认的约束。总之最终造成...

Arist. 5506

ANE-Push-Notification 项目常见问题解决方案

ANE-Push-Notification 项目常见问题解决方案 项目基础介绍 ANE-Push-Notification 是一个用于 iOS 和 Android 平台的 Air Native Extension (ANE),主要用于实现推送通知功能。该项目由 FreshPlanet 开发,并在其游戏 SongPop 中使用。该项目支持 iOS 设备使用 Apple Push Notificati...

gitblog_00425的博客 709

2025年CSP-J初赛真题及答案解析(完整版)

2025年CSP-J初赛真题及答案解析(完整版)

王老师青少年编程 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

React Native实现推送通知

在React Native中实现推送通知通常需要使用特定的库来处理iOS和Android平台的通知服务。react-native-push-notification、notifee、react-native-firebase、极光推送。

low神 2426

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Vue Push Notification Example 项目常见问题解决方案

Vue Push Notification Example 项目常见问题解决方案 项目基础介绍 Vue Push Notification Example 是一个开源项目,旨在展示如何使用 Vue.js 和 Firebase 实现浏览器推送通知。该项目使用了 Firebase 云消息服务(FCM)来发送通知,无需额外配置即可免费使用。项目的主要编程语言为 JavaScript,采用了 Vue.js...

gitblog_00846的博客 1043

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

React Native VoIP Push Notification 项目常见问题解决方案

React Native VoIP Push Notification 项目常见问题解决方案 项目基础介绍 React Native VoIP Push Notification 是一个专为 iOS 平台设计的开源项目,主要用于实现 VoIP(Voice over IP)推送通知功能。该项目基于 React Native 框架,使用 JavaScript 和 Objective-C 作为主要的编程...

gitblog_00883的博客 875

iOS-VoIP Push Notification

最近看了一篇文章,说的是微信实现收款到账语音提醒功能实现。原文章 文中提到了VoIP Push Notification,本文针对推送的种类以及如何利用推送唤醒 app 进行总结。 普通推送远程推送和本地推送区别网上资料太多了,简单说一下,比如今日头条,有什么大的新闻会在手机端接收到推送,这个就是远程推送,是把相关信息推送到苹果推送服务器-APNS。本地推送就是在本地设定一个时间,其实就是一个类似闹

Developer 3614

ANE-Push-Notification: 轻松实现移动应用的推送通知功能

ANE-Push-Notification: 轻松实现移动应用的推送通知功能 ANE-Push-NotificationAir Native Extension (iOS and Android) for Push Notification项目地址:https://gitcode.com/gh_mirrors/an/ANE-Push-Notification ANE-Push-Notificat...

gitblog_00027的博客 481

React Native Push Notification 指南

--- ## 项目介绍 **React Native Push Notification** 是一个专为React Native设计的推送通知库,它使开发者能够在iOS和Android平台上轻松集成并管理推送通知功能。该库支持远程通知以及本地定时通知,提供了丰富的API来定制通知行为,兼容Firebase Cloud Messaging (FCM) 和 Apple Push Notificat...

gitblog_00564的博客 991

关于推送消息 (apple push notification)

From:  http://mobiforge.com/developing/story/programming-apple-push-notification-services Programming Apple Push Notification Services Posted by weimenglee 2 years 7 weeks ago

logcabin的专栏 1226

iOS: Some issues about push notification

custom data in push notification http://no001.blog.51cto.com/1142339/642817 当运行带apns feature的app到真机上后,会弹出错误: "Error Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment' entitleme

Tomson Xu 3571

pwa集成消息推送与提醒(Push & Notification)

本文介绍了pwa的消息推送和订阅

farme_guan的博客 2209

React Native Push Notification iOS:终极iOS推送通知解决方案完全指南

React Native Push Notification iOS是为iOS平台打造的专业推送通知API解决方案,能够帮助开发者轻松实现应用的消息推送功能。无论是新手还是有经验的开发者,都能通过本指南快速掌握其使用方法,为应用增添高效的用户沟通渠道。 ## 项目核心功能与优势 React Native Push Notification iOS作为一款专注于iOS推送通知的工具,具有以下核心

gitblog_00752的博客 239

iOS push notification

先记录一些好的blog 回头再整理 1、http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12     a good toturial 2、https://www.parse.com/tutorials/ios-push-notifications   a simpl

jaychlas的专栏 6008
上一篇: CoordinatorLayout中设置layout_behavior的布局无法垂直居中问题解决
下一篇: android studio升级到3.0之后的一些配置变化
和小胖
博客等级 码龄12年 8粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值