Skip to content

Commit c32bfb9

Browse files
author
Javen
committed
Add payload length checking methods.
1 parent 7f2859d commit c32bfb9

File tree

6 files changed

+107
-8
lines changed

6 files changed

+107
-8
lines changed

src/cn/jpush/api/push/model/PushPayload.java

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package cn.jpush.api.push.model;
22

33
import cn.jpush.api.push.model.audience.Audience;
4+
import cn.jpush.api.push.model.notification.AndroidNotification;
5+
import cn.jpush.api.push.model.notification.IosNotification;
46
import cn.jpush.api.push.model.notification.Notification;
7+
import cn.jpush.api.push.model.notification.PlatformNotification;
58

69
import com.google.common.base.Preconditions;
710
import com.google.gson.Gson;
811
import com.google.gson.JsonElement;
912
import com.google.gson.JsonObject;
13+
import com.google.gson.JsonPrimitive;
1014

1115
/**
1216
* The object you should build for sending a push.
@@ -23,7 +27,10 @@ public class PushPayload implements PushModel {
2327
private static final String NOTIFICATION = "notification";
2428
private static final String MESSAGE = "message";
2529
private static final String OPTIONS = "options";
26-
30+
31+
private static final int MAX_GLOBAL_ENTITY_LENGTH = 1200; // Definition acording to JPush Docs
32+
private static final int MAX_IOS_PAYLOAD_LENGTH = 220; // Definition acording to JPush Docs
33+
2734
private static Gson _gson = new Gson();
2835

2936
private final Platform platform;
@@ -114,9 +121,52 @@ public JsonElement toJSON() {
114121
if (null != options) {
115122
json.add(OPTIONS, options.toJSON());
116123
}
124+
117125
return json;
118126
}
119127

128+
public boolean isGlobalExceedLength() {
129+
int messageLength = 0;
130+
JsonObject payload = (JsonObject) this.toJSON();
131+
if (payload.has(MESSAGE)) {
132+
JsonObject message = payload.getAsJsonObject(MESSAGE);
133+
messageLength = message.toString().getBytes().length;
134+
}
135+
if (!payload.has(NOTIFICATION)) {
136+
// only mesage
137+
return messageLength > MAX_GLOBAL_ENTITY_LENGTH;
138+
} else {
139+
JsonObject notification = payload.getAsJsonObject(NOTIFICATION);
140+
if (notification.has(AndroidNotification.NOTIFICATION_ANDROID)) {
141+
JsonObject android = notification.getAsJsonObject(AndroidNotification.NOTIFICATION_ANDROID);
142+
int androidLength = android.toString().getBytes().length;
143+
return (androidLength + messageLength) > MAX_GLOBAL_ENTITY_LENGTH;
144+
}
145+
}
146+
return false;
147+
}
148+
149+
public boolean isIosExceedLength() {
150+
JsonObject payload = (JsonObject) this.toJSON();
151+
if (payload.has(NOTIFICATION)) {
152+
JsonObject notification = payload.getAsJsonObject(NOTIFICATION);
153+
if (notification.has(IosNotification.NOTIFICATION_IOS)) {
154+
JsonObject ios = notification.getAsJsonObject(IosNotification.NOTIFICATION_IOS);
155+
return ios.toString().getBytes().length > MAX_IOS_PAYLOAD_LENGTH;
156+
} else {
157+
if (notification.has(PlatformNotification.ALERT)) {
158+
String alert = notification.get(PlatformNotification.ALERT).getAsString();
159+
JsonObject ios = new JsonObject();
160+
ios.add("alert", new JsonPrimitive(alert));
161+
return ios.toString().getBytes().length > MAX_IOS_PAYLOAD_LENGTH;
162+
} else {
163+
// No iOS Payload
164+
}
165+
}
166+
}
167+
return false;
168+
}
169+
120170
@Override
121171
public String toString() {
122172
return _gson.toJson(toJSON());

src/cn/jpush/api/push/model/notification/AndroidNotification.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import com.google.gson.JsonPrimitive;
1010

1111
public class AndroidNotification extends PlatformNotification {
12-
private static final String NOTIFICATION_ANDROID = "android";
12+
public static final String NOTIFICATION_ANDROID = "android";
1313

1414
private static final String TITLE = "title";
1515
private static final String BUILDER_ID = "builder_id";

src/cn/jpush/api/push/model/notification/IosNotification.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,15 @@
22

33
import java.util.Map;
44

5-
import cn.jpush.api.push.model.notification.AndroidNotification.Builder;
6-
75
import com.google.common.base.Preconditions;
86
import com.google.common.collect.ImmutableMap;
97
import com.google.gson.JsonElement;
108
import com.google.gson.JsonObject;
119
import com.google.gson.JsonPrimitive;
1210

1311
public class IosNotification extends PlatformNotification {
14-
private static final String NOTIFICATION_IOS = "ios";
15-
12+
public static final String NOTIFICATION_IOS = "ios";
13+
1614
private static final String DEFAULT_SOUND = "";
1715
private static final int BADGE_UNDEFINED = -1;
1816
private static final int DEFAULT_BADGE = 1;

src/cn/jpush/api/push/model/notification/PlatformNotification.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public JsonElement toJSON() {
5656
if (null != extras || null != numberExtras || null != booleanExtras) {
5757
json.add(EXTRAS, extrasObject);
5858
}
59-
59+
6060
return json;
6161
}
6262

test/cn/jpush/api/push/model/OptionsTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package cn.jpush.api.push.model;
22

3-
43
import org.junit.Assert;
54
import org.junit.Test;
65

test/cn/jpush/api/push/model/PushPayloadTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import cn.jpush.api.common.ServiceHelper;
77
import cn.jpush.api.push.model.audience.Audience;
8+
import cn.jpush.api.push.model.notification.IosNotification;
89
import cn.jpush.api.push.model.notification.Notification;
910

1011
import com.google.gson.JsonObject;
@@ -97,7 +98,58 @@ public void testMessage() {
9798

9899
Assert.assertEquals("", json, payload.toJSON());
99100
}
101+
102+
@Test
103+
public void testGlobalExceed() {
104+
PushPayload payload = PushPayload.newBuilder()
105+
.setPlatform(Platform.all())
106+
.setAudience(Audience.all())
107+
.setMessage(Message.content(LONG_TEXT_2))
108+
.build();
109+
Assert.assertTrue("Should exceed", payload.isGlobalExceedLength());
110+
}
100111

112+
@Test
113+
public void testIosExceed() {
114+
PushPayload payload = PushPayload.newBuilder()
115+
.setPlatform(Platform.all())
116+
.setAudience(Audience.all())
117+
.setNotification(Notification.alert(LONG_TEXT_1))
118+
.build();
119+
Assert.assertTrue("Should exceed", payload.isIosExceedLength());
120+
}
121+
122+
@Test
123+
public void testIosExceed2() {
124+
PushPayload payload = PushPayload.newBuilder()
125+
.setPlatform(Platform.all())
126+
.setAudience(Audience.all())
127+
.setNotification(Notification.newBuilder().addPlatformNotification(
128+
IosNotification.alert(LONG_TEXT_1)).build())
129+
.build();
130+
Assert.assertTrue("Should exceed", payload.isIosExceedLength());
131+
}
132+
133+
134+
135+
136+
private static final String LONG_TEXT_1 = ""
137+
+ "极光推送,使得开发者可以即时地向其应用程序的用户推送通知或者消息,"
138+
+ "与用户保持互动,从而有效地提高留存率,提升用户体验。平台提供整合了Android推送、iOS推送的统一推送服务。";
139+
private static final String LONG_TEXT_2 = ""
140+
+ "通过极光推送服务,主动、及时地向您的用户发起交互,向其推送聊天消息、日程提醒、活动预告、进度提示、动态更新等。"
141+
+ "精准的目标用户和有价值的推送内容可以提升用户忠诚度,提高留存率与收入。"
142+
+ "客户端 SDK 采用自定义的协议保持长连接,电量、流量消耗都很少。 "
143+
+ "服务端先进技术架构,高并发可扩展性的云服务,经受过几亿用户的考验,"
144+
+ "完全省去应用开发者自己维护长连接的设备和人力的成本投入。"
145+
+ "简单的SDK集成方式,使开发商可以快速部署,更专注主营业务。灵活的推送入接入,"
146+
+ "同时支持网站上直接推送,也提供 消息推送和送达统计的 API调用。 "
147+
+ "清晰的统计图表,直观的跟踪推送带来的效果。"
148+
+ "下载并集成 SDK 接入极光推送服务。极光推送提供了 Android,iOS,Windows Phone以及 PhoneGap 的客户端 SDK。"
149+
+ "同时也开放多种语言实现的服务端 SDK,方便开发者调用 API 进行推送。"
150+
+ "本 Wiki 是极光推送 (JPush) 产品的开发者文档网站。"
151+
+ "极光推送所有技术文档都在本 Wiki 里,没有别的提供渠道。同时,我们也在不断地补充、完善文档。"
152+
+ "这些文档包括这样几种类型:常见问题、入门指南、API定义、教程等。";
101153
}
102154

103155

0 commit comments

Comments
 (0)