diff --git a/.gitignore b/.gitignore index b393cfd..6cec628 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.idea/ .classpath .project .settings diff --git a/classes/artifacts/dbay_apns4j_jar/dbay-apns4j.jar b/classes/artifacts/dbay_apns4j_jar/dbay-apns4j.jar new file mode 100644 index 0000000..76f544a Binary files /dev/null and b/classes/artifacts/dbay_apns4j_jar/dbay-apns4j.jar differ diff --git a/dbay-apns4j.iml b/dbay-apns4j.iml new file mode 100644 index 0000000..9ff5beb --- /dev/null +++ b/dbay-apns4j.iml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/dbay/apns4j/IApnsCallback.java b/src/main/java/com/dbay/apns4j/IApnsCallback.java new file mode 100644 index 0000000..601982f --- /dev/null +++ b/src/main/java/com/dbay/apns4j/IApnsCallback.java @@ -0,0 +1,7 @@ +package com.dbay.apns4j; + +import com.dbay.apns4j.model.Payload; + +public interface IApnsCallback { + public void success(Payload payload); +} diff --git a/src/main/java/com/dbay/apns4j/IApnsConnection.java b/src/main/java/com/dbay/apns4j/IApnsConnection.java index 2f9bab3..ac3c950 100644 --- a/src/main/java/com/dbay/apns4j/IApnsConnection.java +++ b/src/main/java/com/dbay/apns4j/IApnsConnection.java @@ -22,7 +22,7 @@ public interface IApnsConnection extends Closeable { - public void sendNotification(String token, Payload payload); + public Boolean sendNotification(String token, Payload payload); - public void sendNotification(PushNotification notification); + public Boolean sendNotification(PushNotification notification); } diff --git a/src/main/java/com/dbay/apns4j/IApnsService.java b/src/main/java/com/dbay/apns4j/IApnsService.java index 57808fb..e48f11d 100644 --- a/src/main/java/com/dbay/apns4j/IApnsService.java +++ b/src/main/java/com/dbay/apns4j/IApnsService.java @@ -34,12 +34,15 @@ public interface IApnsService { * @param payload */ public void sendNotification(String token, Payload payload); + + public void sendNotification(String token, Payload payload, IApnsCallback callback); + /** * If you want to specify the ID of a notification, use this method * @param notification */ public void sendNotification(PushNotification notification); - + public void shutdown(); /** @@ -48,4 +51,5 @@ public interface IApnsService { * @return the device tokens which belong to the app that doesn't exist on the device. */ public List getFeedbacks(); + } diff --git a/src/main/java/com/dbay/apns4j/impl/ApnsConnectionImpl.java b/src/main/java/com/dbay/apns4j/impl/ApnsConnectionImpl.java index 7921ea2..c0b9dc5 100644 --- a/src/main/java/com/dbay/apns4j/impl/ApnsConnectionImpl.java +++ b/src/main/java/com/dbay/apns4j/impl/ApnsConnectionImpl.java @@ -114,28 +114,28 @@ public ApnsConnectionImpl(SocketFactory factory, String host, int port, int maxR } @Override - public void sendNotification(String token, Payload payload) { + public Boolean sendNotification(String token, Payload payload) { PushNotification notification = new PushNotification(); notification.setId(IDENTIFIER.incrementAndGet()); notification.setExpire(EXPIRE); notification.setToken(token); notification.setPayload(payload); - sendNotification(notification); + return sendNotification(notification); } @Override - public void sendNotification(PushNotification notification) { + public Boolean sendNotification(PushNotification notification) { byte[] plBytes = null; String payload = notification.getPayload().toString(); try { plBytes = payload.getBytes(CHARSET_ENCODING); if (plBytes.length > PAY_LOAD_MAX_LENGTH) { - logger.error("Payload execeed limit, the maximum size allowed is 256 bytes. " + payload); - return; + logger.error("Payload execeed limit, the maximum size allowed is " + PAY_LOAD_MAX_LENGTH + " bytes. " + payload); + return false; } } catch (UnsupportedEncodingException e) { logger.error(e.getMessage(), e); - return; + return false; } /** @@ -177,7 +177,7 @@ public void sendNotification(PushNotification notification) { } if (!isSuccessful) { logger.error(String.format("%s Notification send failed. %s", connName, notification)); - return; + return false; } else { logger.info(String.format("%s Send success. count: %s, notificaion: %s", connName, notificaionSentCount.incrementAndGet(), notification)); @@ -206,6 +206,8 @@ public void sendNotification(PushNotification notification) { */ startErrorWorker(); } + + return true; } private Socket createNewSocket() throws IOException, UnknownHostException { if (logger.isDebugEnabled()) { diff --git a/src/main/java/com/dbay/apns4j/impl/ApnsServiceImpl.java b/src/main/java/com/dbay/apns4j/impl/ApnsServiceImpl.java index 829da4b..f7234b5 100644 --- a/src/main/java/com/dbay/apns4j/impl/ApnsServiceImpl.java +++ b/src/main/java/com/dbay/apns4j/impl/ApnsServiceImpl.java @@ -24,6 +24,7 @@ import javax.net.SocketFactory; +import com.dbay.apns4j.IApnsCallback; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -57,7 +58,13 @@ private ApnsServiceImpl(ApnsConfig config) { connPool = ApnsConnectionPool.newConnPool(config, factory); feedbackConn = new ApnsFeedbackConnectionImpl(config, factory); } - + + private IApnsCallback callback = null; + + public void setCallback(IApnsCallback callback) { + this.callback = callback; + } + @Override public void sendNotification(final String token, final Payload payload) { service.execute(new Runnable() { @@ -77,6 +84,31 @@ public void run() { } }); } + + @Override + public void sendNotification(final String token, final Payload payload, final IApnsCallback callback) { + service.execute(new Runnable() { + @Override + public void run() { + IApnsConnection conn = null; + try { + conn = getConnection(); + Boolean success = conn.sendNotification(token, payload); + if (success && callback != null) { + callback.success(payload); + } + + } catch (Exception e) { + logger.error(e.getMessage(), e); + } finally { + if (conn != null) { + connPool.returnConn(conn); + } + } + } + }); + } + @Override public void sendNotification(final PushNotification notification) { service.execute(new Runnable() { diff --git a/src/main/java/com/dbay/apns4j/model/ApnsConstants.java b/src/main/java/com/dbay/apns4j/model/ApnsConstants.java index 5c03f84..2e1db21 100644 --- a/src/main/java/com/dbay/apns4j/model/ApnsConstants.java +++ b/src/main/java/com/dbay/apns4j/model/ApnsConstants.java @@ -40,7 +40,9 @@ public class ApnsConstants { public static final int ERROR_RESPONSE_BYTES_LENGTH = 6; - public static final int PAY_LOAD_MAX_LENGTH = 256; + // Refer: http://stackoverflow.com/a/26994198/419348 + // It is 2KB now. + public static final int PAY_LOAD_MAX_LENGTH = 2048; public static final String CHARSET_ENCODING = "UTF-8"; } diff --git a/src/main/java/com/dbay/apns4j/model/Payload.java b/src/main/java/com/dbay/apns4j/model/Payload.java index 12485da..40ffa58 100644 --- a/src/main/java/com/dbay/apns4j/model/Payload.java +++ b/src/main/java/com/dbay/apns4j/model/Payload.java @@ -35,11 +35,13 @@ public class Payload { private String sound = "default.caf"; private Integer contentAvailable; + private String alertTitle; private String alertBody; private String alertActionLocKey; private String alertLocKey; private String[] alertLocArgs; private String alertLaunchImage; + private Boolean mutableContent = false; public Map getParams() { return params; @@ -86,6 +88,7 @@ public String toString() { } else { if (getAlertBody() != null || getAlertLocKey() != null) { JSONObject alertObj = new JSONObject(); + putIntoJson("title", getAlertTitle(), alertObj); putIntoJson("body", getAlertBody(), alertObj); putIntoJson("action-loc-key", getAlertActionLocKey(), alertObj); putIntoJson("loc-key", getAlertLocKey(), alertObj); @@ -109,6 +112,9 @@ public String toString() { if (getContentAvailable() != null) { apsObj.put("content-available", getContentAvailable().intValue()); } + if (getMutableContent()) { + apsObj.put("mutable-content", 1); + } object.put(APS, apsObj); if (getParams() != null) { @@ -133,6 +139,21 @@ public static void main(String[] args) { payload.addParam("number", 12312312312L); System.out.println(payload.toString()); } + + public Boolean getMutableContent() { + return mutableContent; + } + + public void setMutableContent(Boolean mutableContent) { + this.mutableContent = mutableContent; + } + + public String getAlertTitle() { + return alertTitle; + } + public void setAlertTitle(String alertTitle) { + this.alertTitle = alertTitle; + } public String getAlertBody() { return alertBody; }