我正在尝试实施新的命令2'在Java中推送通知,并且无法推送多个警报。第一个警报已成功推送。如果您能发现此代码的任何问题,请提供帮助
for (DeviceApps deviceApps : deviceAppsList) {
outputStream.write(getByteArray(deviceApps, pushAlert));
}
private byte[] getByteArray(DeviceApps deviceApps, PushAlert pushAlert) {
ByteArrayOutputStream dataBao = new ByteArrayOutputStream();
// Write the TokenLength as a 16bits unsigned int, in big endian
dataBao.write((byte)1);
dataBao.write(intTo2ByteArray(32));
dataBao.write(deviceTokenAsBytes);
// Write the PayloadLength as a 16bits unsigned int, in big endian
dataBao.write((byte)2);
dataBao.write(intTo2ByteArray(payLoadAsBytes.length));
dataBao.write(payLoadAsBytes);
// 4 bytes. Notification identifier
dataBao.write((byte)3);
dataBao.write(intTo2ByteArray(4));
dataBao.write(intTo4ByteArray(random.nextInt()));
// 4 bytes Expiration date
dataBao.write((byte)4);
dataBao.write(intTo2ByteArray(4));
dataBao.write(intTo4ByteArray(pushAlert.getUtcExpireTime()));
LOG.error("UtcExpireTime="+ pushAlert.getUtcExpireTime());
// 1 bytes Priority
dataBao.write((byte)5);
dataBao.write(intTo2ByteArray(1));
dataBao.write((byte)10);
//Frame Info
bao = new ByteArrayOutputStream();
bao.write((byte)2);
byte [] data = dataBao.toByteArray();
bao.write(intTo4ByteArray(data.length));
LOG.error(" data.length "+data.length);
bao.write(data);
return bao.toByteArray();
}
Support Methods
private static final byte[] intTo4ByteArray(int value) {
return ByteBuffer.allocate(4).putInt(value).array();
}
private static final byte[] intTo2ByteArray(int value) {
int s1 = (value & 0xFF00) >> 8;
int s2 = value & 0xFF;
return new byte[] { (byte) s1, (byte) s2 };
}
答案 0 :(得分:1)
看起来您正在向bao
写一个通知,那么为什么您希望它推送多个警报?如果要推送多个警报,则必须重复多次写入bao
的字节序列。
答案 1 :(得分:1)
命令2和帧数据长度适用于每条消息。如果您在一个连接中发送多条消息,则对于每条消息:发送命令2,消息的帧数据长度,以及5部分(令牌,有效负载,ID,到期,优先级)
答案 2 :(得分:0)
由于您从APNS返回错误代码,因此应在此时删除连接,APNS将忽略错误后的所有内容。当您收到错误时,标识符是您当前使用随机数的标识符。
这里没有简单的解决方案 - 您必须重新构建您拥有的内容,以便在收到错误后,您可以在该点之后找出所有内容并重新发送 - 我建议使用序列号作为标识符,然后将数据包存储在您定期清除的队列中(您必须保留它们30秒才能保证Apple接受它们)。