Проверка подписи push-пакета не удалась - Safari Push

Я пытаюсь внедрить push-уведомление Safari на свой сервер (для моего сайта) с использованием PHP.

Я следую приведенному ниже руководству Apple: https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/NotificationProgrammingGuideForWebsites/PushNotifications/PushNotifications.html

Я использую библиотеку, разработанную Коннором: https://github.com/connorlacombe/Safari-Push-Notifications

Но я постоянно получаю разрешение: "отказано" в консоли Safari. Я распечатываю журнал (с этого URL: webServiceURL/version/log) на моем сервере и обнаружил, что проверка подписи push-пакета не удалась от Apple.

В stackOverflow я обнаружил следующее: проблема с сертификатом push-уведомлений Safari и push-уведомлением на веб-сайте Apple: проверка подписи push-пакета не удалась, но сертификаты apple в порядке. Я применил решение, которое они предоставили, но получаю сообщение об ошибке ниже: Отсутствует файл в пакете push-уведомлений. Скачивая файл zip pushPackage вручную, я обнаружил, что файл SIGNATURE отсутствует при применении их решения (с использованием файла AppleWWDRCA.pem в методе openssl_pkcs7_sign).

Как избавиться от этой проблемы? Что делать, чтобы зарегистрироваться в сервисе APNS?

1 ответ

Решение

У меня была такая проблема раньше, когда я реализовывал push-уведомление Safari в своем проекте. Теперь, вы следите за developer.apple.com, что хорошо, но этот также хорош для справки.

Теперь уже известно, что для отправки push в Safari вам нужно сначала три вещи

  1. Создайте файл fileName.cer и файл CSR в Mac.
  2. Создайте файл p12 с использованием файла CSR.
  3. Создание пакета Push

Для создания push-пакета вам нужно

  1. Создайте icon.iconset, там будет 6 значков, которые показаны в push-уведомлении.
  2. Теперь создайте файл website.json, это самый важный файл в push.

Затем код для разрешения на толчок в Safari:

window.onload = function () {
    if ('safari' in window && 'pushNotification' in window.safari) {
        var permissionData = window.safari.pushNotification.permission('web.com.domainname');
        checkRemotePermission(permissionData);
    }
};
var checkRemotePermission = function (permissionData) {
    console.log(permissionData);
    if (permissionData.permission === 'default') {

        window.safari.pushNotification.requestPermission(
            'https://domainname.com',
            'web.com.domainname', {},
            checkRemotePermission
        );
    } else if (permissionData.permission === 'denied') {
        console.log('denied');

    } else if (permissionData.permission === 'granted') {
        console.log('granted');
    }


};

Это предоставит вам токен устройства с помощью того токена, который вы можете отправить push.

Отправить пуш:

$title ="title";//Title of the push
$body = "body";//Body of the Push
$button = "View";//view button 
$payload['aps']['alert'] = array(
    "title" => $title,
    "body" => $body,
    "action" => $button
);
$payload['aps']['url-args'] = array(
    "www.facebook.com" // the sub part of the url to which the subscriber will be redirect after click on the push .This is Add with the URL u given in the website.json file that is:[ "urlFormatString": "http://%@" ] for this url will be :->http://www.facebook.com
);
for($i=0;$i<1;$i++){
    $deviceToken =$deviceToken;//This is the DeviceToken that u stored in the DB before.

    $payload = json_encode($payload);
    $apnsHost = 'gateway.push.apple.com';
    $apnsPort = 2195;
    $apnsCert = path/PushCertificates.pem';//Give the path to the ,pem file generated previously from ur registered .p12 file not for the downloaded .p12 file.
    $streamContext = stream_context_create();
    stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
    $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
    $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
    fwrite($apns, $apnsMessage);
    fclose($apns);
}

Здесь я посылаю толчок для нескольких пользователей. Замените необходимые файлы, и тогда это будет работать для вас.

Другие вопросы по тегам