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 protected])
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/webobjects-dev/s.mertz%40improve.fr
>
> This email sent to [email protected]
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com
This email sent to [email protected]