gpt4 book ai didi

php - Apple 推送服务器不工作,由单个 token 引起

转载 作者:搜寻专家 更新时间:2023-10-30 20:17:39 26 4
gpt4 key购买 nike

我为我的应用程序创建了一个推送通知服务器。该服务器在测试和生产中运行良好。我创建了一个 API,它可以接收序列化的设备 token 数组。这个 API 是用 PHP 创建的,对 API 的调用也是 PHP。这是数组:

  'devices' => serialize(array(
//'aaaaaa',
'bbbbb',
'ccccc'
)),

当然,出于安全原因,真正的标记被占位符所取代。我有一个 token 搞砸了其他 token 的推送通知。当我在数组中禁用此 token 时(在本例中为 aaaaa),其他 2 个设备会收到 token 。当我启用 aaaa token 时,根本不会发送任何推送通知。

API 端发送实际推送:

 foreach($devices as $device) {
$msg = chr(0) . pack('n', 32) . pack('H*', $device) . pack('n', strlen($payload)) . $payload;
$result = fwrite($fp, $msg, strlen($msg));
}

当然,上面的代码中缺少一些变量解释,但是在没有 token aaa 的情况下这工作正常,所以这不应该是问题。

有人知道为什么一个错误的 token 会搞砸有效 token 的推送吗?


编辑:我现在使用 APNS 的增强方法,使用以下代码:

$error = false;
foreach($devices as $deviceToken) {
$msg = pack("C", 1) . pack("N", $deviceToken) . pack("N", time() + 86400) . pack("n", 32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n", strlen($payload)) . $payload;
fwrite($fp, $msg);
$error = $this->checkAppleErrorResponse($fp);

debug($error);
}

还有 checkAppleErrorResponse 函数:

function checkAppleErrorResponse($fp) {

$apple_error_response = fread($fp, 6);

if ($apple_error_response) {

$error_response = unpack('Ccommand/Cstatus_code/Nidentifier', $apple_error_response);

if ($error_response['status_code'] == '0') {
$error_response['status_code'] = '0-No errors encountered';
} else if ($error_response['status_code'] == '1') {
$error_response['status_code'] = '1-Processing error';
} else if ($error_response['status_code'] == '2') {
$error_response['status_code'] = '2-Missing device token';
} else if ($error_response['status_code'] == '3') {
$error_response['status_code'] = '3-Missing topic';
} else if ($error_response['status_code'] == '4') {
$error_response['status_code'] = '4-Missing payload';
} else if ($error_response['status_code'] == '5') {
$error_response['status_code'] = '5-Invalid token size';
} else if ($error_response['status_code'] == '6') {
$error_response['status_code'] = '6-Invalid topic size';
} else if ($error_response['status_code'] == '7') {
$error_response['status_code'] = '7-Invalid payload size';
} else if ($error_response['status_code'] == '8') {
$error_response['status_code'] = '8-Invalid token';
} else if ($error_response['status_code'] == '255') {
$error_response['status_code'] = '255-None (unknown)';
} else {
$error_response['status_code'] = $error_response['status_code'].'-Not listed';
}

echo 'Response Command:<b>' . $error_response['command'] . '</b>&nbsp;&nbsp;&nbsp;Identifier:<b>' . $error_response['identifier'] . '</b>&nbsp;&nbsp;&nbsp;Status:<b>' . $error_response['status_code'] . '</b><br>';

echo 'Identifier is the rowID (index) in the database that caused the problem, and Apple will disconnect you from server. To continue sending Push Notifications, just start at the next rowID after this Identifier.<br>';

return true;
}

return false;
}

仅发送有效 token ,$numchanged 为 0。发送无效 token ,然后发送有效 token ,两种情况下 $numchanged 均为 1。

最佳答案

您正在使用简单的二进制格式向 Apple 发送推送通知(以 0 字节开头)。使用这种格式,Apple 永远不会返回任何响应,但是当 APNS 服务器遇到错误的通知(通常由无效的设备 token 引起,但也有其他错误类型,例如有效负载太长)时,它会关闭连接。 Apple 不会处理在错误消息之后发送的任何消息。在这种情况下,您必须打开一个新连接并重新发送其他消息。

如果您切换到更高级的格式(以 1 字节或 2 字节开头),Apple 会在关闭连接之前向您发送错误响应,如果您设法阅读该响应,您就会知道错误的类型(例如 8 表示无效 token )和错误消息的标识符。这让您知道哪条消息有问题,因此会告诉您需要重新发送哪些消息(错误消息之后的所有消息)。

阅读更多相关信息 herehere .

当您使用增强格式时,请确保为您发送的每条通知提供唯一的消息 ID。这是您将在错误响应中从 Apple 获得的 ID,因此它必须是唯一的,以便您能够识别无效通知。

关于php - Apple 推送服务器不工作,由单个 token 引起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23654866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com