新命令2 Apple推送通知不发送多个警报

时间:2013-09-30 14:28:07

标签: ios command apple-push-notifications push

我正在尝试实施新的命令2'在Java中推送通知,并且无法推送多个警报。第一个警报已成功推送。如果您能发现此代码的任何问题,请提供帮助

Apple规格 https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW1

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

3 个答案:

答案 0 :(得分:1)

看起来您正在向bao写一个通知,那么为什么您希望它推送多个警报?如果要推送多个警报,则必须重复多次写入bao的字节序列。

答案 1 :(得分:1)

命令2和帧数据长度适用于每条消息。如果您在一个连接中发送多条消息,则对于每条消息:发送命令2,消息的帧数据长度,以及5部分(令牌,有效负载,ID,到期,优先级)

答案 2 :(得分:0)

由于您从APNS返回错误代码,因此应在此时删除连接,APNS将忽略错误后的所有内容。当您收到错误时,标识符是您当前使用随机数的标识符。

这里没有简单的解决方案 - 您必须重新构建您拥有的内容,以便在收到错误后,您可以在该点之后找出所有内容并重新发送 - 我建议使用序列号作为标识符,然后将数据包存储在您定期清除的队列中(您必须保留它们30秒才能保证Apple接受它们)。