• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: WO server to connect to Apple's Push Notification Service for iOS
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: WO server to connect to Apple's Push Notification Service for iOS


  • Subject: Re: WO server to connect to Apple's Push Notification Service for iOS
  • From: Mertz Stéphan <email@hidden>
  • Date: Tue, 15 Feb 2011 22:24:55 +0100

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      (email@hidden)
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: WO server to connect to Apple's Push Notification Service for iOS
      • From: Andrew Kinnie <email@hidden>
References: 
 >WO server to connect to Apple's Push Notification Service for iOS (From: Andrew Kinnie <email@hidden>)

  • Prev by Date: Re: WO server to connect to Apple's Push Notification Service for iOS
  • Next by Date: Re: WO server to connect to Apple's Push Notification Service for iOS
  • Previous by thread: Re: WO server to connect to Apple's Push Notification Service for iOS
  • Next by thread: Re: WO server to connect to Apple's Push Notification Service for iOS
  • Index(es):
    • Date
    • Thread