Perl:读取 APNS error_response 的正确方法

Posted

技术标签:

【中文标题】Perl:读取 APNS error_response 的正确方法【英文标题】:Perl: proper way to read APNS error_response 【发布时间】:2015-09-11 00:29:41 【问题描述】:

我已经实现了一个通过 Apple 的 apns 服务发送推送通知的 Perl 脚本。我在错误处理方面遇到了一些问题。根据APNS documentation:

如果流尚未准备好写入,请查看流是否可用于读取。如果是,请从流中读取所有可用的内容。如果返回零字节,则连接因错误(例如无效的命令字节或其他解析错误)而关闭。如果您返回六个字节,这是一个错误响应,您可以检查响应代码和导致错误的通知的 ID。您需要再次发送该通知之后的所有通知。

我也在做同样的事情。每当由于连接断开而出现写入错误时;我读了套接字。每次我从套接字返回 6 个字节。意思是 APNS 正在向我发送一个 error_response。 APNS documentation的错误响应包格式如下

数据包的命令值为 8,后跟一个字节的状态代码和格式错误通知的通知标识符。

我正在使用下面的代码来解压从套接字读取的数据:

my $hex = unpack( 'H*', $data );
print $hex;

每次,我得到相同的值 080800000000。根据 APNS 文档,第一个字节将始终为 8,下一个字节将代表错误状态代码。 8 表示“无效令牌”。到这部分为止还可以。但是,剩下的 4 个字节是标识符,总是给我 00000000。这是什么意思?

【问题讨论】:

【参考方案1】:

APNS 有两种不同的推送通知格式,简单通知格式和增强通知格式。简单通知格式没有指定消息 ID(通知标识符)的字段。我使用 Perl 模块(Net::APNS::Persistent)与 APNS 通信;仅支持简单通知格式。这就是为什么我总是在通知标识符部分得到 00000000。我更新了模块的代码以使用增强格式:

pack(
        'cNNnH*na*',                   # format
        1,                             # command
        $id,                           # Notification identifier
        0,                             # expiry timestamp
        32,                            # token length
        $devicetoken,                  # token
        length $json,                  # payload length
        $json                          # payload
    );

然后,为了阅读响应,我使用了以下消息格式:

my($c,$status,$identifier) = unpack('ccN',$error);

其中 $error 是来自 APNS 的响应。现在一切正常。

【讨论】:

我是 Net::APNS::Persistent 的作者,几年不用这个模块我又要开始使用了,所以我改用增强版通知格式尽快推送到CPAN。 很高兴知道您决定再次更新它。我们正在使用您的模块并进行了一些修复。如果有帮助,我们将很乐意与您分享我们的修复。请告诉我。

以上是关于Perl:读取 APNS error_response 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

perl tk将界面输入的汉字不能输出到读取的EXCEL表格

Apple 推送通知服务 (APNS):反馈服务响应缺少字节?

上传 APNS 证书 Firebase 的问题

Perl 中的简单文件读取

在 Perl 中打开和读取文件的最佳方法是啥?

用 CGI 在 perl 中读取文件?