Hi,

Here is the code I used some time ago:

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.UnknownHostException;
import java.security.KeyStore;
import java.util.Enumeration;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

import com.webobjects.foundation.NSData;
import com.webobjects.foundation.NSDictionary;

public class IPhonePushNotification {
    private static String staticHost = /* Apple gateway push server name */;
    private static int staticPort = /* Apple gateway push server port */;
    private static String passPhrase = * your passPhrase */;
    private static String certificateAndKey = "/Certificats/iPhoneAPS.p12";
    private static SSLSocketFactory factory = null;
    private static IPhonePushNotification iPhonePushNotification;

    public IPhonePushNotification () {
        try {
            if (new File(certificateAndKey).exists() && staticHost != null && 
staticPort != 0 && passPhrase != null) {
                try {
                    SSLContext ctx;
                    KeyManagerFactory kmf;
                    KeyStore ks;

                    ctx = SSLContext.getInstance("TLS");
                    kmf = KeyManagerFactory.getInstance("SunX509");
                    ks = KeyStore.getInstance("PKCS12");

                    ks.load(new FileInputStream(certificateAndKey), 
passPhrase.toCharArray());

                    kmf.init(ks, passPhrase.toCharArray());
                    ctx.init(kmf.getKeyManagers(), null, null);

                    factory = ctx.getSocketFactory();
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new IOException(e.getMessage());
                }
            }
        } catch (Exception e) {
             e.printStackTrace();
        }
    }

    public static IPhonePushNotification iPhonePushNotification() {
        if (iPhonePushNotification == null) {
            iPhonePushNotification = new IPhonePushNotification();
        }

        return iPhonePushNotification;
    }

    private static String getJSONMessage(String msg, NSDictionary infos) {
        StringBuffer jsonMessage = new StringBuffer("{\"aps\":{\"alert\":\"" + 
msg + "\",\"badge\":0,\"sound\":\"default\"}");

        if (infos != null && infos.count() != 0) {
            Enumeration l_enum = infos.keyEnumerator();
            while (l_enum.hasMoreElements()) {
                String l_key = (String) l_enum.nextElement();
                String l_value = (String) infos.objectForKey(l_key);

                jsonMessage.append(",\"" + l_key + "\":\"" + l_value + "\"");
            }
        }

        jsonMessage.append("}");

        return jsonMessage.toString();
    }

    public synchronized void sendMessage(String msg, NSDictionary infos, NSData 
deviceToken) {
        if (factory != null) {
            SSLSocket socket;

            try {
                socket = (SSLSocket) factory.createSocket(staticHost, 
staticPort);
                socket.startHandshake();
                sendMessage(socket, getJSONMessage(msg, infos), deviceToken);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private synchronized static void sendMessage(SSLSocket sock, String msg, 
NSData deviceToken) throws Exception{
         OutputStream sos = sock.getOutputStream();
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         DataOutputStream dos = new DataOutputStream(bos);
         dos.writeByte(0); // 1 byte command

         byte[] binaryDeviceID = deviceToken.bytes();

         byte [] token = binaryDeviceID;
         dos.writeShort(token.length); // 2 byte token length
         dos.write(token); // token
         byte [] payload = msg.getBytes("UTF-8");
         dos.writeShort(payload.length); // 2 byte msg length
         dos.write(payload); // payload

         byte [] output = bos.toByteArray();

         sos.write(output);
         sock.close();
    }
}


Example of use with WO:
            while (l_usersEnum.hasMoreElements()) {
                 EOUser l_user = (EOUser) l_usersEnum.nextElement();

                 if (l_user.parameterValueForKey("deviceToken") != null) {
                     if (l_passageCreation && 
Utils.booleanValueOf(l_user.parameterValueForKey("pushPassageCreation"))) {
                         final NSDictionary infos = new NSDictionary(
                                 new Object[] { l_pssg.valueForKey("pssgID"), 
l_user.parameterValueForKey("pushServer") },
                                 new Object[] { "pssgID", "server_name" });
                         final String msg = 
localizer().localizedStringForKeyWithDefault("A record was created");
                         final NSData deviceToken = (NSData) 
l_user.parameterValueForKey("deviceToken");

                         new Thread(new Runnable() {
                             public void run() {
                                 
IPhonePushNotification.iPhonePushNotification().sendMessage(msg, infos, 
deviceToken);
                             }
                         }).start();
                     } else if (l_passageCreation == false
                             && 
Utils.booleanValueOf(l_user.parameterValueForKey("pushPassageUpdate"))
                             && l_pssg.userMedecinDuDossier() == l_user) {
                         final NSDictionary infos = new NSDictionary(
                                 new Object[] { l_pssg.valueForKey("pssgID"), 
l_user.parameterValueForKey("pushServer") },
                                 new Object[] { "pssgID", "server_name" });
                         final String msg = 
localizer().localizedStringForKeyWithDefault("A record was modified");
                         final NSData deviceToken = (NSData) 
l_user.parameterValueForKey("deviceToken");

                         new Thread(new Runnable() {
                             public void run() {
                                 
IPhonePushNotification.iPhonePushNotification().sendMessage(msg, infos, 
deviceToken);
                             }
                         }).start();
                     }
                 }
             }


Le 15 févr. 2011 à 20:43, Andrew Kinnie a écrit :

> Greetings all,
> 
> As I am now an iOS developer (as well as a part time WO developer), and my 
> new employer has decided to build a server to handle the iOS push 
> notifications, I thought perhaps building such a thing based on WebObjects 
> might be worth considering.
> 
> Has anyone used WebObjects to create a server to handle the APNs calls?  
> (i.e. - I think - communications from the device with the token to the 
> server, then handle the pushes to the Apple server with the data and relevant 
> devices)  It seems comparatively simple, but I thought I'd ask.  There was a 
> short thread (4 messages) a little over a year ago about this, referencing 
> http://code.google.com/p/javapns/ and suggesting a component using it be 
> included in Wonder, but I have not seen anything else.
> 
> Any thought?  Suggestions?  etc?
> 
> Thanks in advance
> 
> Andrew 
> 
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/webobjects-dev/s.mertz%40improve.fr
> 
> This email sent to s.me...@improve.fr

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to