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;
}