japans的搭建(使用p12)

本文档记录了如何解决公司在使用apns服务时遇到的问题,详细介绍了p12文件的正确生成方法,即通过双击苹果推送证书并导出p12。由于Easy APNs Provider无法验证p12的正确性,因此决定使用javapns.jar 2-2搭建一个支持p12的APNS推送服务器。文中提供了参考的Java程序实现,但注意log4j配置可能存在问题,这可能是由于log4j.properties配置不准确导致的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前情提要

由于公司服务器在使用apns服务的时候使用的是p12文件,经历了p12生成步骤错误(正确步骤是在双击苹果官网上下载的推送证书之后在钥匙串中同时选中ssl证书和密匙导出p12)之后使用原先的神奇软件Easy APNs Peovider无法检测导出的p12是否正确。所以需要搭建一个直接使用p12的发送服务器,这里使用到javapns.jar 2-2来搭建。

参考了网上相关教程和程序之后,使用java语言编写的ApnsPush程序如下(log4j配置有些问题,这个部分可以跳过,估计是log4j.properties配置不正确)

import java.util.*;

import java.util.ArrayList;
import java.util.List;

import javapns.devices.Device;
import javapns.devices.implementations.basic.BasicDevice;
import javapns.notification.AppleNotificationServerBasicImpl;
import javapns.notification.PushNotificationManager;
import javapns.notification.PushNotificationPayload;
import javapns.notification.PushedNotification;
import javapns.notification.Payload;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.*;   
public class push {
    private static Log log = LogFactory.getLog(push.class.getName());
    private static   Logger logger1 = Logger.getLogger("console");   
     /************************************************
     测试推送服务器地址:gateway.sandbox.push.apple.com /2195 
     产品推送服务器地址:gateway.push.apple.com / 2195 

    需要javaPNS_2.2.jar包

     ***************************************************/
    /**

    *这是一个比较简单的推送方法,

    * apple的推送方法

    * @param tokens   iphone手机获取的token

    * @param path 这里是一个.p12格式的文件路径,需要去apple官网申请一个 

    * @param password  p12的密码 此处注意导出的证书密码不能为空因为空密码会报错

    * @param message 推送消息的内容

    * @param count 应用图标上小红圈上的数值

    * @param sendCount 单发还是群发  true:单发 false:群发

    */
    public void sendpush(List<String> tokens,String path, String password, String message,Integer count,boolean sendCount) {

        try {
            //message是一个json的字符串{“aps”:{“alert”:”iphone推送测试”}}

                PushNotificationPayload payLoad =  PushNotificationPayload.fromJSON(message);

                payLoad.addAlert("iphone推送测试"); // 消息内容

                payLoad.addBadge(count); // iphone应用图标上小红圈上的数值

                payLoad.addSound("default"); // 铃音 默认



                PushNotificationManager pushManager = new PushNotificationManager();

                //true:表示的是产品发布推送服务 false:表示的是产品测试推送服务

                pushManager.initializeConnection(new AppleNotificationServerBasicImpl(path, password, false));

                List<PushedNotification> notifications = new ArrayList<PushedNotification>(); 

                // 发送push消息

                if (sendCount) {

                log.debug("--------------------------apple 推送 单-------");

                Device device = new BasicDevice();

                device.setToken(tokens.get(0));

                PushedNotification notification = pushManager.sendNotification(device, payLoad, false);

                notifications.add(notification);

                } else {

                log.debug("--------------------------apple 推送 群-------");

                List<Device> device = new ArrayList<Device>();

                for (String token : tokens) {

                device.add(new BasicDevice(token));

                }

                notifications = pushManager.sendNotifications(payLoad, device);

                }

                List<PushedNotification> failedNotifications = PushedNotification.findFailedNotifications(notifications);

                List<PushedNotification> successfulNotifications = PushedNotification.findSuccessfulNotifications(notifications);

                int failed = failedNotifications.size();

                int successful = successfulNotifications.size();



                if (successful > 0 && failed == 0) {

                log.debug("-----All notifications pushed 成功 (" + successfulNotifications.size() + "):");

                } else if (successful == 0 && failed > 0) {

                log.debug("-----All notifications 失败 (" + failedNotifications.size() + "):");
                logger1.debug("-----All notifications 失败 (" + failedNotifications.size() + "):");

                } else if (successful == 0 && failed == 0) {

                System.out.println("No notifications could be sent, probably because of a critical error");

                } else {

                log.debug("------Some notifications 失败 (" + failedNotifications.size() + "):");
                logger1.debug("------Some notifications 失败 (" + failedNotifications.size() + "):");
                log.debug("------Others 成功 (" + successfulNotifications.size() + "):");

                }

        // pushManager.stopConnection();

        } catch (Exception e) {

        e.printStackTrace();

        }

    }
    /**
     * TODO
     * @param args
     */
    public static void main(String[] args) {
           PropertyConfigurator.configure("/Users/zjx/Documents/workspace/ApnsPush/src/log4j.properties");   
           //在后台输出   
           Logger logger1 = Logger.getLogger("console");   
           logger1.debug("debug!!!");   
           logger1.info("info!!!");   
           logger1.warn("warn!!!");   
           logger1.error("error!!!");   
           logger1.fatal("fatal!!!"); 
        push send=new push();
        List<String> tokens=new ArrayList<String>();
        tokens.add("4447a26b6b5fbf7e4d7900b42e29a7efd243178aa47c2d55fe787634c6a0a5ca");
        String path="/Users/zjx/Desktop/证书dev.p12";
        String password="**";
        String message="{'aps':{'alert':'iphone推送测试'}}";
        Integer count=1;
        boolean sendCount=false;
        send.sendpush(tokens, path, password, message, count, sendCount);

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值