【问题标题】:Perl: proper way to read APNS error_responsePerl:读取 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。这是什么意思?

【问题讨论】:

    标签: perl apple-push-notifications


    【解决方案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。
    • 很高兴知道您决定再次更新它。我们正在使用您的模块并进行了一些修复。如果有帮助,我们将很乐意与您分享我们的修复。请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    相关资源
    最近更新 更多