Java整合APNS推送消息-IOS-APP(基于.p12推送证书)

推送整体流程

1.在开发者中心申请对应的证书(我用的是.p12文件)
2.苹果手机用户注册到APNS,APNS将注册的token返回给APP(服务端接收使用)。
3.后台服务连接APNS,获取连接对象
4.后台服务构建消息载体
5.后台通过连接对象,根据指定的token将信息发送给指定的手机用户

APNs走向图

 证书是iOS同事生成给我的,具体生成步骤此处不做描述,网上能够搜到生成步骤。

引入maven文件

<dependency><groupId>com.turo</groupId><artifactId>pushy</artifactId><version>0.13.10</version>
</dependency>

下面是一个推送小demo,具体代码可以根据你们业务优化

package top.hnym.hnymsfapp.util;import com.turo.pushy.apns.*;
import com.turo.pushy.apns.util.SimpleApnsPushNotification;
import com.turo.pushy.apns.util.concurrent.PushNotificationFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.io.File;
import java.util.Date;
import java.util.UUID;/*** @Author Lebron* @Date 2023/7/20 17:10* @Description apns消息推送 TODO*/
@Component
@Slf4j
public class APNsUtils {private static ApnsClient apnsClient1 = null;private static String topic1 = "com.hnym.sf.micro";private static String p12Password1 = "apns_push1.p12";public static void main(String[] args) throws Exception {// IOS等终端设备注册后返回的DeviceTokenString deviceToken = "853fa4caaf01d36df40bc54b339dba0fd6689585b1cd478552bee4f589380cb2";// 这是你的主题,大多数情况是bundleId,voip需要在bundleId加上.voip。对应文档中的apns-topic// 代表app签名的topicString payload = "{\n" +"    \"aps\":{\n" +"        \"alert\":{\n" +"            \"title\":\"基尼太美\",\n" +"            \"body\":\"基尼实在是太美\"\n" +"        },\n" +"        \"badge\":\"1\",\n" +"        \"sound\":\"default\",\n" +"        \"userinfo\":{\n" +"            \"username\":\"tome\"\n" +"        }\n" +"    }\n" +"}";sendNotification1(deviceToken, payload);}public static ApnsClient sendNotification1(String deviceToken, String payload) {log.info("IOS开始推送............");try {apnsClient1 = null;// 有效时间Date invalidationTime = new Date(System.currentTimeMillis() + 60 * 60 * 1000L);// 发送策略 apns-priority 10为立即 5为省电DeliveryPriority priority = DeliveryPriority.IMMEDIATE;// 推送方式,主要有alert,background,voip,complication,fileprovider,mdmPushType pushType = PushType.ALERT;// 推送的合并ID,相同的 apns-collapse-id会在App中合并String collapseId = UUID.randomUUID().toString();// apnsId 唯一标示,如果不传,APNs会给我们生成一个UUID apnsId = UUID.randomUUID();// 构造一个APNs的推送消息实体SimpleApnsPushNotification msg = new SimpleApnsPushNotification(deviceToken, topic1, payload, invalidationTime,priority, pushType, collapseId, apnsId);// 四个线程EventLoopGroup eventLoopGroup = new NioEventLoopGroup(4);apnsClient1 = new ApnsClientBuilder()//setApnsServer用于设置推送服务环境(正式还是开发)ApnsClientBuilder.DEVELOPMENT_APNS_HOST.setApnsServer(ApnsClientBuilder.PRODUCTION_APNS_HOST).setClientCredentials(new File("/apns_push1.p12"), p12Password1)//setConcurrentConnections用于设置服务器与苹果服务器建立几个链接通道,这里是建立了四个,链接通道并不是越多越好的,具体速度自己百度.setConcurrentConnections(4)//setEventLoopGroup的作用是建立几个线程来处理,说白了就是多线程,我这里设置的都是4,相当于16个线程同时处理。.setEventLoopGroup(eventLoopGroup).build();PushNotificationFuture<SimpleApnsPushNotification, PushNotificationResponse<SimpleApnsPushNotification>> future = apnsClient1.sendNotification(msg);PushNotificationResponse<SimpleApnsPushNotification> response = future.get();apnsClient1.close();log.info("IOS推送结束............");// 如果返回的消息中success为true那么成功,否则失败!// 如果失败不必惊慌,rejectionReason字段中会有失败的原因。对应官网找到原因即可// https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/handling_notification_responses_from_apns?language=objclog.info("IOS推送结果--------------->{}", response);} catch (Exception e) {log.error("ios get pushy apns client failed!");e.printStackTrace();}return apnsClient1;}
}

执行后即收到推送过来的消息,速度还是蛮快的【真爱粉】

总结:

1、本人真爱粉;

2、.setClientCredentials(new File("/apns_push1.p12"), p12Password1),大家需要更改为自己的.p12文件路径;

3、如果你们不是安装的正式app,推送方式需要更改为ApnsClientBuilder.DEVELOPMENT_APNS_HOST,否则会推送不过去;

4、支持自定义声音、角标,ios版本不同,格式也不同

//        i0S10之前
//        "aps":{
//            "alert":"内容",
//                    "badge":"1",
//                    "sound":"default",
//                    "userinfo":{
//                "username":"tome"
//            }
//        }
//        IOS10及之后(ios7、ios8、ios9可通用此模板)
//        "aps":{
//            "alert":{
//                "title":"标题",// i0S7、8 资置无,i0S9 一严资为appName
//                        "subtitle":"子标题", // 一般用title就能满足篇求
//                        "body":"内容"
//            },
//            "badge":"1",// 角标数
//                    "sound":"default",// 声音
//                    "userinfo":{// 通知消息内容
//                "username":"tome"
//            }
//        }

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

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

相关文章

SpringBoot的热部署

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

视频美颜SDK开发指南:实现高质量实时美颜效果

下文小编将于大家一同探讨美颜SDK的开发指南&#xff0c;希望开发者们能够获得一定的启发。 一、理解实时美颜的挑战 实时美颜涉及到对视频流进行实时处理&#xff0c;这对计算资源和算法效率提出了严峻的挑战。在开发视频美颜SDK之前&#xff0c;我们需要理解以下几个关键方…

【Linux系统编程二十二】:(信号1)--信号的产生与发送

【Linux系统编程二十二】&#xff1a;信号的产生与发送 一.理解特性二.信号的产生1.键盘组合键①.前台进程②.硬件中断 2.异常的本质①软件异常 3.异步的 三.信号的发送 一.理解特性 第一&#xff0c;我们能够识别这个信号。我们能知道这个信号是什么。 第二&#xff0c;我们能…

Security Boot secure Boot的介绍

什么是secure boot secure boot 是一种保证平台上软件完整性的过程或机制。secure boot会在硬件和软件之间建立一种信任关系。在启用secure boot之后&#xff0c;没有经过签名的固件和软件是无法运行在该设备上。通过这种方式可以保证操作系统免受恶意攻击。secure boot一般使…

AI中的强化学习是怎么做的呢?

1. 什么是强化学习 其他许多机器学习算法中学习器都是学得怎样做&#xff0c;而强化学习&#xff08;Reinforcement Learning, RL&#xff09;是在尝试的过程中学习到在特定的情境下选择哪种行动可以得到最大的回报。在很多场景中&#xff0c;当前的行动不仅会影响当前的rewar…

1270. 数列区间最大值(线段树求区间最大)

题目&#xff1a; 1270. 数列区间最大值 - AcWing题库 输入样例&#xff1a; 10 2 3 2 4 5 6 8 1 2 9 7 1 4 3 8输出样例&#xff1a; 5 8 代码&#xff1a; #include <cstdio> #include <iostream> #include <climits>//INT_MIN头文件using namespace s…

QC/PD快充电源产品应用介绍

• 原边650-700V SJ MOSFET采用低FOM值的ESM 技术&#xff0c;有利于提高系统效 率&#xff0c; 以及更佳的EAS和EMI等特性&#xff0c;对于一些不含PFC电路的系统更友好。 • 副边采用低FOM值的SGT同步整流电路&#xff0c;相比肖特基二极管整流能有更低的 损耗&#xff0c;有…

PSP - 结构生物学中的机器学习 (NIPS MLSB Workshop 2023.12)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135120094 Machine Learning in Structural Biology (机器学习在结构生物学中) 网址&#xff1a;https://www.mlsb.io/ Workshop at the 37th Co…

[数据结构进阶 C++] 二叉搜索树(BinarySearchTree)的模拟实现

文章目录 1、二叉搜索树1.1 二叉搜索数的概念1.2 二叉搜索树的操作1.2.1 二叉搜索树的查找1.2.2 二叉搜索树的插入1.2.3 二叉搜索树的删除 2、二叉搜索树的应用2.1 K模型2.2 KV模型 3、二叉搜索树的性能分析4、K模型与KV模型完整代码4.1 二叉搜索树的模拟实现&#xff08;K模型…

品牌如何与消费者保持联系?这三点收好

社会物质条件的逐渐丰富使品牌的概念也发生了改变&#xff0c;从识别、区分产品到如今强调实用价值以及关注产品体验、情感释放、目标受众的身份认同等&#xff0c;这便要求品牌在深挖产品的基本功能之余&#xff0c;还需要在营销的情绪力等方面下功夫。那么品牌如何才能更好地…

Linux 通用 bond 配置

配置 bond1&#xff08;mode1&#xff09;如下&#xff1a; 如下表示配置成功 mac 地址一致&#xff1a; nmcli 命令延伸&#xff1a; 删除&#xff1a; 重命名&#xff1a;