如何以及从服务器向 APN 发送什么以便 APN 向设备发送通知?

How and What to send to APN from server so that APN send the notification to device?

我是一名 iOS 开发人员,我被问到什么类型(即 header 以及 body)请求点击 APN 以获得设备通知。

我阅读了很多关于为 APN 设置服务器的教程,但我无法理解,因为我不了解 PhP 和 Node Js。看了apple document,才知道它使用了http/2等各种tag和value。但我无法构建完整的请求。 非常感谢任何帮助。

要使用 PHP 发送 APNs 请求,您需要满足以下要求:

  1. .pem 证书应该存在于您的 php 脚本的相同路径中。
  2. 向特定设备发送通知所需的设备令牌。

那你可以试试下面的代码:

<?php
    $apnsServer = 'ssl://gateway.push.apple.com:2195';
    $privateKeyPassword = '1234'; // your .pem private key password

    $message = 'Hello world!';

    $deviceToken = 'YOUR_DEVICE_TOKEN_HERE';

    $pushCertAndKeyPemFile = 'PushCertificateAndKey.pem'; // Your .pem certificate
    $stream = stream_context_create();
    stream_context_set_option($stream,
    'ssl',
    'passphrase',
    $privateKeyPassword);
    stream_context_set_option($stream,
    'ssl',
    'local_cert',
    $pushCertAndKeyPemFile);

    $connectionTimeout = 20;
    $connectionType = STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT;
    $connection = stream_socket_client($apnsServer,
    $errorNumber,
    $errorString,
    $connectionTimeout,
    $connectionType,
    $stream);
    if (!$connection){
    echo "Failed to connect to the APNS server. Error no = $errorNumber<br/>";
    exit;
    } else {
    echo "Successfully connected to the APNS...";
    }
    $messageBody['aps'] = array('alert' => $message,
    'sound' => 'default',
    'badge' => 2,
    );
    $payload = json_encode($messageBody);
    $notification = chr(0) .
    pack('n', 32) .
    pack('H*', $deviceToken) .
    pack('n', strlen($payload)) .
    $payload;
    $wroteSuccessfully = fwrite($connection, $notification, strlen($notification));
    if (!$wroteSuccessfully){
    echo "Could not send the message.";
    }
    else {
    echo "Successfully sent the message.";
    }
    fclose($connection);

?>

有关详细信息,请参阅此 link

我们只使用纯 CURL 向 APNS 发送 http2 请求

先决条件:您拥有从开发人员控制台转换为 .PEM 的有效 SSL 证书

/usr/local/Cellar/curl/7.50.0/bin/curl -v \
-d '{"aps":{"alert":"Hello","content-available": 1, "sound": ""}}' \
-H "apns-topic: com.yourapp.bundleid" \
-H "apns-expiration: 1" \
-H "apns-priority: 10" \
--http2 \
--cert /Users/PATHTOPEM/key.pem:YOURPASSWORD \
https://api.push.apple.com/3/device/YOURDEVICETOKEN

或者,如果您对使用终端持谨慎态度,请尝试使用此 MacOS 应用程序发送推送通知,它非常简单。

先决条件:您需要在钥匙串中拥有证书签名授权和私有 SSL 证书。

https://github.com/noodlewerk/NWPusher