php实现ios推送
PHP 实现 iOS 推送
准备工作
确保拥有 Apple Developer 账号并已创建 App ID 和推送证书(.p12 或 .pem 文件)。需要在项目中启用推送通知功能,并在 Apple Developer 后台配置推送证书。
生成推送证书
从 Apple Developer 后台导出推送证书(开发或生产环境),转换为 .pem 格式:
openssl pkcs12 -in cert.p12 -out cert.pem -nodes -clcerts
使用 cURL 发送推送
通过 PHP 的 cURL 库向 APNs(Apple Push Notification service)发送请求。以下是一个基本实现示例:
$deviceToken = '设备Token字符串';
$apnsUrl = 'https://api.push.apple.com/3/device/'; // 生产环境
// $apnsUrl = 'https://api.sandbox.push.apple.com/3/device/'; // 开发环境
$payload = [
'aps' => [
'alert' => [
'title' => '通知标题',
'body' => '通知内容'
],
'sound' => 'default',
'badge' => 1
],
'custom_data' => ['key' => 'value'] // 自定义数据
];
$headers = [
'apns-topic: com.example.app', // Bundle ID
'authorization: bearer ' . $this->generateJwtToken(),
'content-type: application/json'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apnsUrl . $deviceToken);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSLCERT, 'path/to/cert.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, '证书密码(如果有)');
$response = curl_exec($ch);
curl_close($ch);
生成 JWT 令牌
APNs 要求使用 JWT 进行认证。以下是生成 JWT 的示例代码:
function generateJwtToken() {
$keyId = '密钥ID(从Apple Developer获取)';
$teamId = '团队ID';
$privateKey = file_get_contents('path/to/AuthKey_XXXXXX.p8');
$time = time();
$header = ['alg' => 'ES256', 'kid' => $keyId];
$claims = [
'iss' => $teamId,
'iat' => $time
];
$headerEncoded = base64_encode(json_encode($header));
$claimsEncoded = base64_encode(json_encode($claims));
$signature = '';
openssl_sign("$headerEncoded.$claimsEncoded", $signature, $privateKey, 'sha256');
$signatureEncoded = base64_encode($signature);
return "$headerEncoded.$claimsEncoded.$signatureEncoded";
}
使用第三方库
可以简化流程的第三方库包括:
- Pushok: 专为 APNs 设计的 PHP 库
- ApnsPHP: 老牌 iOS 推送库
- Laravel 用户: 可以使用
laravel-notification-channels/apn包
错误处理
检查 cURL 响应或库返回的错误信息。常见错误包括:
- 无效的设备 Token
- 证书过期或配置错误
- 超出推送频率限制
测试推送
建议先在开发环境测试,使用沙箱 URL (api.sandbox.push.apple.com)。可以通过 Apple 的反馈服务获取失效的设备 Token。

注意事项
- 生产环境和开发环境的证书及 URL 不同
- 设备 Token 可能会变化,需定期更新
- iOS 13+ 要求推送必须显示通知或增加
content-available: 1标记






