Perl:阅读 APNS 的正确方法 error_response
Perl: proper way to read APNS error_response
我已经实现了一个 Perl 脚本,它通过 Apple 的 apns 服务发送推送通知。我在错误处理方面遇到了一些问题。根据 APNS documentation:
If the stream isn't ready for writing, see if the stream is available for reading. If it is, read everything available from the stream. If you get zero bytes back, the connection was closed because of an error such as an invalid command byte or other parsing error. If you get six bytes back, that's an error response that you can check for the response code and the ID of the notification that caused the error. You'll need to send every notification following that one again.
我也在做同样的事情。每当由于连接断开而出现写入错误时;我读了套接字。每次我从套接字中得到 6 个字节 return。这意味着 APNS 正在向我发送 error_response。根据APNS documentation的错误响应包格式如下
The packet has a command value of 8 followed by a one-byte status code and the notification identifier of the malformed notification.
我正在使用以下代码解压从套接字读取的数据:
my $hex = unpack( 'H*', $data );
print $hex;
每次,我得到相同的值 080800000000。根据 APNS 文档,第一个字节始终为 8,下一个字节将表示错误状态代码。 8 表示 "Invalid Token"。到这部分就OK了。然而,剩下的 4 个字节是标识符,总是给我 00000000。这是什么意思?
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 的响应。现在一切正常。
我已经实现了一个 Perl 脚本,它通过 Apple 的 apns 服务发送推送通知。我在错误处理方面遇到了一些问题。根据 APNS documentation:
If the stream isn't ready for writing, see if the stream is available for reading. If it is, read everything available from the stream. If you get zero bytes back, the connection was closed because of an error such as an invalid command byte or other parsing error. If you get six bytes back, that's an error response that you can check for the response code and the ID of the notification that caused the error. You'll need to send every notification following that one again.
我也在做同样的事情。每当由于连接断开而出现写入错误时;我读了套接字。每次我从套接字中得到 6 个字节 return。这意味着 APNS 正在向我发送 error_response。根据APNS documentation的错误响应包格式如下
The packet has a command value of 8 followed by a one-byte status code and the notification identifier of the malformed notification.
我正在使用以下代码解压从套接字读取的数据:
my $hex = unpack( 'H*', $data );
print $hex;
每次,我得到相同的值 080800000000。根据 APNS 文档,第一个字节始终为 8,下一个字节将表示错误状态代码。 8 表示 "Invalid Token"。到这部分就OK了。然而,剩下的 4 个字节是标识符,总是给我 00000000。这是什么意思?
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 的响应。现在一切正常。