【问题标题】:New Command 2 Apple Push Notification Not sending multiple alerts新命令 2 Apple 推送通知不发送多个警报
【发布时间】:2015-06-04 05:35:59
【问题描述】:

我正在尝试在 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 };
}

【问题讨论】:

  • 为什么不直接使用已经实现 APNS 功能的库,例如 code.google.com/p/javapns
  • 他们没有实现这个。我检查了源代码。
  • 我不久前用 javaapns 代码进行了测试,它确实有效...我将自己的实现基于我在那里看到的一些内容...虽然实现本身并不能满足我的特殊需求.
  • Javaapns 适用于旧命令(0 和 1),但尚未实现新命令 - 2
  • Javapns 没有实现命令 2。

标签: ios command apple-push-notifications push


【解决方案1】:

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

【讨论】:

  • 感谢您的检查。我有一个外部循环多次调用这段代码。 outputStream 保持打开状态。
  • @user2831513 您是否尝试从套接字读取错误响应?您可能发送了无效的设备令牌(如果您发送的第二个通知具有无效令牌,它将解释为什么只发送第一个)。
  • 是的,我得到错误代码 8(无效令牌),但令牌有效。如果我交换令牌,只有第一个设备得到推送。
  • 您确定您根据通知标识符识别了 8 错误响应所指的无效设备令牌吗?由于您似乎没有将标识符存储在任何地方(您只是将random.nextInt() 写入字节数组),您怎么知道哪个设备令牌无效?
  • 我同意.. 问题是我不知道是什么导致了错误。他们是我创建框架的方式还是我编写字节的方式?不确定
【解决方案2】:

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

【讨论】:

  • 帧长是否需要32位无符号大端?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    相关资源
    最近更新 更多