本篇文章给大家谈谈系统推送集成教程(十三):本地与远程通知编程详解,以及对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
Legacy Notification Format - Legacy通知格式
新开发应使用现代格式连接到APN,如与APN 通信中所述。
这些格式不包括优先级;假设优先级为10。
图B-1 显示了这种格式。
图B-1 传统通知格式传统格式中的第一个字节是命令值0(零)。其他字段与增强格式相同。清单B-1 给出了一个函数示例,该函数使用旧通知格式通过二进制接口向APN 发送远程通知。此示例假设之前有到gateway.push.apple.com(或gateway.sandbox.push.apple.com)的SSL 连接和对等交换验证。
//清单B-1 通过二进制接口以旧格式发送通知
static bool sendPayload(SSL *sslPtr, char *deviceTokenBinary, char *payloadBuff, size_t PayloadLength)
{
布尔rtn=false;
if (sslPtr deviceTokenBinary PayloadBuff PayloadLength)
{
uint8_t 命令=0; /* 命令号*/
char binaryMessageBuff[sizeof(uint8_t) + sizeof(uint16_t) +
DEVICE_BINARY_SIZE + sizeof(uint16_t) + MAXPAYLOAD_SIZE];
/* 消息格式为|COMMAND|TOKENLEN|TOKEN|PAYLOADLEN|PAYLOAD| */
char *binaryMessagePt=binaryMessageBuff;
uint16_t networkOrderTokenLength=htons(DEVICE_BINARY_SIZE);
uint16_t networkOrderPayloadLength=htons(payloadLength);
/* 命令*/
*binaryMessagePt++=命令;
/* 令牌长度网络顺序*/
memcpy(binaryMessagePt, networkOrderTokenLength, sizeof(uint16_t));
binaryMessagePt +=sizeof(uint16_t);
/* 设备令牌*/
memcpy(binaryMessagePt, deviceTokenBinary, DEVICE_BINARY_SIZE);
binaryMessagePt +=DEVICE_BINARY_SIZE;
/* 负载长度网络顺序*/
memcpy(binaryMessagePt, networkOrderPayloadLength, sizeof(uint16_t));
binaryMessagePt +=sizeof(uint16_t);
/*有效负载*/
memcpy(binaryMessagePt,payloadBuff,payloadLength);
binaryMessagePt +=有效负载长度;
如果(SSL_write(sslPtr,binaryMessageBuff,(binaryMessagePt-binaryMessageBuff))0)
rtn=真;
}
返回rtn;
}
Enhanced Notification Format - 增强的通知格式
与旧格式相比,增强格式有多项改进:
Error response - 错误响应。使用旧格式,如果您发送的通知数据包在某种程度上存在格式错误(例如,有效负载超出指定的限制),APN 会通过切断连接来响应。它没有说明为什么拒绝该通知。增强格式允许提供商使用任意标识符标记通知。如果出现错误,APN 将返回一个将错误代码与标识符关联起来的数据包。此响应使提供商能够找到并纠正格式错误的通知。
Notification expiration - 通知到期。 APN 具有存储转发功能,可将最新通知发送到设备上的应用程序。如果设备在交付时处于离线状态,APN 将在设备下次上线时发送通知。使用旧格式,无论通知的相关性如何,都会发送通知。换句话说,随着时间的推移,通知会变得“陈旧”。增强格式包括指示通知有效时间的到期值。当此期限到期时,APN 会删除存储转发中的通知。
通知报文格式如图B-2所示。
图B-2 增强型通知格式通知格式中第一个字节为命令值1,其余字段如下:
Identifier - 标识符- 标识此通知的任何值。如果APN 无法解释该通知,则会在错误响应数据包中返回相同的标识符。
Expiry - 到期- 以秒为单位的固定UNIX 纪元日期(UTC),用于标识通知何时不再有效并可以被丢弃。过期值使用网络字节顺序(大端)。如果过期值非零,APN 会尝试至少传递一次通知。指定零以请求APN 根本不存储通知。
Token length - 令牌长度- 设备令牌网络序列的长度(即大端)
Device token - 设备令牌- 二进制形式的设备令牌。
Payload length - 有效负载长度- 网络顺序中有效负载的长度(即大端字节序)。有效负载不得超过256 字节,且不得以null 终止。
Payload - 有效负载- 通知负载。
清单B-2 在将远程通知发送到APN 之前以增强格式编写远程通知。它假定与gateway.push.apple.com(或gateway.sandbox.push.apple.com)的首选SSL 连接和对等交换验证。
//清单B-2 通过二进制接口以增强格式发送通知
static bool sendPayload(SSL *sslPtr, char *deviceTokenBinary, char *payloadBuff, size_t PayloadLength)
{
布尔rtn=false;
if (sslPtr deviceTokenBinary PayloadBuff PayloadLength)
{
uint8_t 命令=1; /* 命令号*/
char binaryMessageBuff[sizeof(uint8_t) + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint16_t) +
DEVICE_BINARY_SIZE + sizeof(uint16_t) + MAXPAYLOAD_SIZE];
/* 消息格式为|COMMAND|ID|EXPIRY|TOKENLEN|TOKEN|PAYLOADLEN|PAYLOAD| */
char *binaryMessagePt=binaryMessageBuff;
uint32_t whicheverOrderIWantToGetBackInAErrorResponse_ID=1234;
uint32_t networkOrderExpiryEpochUTC=htonl(时间(NULL)+86400); //如果1 天内未送达,则消息过期
uint16_t networkOrderTokenLength=htons(DEVICE_BINARY_SIZE);
uint16_t networkOrderPayloadLength=htons(payloadLength);
/* 命令*/
*binaryMessagePt++=命令;
/* 提供商偏好排序ID */
memcpy(binaryMessagePt, whicheverOrderIWantToGetBackInAErrorResponse_ID, sizeof(uint32_t));
binaryMessagePt +=sizeof(uint32_t);
/* 网络订单到期日*/
memcpy(binaryMessagePt, networkOrderExpiryEpochUTC, sizeof(uint32_t));
binaryMessagePt +=sizeof(uint32_t);
/* 令牌长度网络顺序*/
memcpy(binaryMessagePt, networkOrderTokenLength, sizeof(uint16_t));
binaryMessagePt +=sizeof(uint16_t);
/* 设备令牌*/
memcpy(binaryMessagePt, deviceTokenBinary, DEVICE_BINARY_SIZE);
binaryMessagePt +=DEVICE_BINARY_SIZE;
/* 负载长度网络顺序*/
memcpy(binaryMessagePt, networkOrderPayloadLength, sizeof(uint16_t));
binaryMessagePt +=sizeof(uint16_t);
/*有效负载*/
memcpy(binaryMessagePt,payloadBuff,payloadLength);
binaryMessagePt +=有效负载长度;
如果(SSL_write(sslPtr,binaryMessageBuff,(binaryMessagePt-binaryMessageBuff))0)
rtn=真;
}
返回rtn;
文章分享结束,系统推送集成教程(十三):本地与远程通知编程详解和的答案你都知道了吗?欢迎再次光临本站哦!
【系统推送集成教程(十三):本地与远程通知编程详解】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
想了解 Legacy 信息如何被整合进通知系统!
有10位网友表示赞同!
这篇帖子能帮我学习如何处理 legacy 数据,让我更好地构建自动化流程吗?
有15位网友表示赞同!
看起来很有用,一直想弄懂如何把旧数据和新技术结合运用。
有14位网友表示赞同!
对于开发本地和远程通知的系统, Legacy 信息的处理问题的确很重要。
有13位网友表示赞同!
学习系统的集成一直是我关注的点,这篇指南应该可以让我有所收获!
有14位网友表示赞同!
希望这篇指南能详细介绍如何处理 Legacy 信息带来的挑战,期待阅读!
有20位网友表示赞同!
我遇到过一些 Legacy 信息与新系统兼容性的问题,想看看这里有没有解决方案。
有5位网友表示赞同!
系统集成过程中 Legacy 信息的处理确实很有学问!
有10位网友表示赞同!
感谢作者分享这篇文章!希望能够对我的项目有所帮助。
有15位网友表示赞同!
远程通知和 Legacy 信息的结合,是一个比较新的概念,期待深入了解。
有16位网友表示赞同!
我一直在学习系统开发方面的知识,这篇指南正好可以补充我的学习内容。
有7位网友表示赞同!
Legacy 信息的编程指南,非常有针对性! 希望能详细介绍不同场景下的处理方法。
有14位网友表示赞同!
系统集成是一门博大精深的学问,这篇指南应该能够为我在学习上提供一些启发。
有15位网友表示赞同!
我正在尝试将 Legacy 代码与新系统整合,这篇文章正好能帮助我了解相关技术!
有17位网友表示赞同!
Local 和 Remote 通知系统的集成有很多细节需要注意, Legacy 信息的处理尤其重要。
有16位网友表示赞同!
系统集成中 Legacy 信息的处理是个重要的环节,这篇指南应该可以帮我解决一些实际问题。
有10位网友表示赞同!
文章内容看起来很丰富,期待了解更多关于 Legacy 信息处理方面的知识。
有19位网友表示赞同!
感谢作者分享这么有 value 的技术文档!
有7位网友表示赞同!