php实现ios推送
PHP 实现 iOS 推送的方法
使用 Apple Push Notification Service (APNS) 和 PHP 实现推送
确保服务器环境支持 PHP 和 cURL 扩展,并且已准备好 Apple 开发者账号及推送证书。
生成和配置推送证书
从 Apple 开发者中心创建推送证书(.p12 或 .pem 格式)。将证书转换为 .pem 格式,便于 PHP 使用。例如,使用 OpenSSL 转换 .p12 文件:
openssl pkcs12 -in cert.p12 -out cert.pem -nodes -clcerts
将生成的 cert.pem 和 key.pem 文件保存到服务器安全目录。
使用 cURL 发送推送请求
PHP 通过 cURL 与 APNS 通信。以下代码展示了如何发送推送通知:
<?php
$deviceToken = 'DEVICE_TOKEN'; // 目标设备的 token
$message = '推送消息内容';
$badge = 1;
$sound = 'default';
// 证书路径
$certFile = 'path/to/cert.pem';
$keyFile = 'path/to/key.pem';
// 推送负载
$payload = [
'aps' => [
'alert' => $message,
'badge' => $badge,
'sound' => $sound,
],
];
$jsonPayload = json_encode($payload);
// APNS 服务器地址(开发环境或生产环境)
$apnsUrl = 'https://api.push.apple.com/3/device/' . $deviceToken; // 生产环境
// $apnsUrl = 'https://api.sandbox.push.apple.com/3/device/' . $deviceToken; // 开发环境
// 初始化 cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apnsUrl);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonPayload);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($ch, CURLOPT_SSLCERT, $certFile);
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, ''); // 如果有密码则填写
curl_setopt($ch, CURLOPT_SSLKEY, $keyFile);
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 执行请求
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode !== 200) {
echo "推送失败,HTTP 状态码: " . $httpCode . "\n";
echo "响应内容: " . $response . "\n";
} else {
echo "推送成功\n";
}
curl_close($ch);
?>
处理推送响应
APNS 会返回 HTTP 状态码和可能的错误信息。常见的状态码包括:
200:推送成功。400:请求格式错误。403:证书或 token 无效。410:设备 token 不再有效。
根据响应调整推送逻辑,例如移除无效的 device token。
使用第三方库简化流程
为简化流程,可以使用第三方 PHP 库如 pushok 或 apns-php。以下是使用 pushok 的示例:
<?php
require 'vendor/autoload.php';
use Pushok\AuthProvider;
use Pushok\Client;
use Pushok\Notification;
use Pushok\Payload;
$authProvider = AuthProvider\Token::create([
'key_id' => 'YOUR_KEY_ID', // 从 Apple 开发者账号获取
'team_id' => 'YOUR_TEAM_ID',
'app_bundle_id' => 'YOUR_BUNDLE_ID',
'private_key_path' => 'path/to/AuthKey_KEYID.p8',
]);
$client = new Client($authProvider, $production = true);
$deviceToken = 'DEVICE_TOKEN';
$payload = Payload::create()
->setAlertTitle('推送标题')
->setAlertBody('推送内容')
->setBadge(1);
$notification = new Notification($payload, $deviceToken);
$client->addNotification($notification);
$client->push();
?>
注意事项
- 确保设备 token 是最新的,token 可能会因用户重新安装应用或更换设备而失效。
- 生产环境和开发环境的 APNS 地址不同,需根据实际情况切换。
- 推送频率过高可能导致 Apple 限制请求,需合理控制推送节奏。







