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);//identifer
            dos.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);
        }
    }
}
时间: 2024-09-19 23:54:19

Java发送ios推送消息(APN)的代码示例的相关文章

java后台异步推送消息至服务器(mqtt paho)

问题描述 java后台异步推送消息至服务器(mqtt paho) web创建消息推送保存至数据库后,后台从数据库获取数据并异步推送:即每次获取一条数据推送,推送成功后再获取第二条数据推送,依此类推,当没有数据时处于睡眠状态.我该怎么实现. 解决方案 wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

iOS 推送消息只有后台关闭了才会收到推送框

问题描述 当我把软件进入后台的时候, 发送了一条消息,打印台有显示收到新消息,但是没有推送框提示.软件在前台的时候也是一样,发送消息只看到打印,没有收到弹框, 但是我把软件关闭了之后再发送一条消息,就可以收到推送框了. 我想要的效果是 1.软件在前台的时候,能弹出消息提示框.(可以理解成截取收到消息的方法,自定义收到消息后显示的效果)2.软件在后台的时候能收到推送框框 解决方案 1.软件在前台的时候,能弹出消息提示框.----这个不能走推送的,你可以用alertview实现的,2.软件在后台的时

iOS自定义推送消息提示框_IOS

看到标题你可能会觉得奇怪 推送消息提示框不是系统自己弹出来的吗? 为什么还要自己自定义呢?  因为项目需求是这样的:最近需要做 远程推送通知 和一个客服系统 包括店铺客服和官方客服两个模块 如果有新的消息推送的时候 如果用户当前不在客服界面的时候  要求无论是在app前台 还是app退到后台 顶部都要弹出系统的那种消息提示框 这样的需求 我们就只能自定义一个在app内 弹出消息提示框   实现步骤如下:  1.我们自定义一个view 为 STPushView 推送消息的提示框view  #imp

Android顶栏定时推送消息_Android

在用安卓设备时,经常会应用到弹出推送消息.下面在此把我之前写的推送代码分享给大家,供大家参考,有不同见解的朋友欢迎提出,共同学习进步! 最近搜索看这个的朋友比较多.这个也只是单独的内置推送.时时推送与服务器关联 我们可以用SDK云推送来实现我们所需的需求.相关介绍内容.往下移! 首先XML <!-- 安卓推送服务 --> <service android:name=".MessageService" android:enabled="true" a

ios开发:用PHP实现IOS推送

 ios推送消息是个非常有用的功能,许多应用程序都具备了这个功能,成为实时应用的数据流核心.那么我们怎么用php为ios做推送服务呢?下面本文章将为您进行详细讲解. ios消息推送机制可以参考ios消息推送机制实现与探讨. 首先,需要一个pem的证书,该证书需要与开发时签名用的一致. 具体生成pem证书方法如下: 1. 登录 iPhone Developer Connection Portal(http://developer.apple.com/iphone/manage/overview/i

ios-iOS 推送消息时直接点击桌面应用图标进入,得不到推送消息?

问题描述 iOS 推送消息时直接点击桌面应用图标进入,得不到推送消息? 推送消息的时候,点击通知的显示按钮进入应用是正常的.如果从桌面应用图标点进去 它不会调用didFinishLaunchingWithOptions方法和didReceiveRemoteNotification方法.那我就得不到它的推送内容.有人说在applicationDidBecomeActive方法里面做推送消息的响应处理,那该怎么做呢? 有没有哪位大神不吝赐教,非常感谢! 解决方案 http://www.cocoach

从.net项目(Windows Service)向Android手机发送推送消息

最近做的.net项目(Windows Service)需要向Android手机发送推送消息,真是有点困难,没有搞过就不停的搜文档,最后看到了一个开源项目PushSharp,可以在.net平台推送IOS,Android,Windows Phone等设备消息,大喜,然后先做了IOS的,成功了,但是做Android的时候遇到了问题,一直推送不成功,程序执行了,但是推送一直出不来,后来费劲的在网上搜,没有找到,最后放弃使用这种推送Android,另寻出路,随后找到了一种C2DM云端推送功能,但是问题又出

iOS点击推送消息跳到应用指定页面方法_IOS

现在的推送用的越来越频繁,几乎每个应用都开始用到了.其实又有几个用户会去看推送消息呢?没办法,产品经理最大啊,只是苦了我们这一帮程序员啊!闲话少说,进入正题.兄弟我用的是极光推送,自然是以极光推送为例了. 现在点击推送消息,有两种跳转方式:1.打开应用,跳转到应用首页:2.打开应用,跳转到指定页面. ​第一种,你什么都不用设置,只要注册极光应用就可以.这里就不写怎么注册极光应用了,可以参考官方文档,写的很详细. 第二种,重头戏来了. // APP未运行时获取通知的内容 remoteNotific

iOS 点击推送消息跳到应用指定页面的实例_IOS

iOS 点击推送消息跳到应用指定页面 现在的推送用的越来越频繁,几乎每个应用都开始用到了.其实又有几个用户会去看推送消息呢?没办法,产品经理最大啊,只是苦了我们这一帮程序员啊!闲话少说,进入正题.兄弟我用的是极光推送,自然是以极光推送为例了.   现在点击推送消息,有两种跳转方式:1.打开应用,跳转到应用首页:2.打开应用,跳转到指定页面. ​第一种,你什么都不用设置,只要注册极光应用就可以.这里就不写怎么注册极光应用了,可以参考官方文档,写的很详细. ​ 第二种,重头戏来了. // APP未运