2

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

苹果规格 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 };
}
4

3 回答 3

1

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

于 2014-02-20T22:09:33.307 回答
1

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

于 2013-09-30T14:44:06.527 回答
0

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

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

于 2013-09-30T21:21:05.770 回答