返回

iOS 推送通知发送指南:使用 PHP 和 cURL 轻松实现

php

用 PHP 和 cURL 发送 iOS 推送通知的全面指南

简介

在 iOS 生态系统中,推送通知是一种关键机制,允许应用程序向用户设备发送及时消息。为了实现推送通知,开发人员可以使用 PHP 和 cURL 库,但需要注意安全性和认证机制。本文将详细介绍如何解决“Unexpected HTTP/1.x request: POST /3/device/”错误,并提供完整的代码示例以帮助你发送 iOS 推送通知。

错误原因及解决方法

“Unexpected HTTP/1.x request: POST /3/device/”错误通常表明 cURL 使用 HTTP/1.x 协议进行请求,而 APN 服务需要 HTTP/2。解决此错误的方法如下:

  1. 更新 cURL 版本: 确保安装了 cURL 7.47.0 或更高版本,因为它支持 HTTP/2。
  2. 定义 CURL_HTTP_VERSION_2_0 常量: 在你的 PHP 代码中定义 CURL_HTTP_VERSION_2_0 常量,强制 cURL 使用 HTTP/2。
  3. 设置 CURLOPT_HTTP_VERSION 选项: 将 CURLOPT_HTTP_VERSION 选项设置为 CURL_HTTP_VERSION_2_0,以在 cURL 请求中明确指定 HTTP/2。

完整代码示例

以下是使用 APNS 和 cURL 发送 iOS 推送通知的完整 PHP 代码示例:

<?php
// 定义 HTTP/2 常量
define('CURL_HTTP_VERSION_2_0', 3);

// APN 设置
$http2_server = 'https://api.development.push.apple.com'; // 生产环境使用 'https://api.push.apple.com'
$app_bundle_id = 'com.MD.example';

// JWT 创建
$key_file = 'XXXXXXXX'; // APN 密钥文件路径
$secret = null; 
$private_key = JWKFactory::createFromKeyFile($key_file, $secret, [
    'kid' => '3W6B5LQQHX',
    'alg' => 'ES256',
    'use' => 'sig',
]);

$payload = [
    'iss' => 'RUK725A7V4',
    'iat' => time(),
];

$header = [
    'alg' => 'ES256',
    'kid' => $private_key->get('kid'),
];

$jws = JWSFactory::createJWSToCompactJSON(
    $payload, $private_key, $header
);

// 设备 token
$token = $device->device_id;

// 请求 URL
$url = "{$http2_server}/3/device/{$token}";

// 请求头
$headers = array(
    "apns-topic: {$app_bundle_id}",
    'Authorization: bearer ' . $jws
);

// cURL 设置
$http2ch = curl_init();
curl_setopt_array($http2ch, array(
    CURLOPT_URL => $url,
    CURLOPT_PORT => 443,
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POST => TRUE,
    CURLOPT_POSTFIELDS => $data,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_HEADER => 1,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
));

// 发送请求
$result = curl_exec($http2ch);

// 处理结果
if (curl_errno($http2ch)) {
    echo 'Error: ' . curl_error($http2ch);
} else {
    echo 'Success: ' . $result;
}

// 关闭 cURL
curl_close($http2ch);

提示

常见问题解答

1. 如何创建 APN 证书和密钥?

按照 Apple 官方文档:https://developer.apple.com/documentation/security/certificate-key-and-provisioning-profile-basics/create-a-certificate-and-private-key-for-use-with-apple-push-notifications

2. 如何更新 cURL 版本?

取决于你的系统和安装方式。对于 Ubuntu 等基于 Debian 的系统,请运行以下命令:

sudo apt-get update && sudo apt-get install curl

对于其他系统,请查阅 cURL 官网:https://curl.se/

3. 如何配置 APN 服务设置?

4. JWT 中的“iss”和“iat”字段分别是什么意思?

  • “iss”是发出 JWT 的应用程序的标识符。
  • “iat”是 JWT 创建的时间戳。

5. 如何处理错误结果?

如果 curl_exec() 返回错误,请检查 curl_error() 获取错误消息。常见错误包括:

  • HTTP 状态代码非 200
  • 无效的 APN 证书或密钥
  • 过期的设备 token