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"
//            }
//        }
相关推荐
汤姆yu13 分钟前
基于springboot的尿毒症健康管理系统
java·spring boot·后端
暮色妖娆丶17 分钟前
Spring 源码分析 单例 Bean 的创建过程
spring boot·后端·spring
biyezuopinvip1 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
JavaGuide2 小时前
一款悄然崛起的国产规则引擎,让业务编排效率提升 10 倍!
java·spring boot
figo10tf2 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
zhangyi_viva2 小时前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端
山水域2 小时前
SKAdNetwork 6.0 深度实战:多窗口转化值(Conversion Value)建模与数据分层架构
ios
橙露2 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
程序员敲代码吗3 小时前
Spring Boot与Tomcat整合的内部机制与优化
spring boot·后端·tomcat
NuageL3 小时前
原始Json字符串转化为Java对象列表/把中文键名变成英文键名
java·spring boot·json