Использование PHP для отправки push-уведомлений iOS через APN

Я внедрил Push-уведомления в свой проект, и пока все работает нормально. Я пытался отправить уведомления через Pusher, и это сработало очень хорошо. Но я должен отправить их через PHP, который еще не работает. Я нашел много старых объяснений того, как это сделать, но ни одно из них, похоже, не работает для меня.

Вот с чем я пытаюсь работать:

    // APNs Push testen auf Token
$deviceToken = $_GET['key']; // Device-Token

// Payload erstellen und JSON codieren
$payload['aps'] = array('alert' => 'TitleText', 'badge' => 1, 'sound' => 'default');
$payload = json_encode($payload);

$apnsHost = 'gateway.sandbox.push.apple.com';
$apnsPort = 2195;
$apnsCert = 'certificate.pem';

// Stream erstellen
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'certificate.cer', $apnsCert);

$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
if ($apns)
{
  // Nachricht erstellen und senden
  $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
  fwrite($apns, $apnsMessage);

  // Verbindung schliessen
  fclose($apns);
}
else
{
  echo "Fehler!";
  var_dump($error);
  var_dump($errorString);
}

4 ответа

Решение

Попробуйте использовать этот скрипт php, убедитесь, что сертификат.pem выходит по тому же пути, что и скрипт php, когда вы его запускаете, также получите правильный токен устройства

 <?php
        /* We are using the sandbox version of the APNS for development. For production
        environments, change this to ssl://gateway.push.apple.com:2195 */
        $apnsServer = 'ssl://gateway.sandbox.push.apple.com:2195';
        /* Make sure this is set to the password that you set for your private key
        when you exported it to the .pem file using openssl on your OS X */
        $privateKeyPassword = '1234';
        /* Put your own message here if you want to */
        $message = 'Welcome to iOS 7 Push Notifications';
        /* Pur your device token here */
        $deviceToken =
        '05924634A8EB6B84437A1E8CE02E6BE6683DEC83FB38680A7DFD6A04C6CC586E';
        /* Replace this with the name of the file that you have placed by your PHP
        script file, containing your private key and certificate that you generated
        earlier */
        $pushCertAndKeyPemFile = 'PushCertificateAndKey.pem';
        $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. Processing...</br>";
        }
        $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<br/>";
        }
        else {
        echo "Successfully sent the message<br/>";
        }
        fclose($connection);

  ?>

Вот новые обновления скрипта, поскольку Apple изменила URL-адрес уведомления:

      <?php
    if ( defined("CURL_VERSION_HTTP2") && (curl_version()["features"] & CURL_VERSION_HTTP2) !== 0) {
        $ch = curl_init();
        $body ['aps'] = array (
            "alert" => array (
                "title"  => "hii",
            ),
            "sound"  => "default"
        );
        $curlconfig = array(
            CURLOPT_URL => "https://api.development.push.apple.com/3/device/device_token",
            CURLOPT_RETURNTRANSFER =>true,
            CURLOPT_POSTFIELDS => json_encode($body),
            CURLOPT_SSLCERT =>"apns.pem",
            CURLOPT_SSLCERTPASSWD => "123456",
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
            CURLOPT_VERBOSE => true
        );
        curl_setopt_array($ch, $curlconfig);
        $res = curl_exec($ch);
        if ($res === FALSE) {
                echo('Curl failed: ' . curl_error($ch));
        }
        curl_close($ch);
    }else{
        echo "No HTTP/2 support on client.";
    }
       
    ?>

Спасибо, надеюсь, это будет вам полезно !!!.

<?php

    function sendFCM($body, $title, $id, $StudentAdmissionId, $activitytype) {
        $url = "https://fcm.googleapis.com/fcm/send";
        $token = $id;
        $serverKey = 'AAAA8XYL2Y8:APA91bF1fsddfgffdssdsdfsdsdsda8zyWJTgs0OSeiRlk9WQqLwKn51VkMH_XSbpRuiCTU-Fdi2hoV8JY8ST7gCBQe4dlMFASDbr5Oci1bLmg9tyl5dlxyFDauWWCMItUNdFGWO_CWhpHwSIbvbqYwlCnoRd7ucB';
        $notification = array(
            'title' => $title,
            'text' => $body,
            'sound' => 'default',
            'badge' => 1,
            'category' => $activitytype,
            'content-available' => 1
        );
        $arrayToSend = array(
            'to' => $token,
            'notification' => $notification,
            'priority' => 'high'
        );
        $json = json_encode($arrayToSend);
        $headers = array();
        $headers[] = 'Content-Type: application/json';
        $headers[] = 'Authorization: key=' . $serverKey;
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        //Send the request
        echo $response = curl_exec($ch);
        //Close request
        if ($response === FALSE) {
            die('FCM Send Error: ' . curl_error($ch));
        }
        curl_close($ch);
        mysql_query("INSERT INTO `tbl_notifications`(`n_activity_name`,`n_user_id`,`n_device_id`, `n_notification`) VALUES ('$activitytype','$StudentAdmissionId','$id','$response')");
        // #Echo Result Of FireBase Server
        return $response;
    }

?>
  • Используйте это для php & mysql backend для отправки уведомлений на android и ios одновременно

  • Здесь токен сервера apns хранится в БД и передается для отправки fcm

Мое решение:

      $token = 'your device token';
$apns_topic = 'your bundle id';
$apns_pem = 'your location and name of your pem file';
$apns_pass = 'your password' // empty string if nopass
$body = array(
    'aps' => array(
        'alert' => $text,
        'sound' => 'default'
     )
); // Or the other bodies mentioned above

$ch = curl_init("https://api.development.push.apple.com/3/device/$token");
// https://api.push.apple.com/3/device/ in production
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("apns-topic: " . $apns_topic));
curl_setopt($ch, CURLOPT_SSLCERT, _FRW_CONFIG_DIR_ . $apns_pem);
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $apns_pass);
$result = curl_exec($ch);
Другие вопросы по тегам