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

推送整体流程

1.在开发者中心申请对应的证书(我用的是.p12文件)

2.苹果手机用户注册到APNS,APNS将注册的token返回给APP(服务端接收使用)。

3.后台服务连接APNS,获取连接对象

4.后台服务构建消息载体

5.后台通过连接对象,根据指定的token将信息发送给指定的手机用户

证书是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等终端设备注册后返回的DeviceToken
        String deviceToken = "853fa4caaf01d36df40bc54b339dba0fd6689585b1cd478552bee4f589380cb2";
        // 这是你的主题,大多数情况是bundleId,voip需要在bundleId加上.voip。对应文档中的apns-topic
        // 代表app签名的topic
        String 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,mdm
            PushType 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=objc
            log.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"
//            }
//        }
相关推荐
yangminlei1 小时前
Spring 事务探秘:核心机制与应用场景解析
java·spring boot
+VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue小型房屋租赁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
进阶的小名7 小时前
[超轻量级延时队列(MQ)] Redis 不只是缓存:我用 Redis Stream 实现了一个延时MQ(自定义注解方式)
java·数据库·spring boot·redis·缓存·消息队列·个人开发
Swift社区7 小时前
使用 MetricKit 监控应用性能
ios·swiftui·swift
阮松云8 小时前
code-server 配置maven
java·linux·maven
y***n6148 小时前
springboot项目架构
spring boot·后端·架构
qq_318121598 小时前
互联网大厂Java面试故事:支付与金融服务微服务架构、消息队列与AI风控全流程解析
java·spring boot·redis·微服务·kafka·支付系统·金融服务
LawrenceMssss8 小时前
由于创建一个完整的App涉及到多个层面(如前端、后端、数据库等),并且每种语言通常有其特定的用途(如Java/Kotlin用于Android开发,Swift/Objective-C用于iOS开发,Py
android·java·ios
亲爱的非洲野猪9 小时前
SpringBoot启动流程深度剖析:从@SpringBootApplication到Servlet容器就绪
hive·spring boot·servlet
OpenTiny社区9 小时前
TinyPro v1.4.0 正式发布:支持 Spring Boot、移动端适配、新增卡片列表和高级表单页面
java·前端·spring boot·后端·开源·opentiny