Java发送ios推送消息(APN)的代码示例

2024-01-08 20:48

本文主要是介绍Java发送ios推送消息(APN)的代码示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java发送ios推送消息(APN)的代码示例


实际项目应用中,应该考虑使用开源项目java-apns:https://github.com/notnoop/java-apns

千万不要用一个叫JAVAPNS的项目。这个开源项目的代码非常烂,每次发送消息都重新建立socket连接。

在apple的文档中,都明确的说了会把这种行为当作dos攻击行为。性能差就更不用说了。

ios手机上要安装对应的应用。该应用与.p12证书文件应该匹配。

apple官方的,关于APN服务,和apn的feedback的文档在这个地方:https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW3

java版本发送apn推送代码示例:


package test;import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.security.KeyStore;
import java.util.regex.Pattern;import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;public class TestAPN {/*** @param args*/public static void main(String[] args) {String keyPath = "/data/tmp/proj.apns.p12";String ksType = "PKCS12";String ksPassword = "111111";String ksAlgorithm = "SunX509";String deviceToken = "1404c88dbb0adb92c0a85f4cd09be9707f251ae5bbecdb0a6a3e572aeb337d73";String serverHost = "gateway.push.apple.com";int serverPort = 2195;try {InputStream certInput = new FileInputStream(keyPath);KeyStore keyStore = KeyStore.getInstance(ksType);keyStore.load(certInput, ksPassword.toCharArray());KeyManagerFactory kmf = KeyManagerFactory.getInstance(ksAlgorithm);kmf.init(keyStore, ksPassword.toCharArray());SSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(kmf.getKeyManagers(), null, null);SSLSocketFactory socketFactory = sslContext.getSocketFactory();Socket socket = socketFactory.createSocket(serverHost, serverPort);StringBuilder content = new StringBuilder();String text = "this is a test.";content.append("{\"aps\":");content.append("{\"alert\":\"").append(text).append("\",\"badge\":1,\"sound\":\"").append("ping1").append("\"}");content.append(",\"cpn\":{\"t0\":").append(System.currentTimeMillis()).append("}");content.append("}");byte[] msgByte = makebyte((byte)1, deviceToken, content.toString(), 10000001);System.out.println(msgByte);socket.getOutputStream().write(msgByte);socket.getOutputStream().flush();socket.close();} catch (Exception e) {e.printStackTrace();}}/*** 组装apns规定的字节数组  使用增强型* * @param command* @param deviceToken* @param payload* @return* @throws IOException*/private static byte[] makebyte(byte command, String deviceToken, String payload, int identifer) {byte[] deviceTokenb = decodeHex(deviceToken);byte[] payloadBytes = null;ByteArrayOutputStream boas = new ByteArrayOutputStream();DataOutputStream dos = new DataOutputStream(boas);try {payloadBytes = payload.getBytes("UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();return null;}try {dos.writeByte(command);dos.writeInt(identifer);//identiferdos.writeInt(Integer.MAX_VALUE);dos.writeShort(deviceTokenb.length);dos.write(deviceTokenb);dos.writeShort(payloadBytes.length);dos.write(payloadBytes);return boas.toByteArray();} catch (IOException e) {e.printStackTrace();return null;}}private static final Pattern pattern = Pattern.compile("[ -]");private static byte[] decodeHex(String deviceToken) {String hex = pattern.matcher(deviceToken).replaceAll("");byte[] bts = new byte[hex.length() / 2];for (int i = 0; i < bts.length; i++) {bts[i] = (byte) (charval(hex.charAt(2*i)) * 16 + charval(hex.charAt(2*i + 1)));}return bts;}private static int charval(char a) {if ('0' <= a && a <= '9')return (a - '0');else if ('a' <= a && a <= 'f')return (a - 'a') + 10;else if ('A' <= a && a <= 'F')return (a - 'A') + 10;else{throw new RuntimeException("Invalid hex character: " + a);}}
}


这篇关于Java发送ios推送消息(APN)的代码示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/584776

相关文章

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim