首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP iOS 推送简易版:可直接通过 GET 参数控制的 APNs 测试脚本

     編輯:PHP 綜合知識

使用场景

快速验证证书、Token、网络连通性,或作为简单的内部测试工具。通过 URL 参数传递消息、角标、声音,无需修改代码即可发送不同内容。

完整代码 push.php

<?php
// ===== 配置区 (请修改为你的实际值) =====
$apnsCert   = 'ck.pem';                    // 证书文件路径
$passphrase = '123456';                    // 证书密码
$serverUrl  = 'ssl://gateway.sandbox.push.apple.com:2195'; // 沙箱环境
// 生产环境改为: ssl://gateway.push.apple.com:2195
// =======================================

// 从 GET 参数获取,提供默认值
$deviceToken = $_GET['token'] ?? 'a8fcd4aa8943b223d4ebcd54fe168a8b99b3f24c63dbc0612db25a8c0a588675';
$message     = $_GET['message'] ?? 'hello!';
$badge       = (int)($_GET['badge'] ?? 2);
$sound       = $_GET['sound'] ?? 'default';

// 校验 Token 格式
if (!preg_match('/^[0-9a-f]{64}$/i', $deviceToken)) {
    die('错误: deviceToken 必须为 64 位十六进制字符串,且不含空格');
}

// 构建 Payload
$body = [
    'aps' => [
        'alert' => $message,
        'badge' => $badge,
        'sound' => $sound,
    ],
];
$payload = json_encode($body, JSON_UNESCAPED_UNICODE);

// 创建 SSL 上下文
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
stream_context_set_option($streamContext, 'ssl', 'passphrase', $passphrase);

// 连接 APNs (使用持久连接减少握手开销)
$apns = stream_socket_client(
    $serverUrl,
    $error,
    $errorString,
    60,
    STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT,
    $streamContext
);

if (!$apns) {
    die("连接失败: $errorString (错误码: $error)");
}
echo "连接成功 <br/>\n";

// 组装二进制帧
$tokenBin = pack('H*', $deviceToken);
$msg = chr(0) . pack('n', 32) . $tokenBin . pack('n', strlen($payload)) . $payload;

// 发送
$result = fwrite($apns, $msg);
fclose($apns);

if ($result) {
    echo "发送成功: $payload";
} else {
    echo '发送失败: fwrite 返回 false';
}
?>

测试方法

# 浏览器或 curl 访问
https://yourserver/push.php?token=你的64位Token&message=测试消息&badge=5&sound=default

# curl 示例
curl "https://yourserver/push.php?token=abcdef...&message=Hello%20World&badge=1"

安全加固建议(生产环境必做)

  • 禁止公网直接访问:放在内网或加 IP 白名单、HTTP Basic Auth、Token 签名验证。
  • 参数校验:严格校验 Token 长度、格式;badge 限制范围 0-99999;sound 白名单校验。
  • 日志记录:记录请求 IP、Token 脱敏、Payload、发送结果,便于审计排查。
  • 改用 POST + JSON:避免 URL 记录在日志中泄露 Token。

局限性说明

  1. 基于旧版二进制协议,Apple 已推荐迁移至 HTTP/2 API。
  2. 无错误反馈机制(需单独查询 Feedback Service)。
  3. 单次发送,不支持批量、重试、超时控制等高级特性。
  4. 结语

    脚本适合开发调试、小规模内部测试。正式业务请使用成熟库(如 edamov/pushok、sly/notification-pusher)或自行封装 HTTP/2 客户端,获得连接池、异步发送、错误处理、监控指标等企业级能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved