Apple Push Notification Service подключается, но уведомление не получено

Всю прошлую неделю я бился головой о стену, пытаясь получить эту работу. Я просто начал снова с нуля и зарегистрировал все, что я сделал, и это до сих пор не работает. Вот шаги, которые я предпринял:

1) Создать новый идентификатор приложения с помощью нового идентификатора пакета (старый не имел push-уведомлений)

a) made sure push notifications were added to the app id and proceeded to the last step, this resulted in an app id with push notifications in the ‘configurable’ state.

b) I then went to edit the app id and saw that i could create a new production or development certificate so i did both using the steps listed

2) созданы два новых профиля подготовки, один для разработки и один для производства, оба используют новый идентификатор пакета

3) импортируйте новые профили подготовки в Xcode и убедитесь, что они выбраны в настройках сборки

4) создать .P12 файлы с помощью связки ключей и экспорта .cer файлы для разработки и производства

5) создать .PEM файл из .P12 файлы, использующие эти команды:

openssl pkcs12 -in VX-Mobile-Dev.p12 -out apns-dev.pem -nodes -clcerts

openssl pkcs12 -in VX-Mobile-Prod.p12 -out apns-prod.pem -nodes -clcerts 

6) Далее создан PHP скрипт (который я нагло сорвал с другого блога), который я запускаю из командной строки одной из моих виртуальных машин. В ту же папку, что и этот файл, я положил pans-prod.PEM файл. Вот содержимое этого файла

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

Содержимое файла:

// set time limit to zero in order to avoid timeout
set_time_limit(0);

// charset header for output
header('content-type: text/html; charset: utf-8');

// this is the pass phrase you defined when creating the key
$passphrase = '{passphrase is hidden to you!}';

// you can post a variable to this string or edit the message here
if (!isset($_POST['msg'])) {
$_POST['msg'] = "Notification message here!";
}

// function for fixing Turkish characters
function tr_to_utf($text) {
    $text = trim($text);
    $search = array('Ü', 'Þ', 'Ð', 'Ç', 'Ý', 'Ö', 'ü', 'þ', 'ð', 'ç', 'ý', 'ö');
    $replace = array('Ãœ', 'Åž', 'Ğž', 'Ç', 'Ä°', 'Ö', 'ü', 'ÅŸ', 'ÄŸ', 'ç', 'ı', 'ö');
    $new_text = str_replace($search, $replace, $text);
    return $new_text;
}

// tr_to_utf function needed to fix the Turkish characters
$message = tr_to_utf($_POST['msg']);

// load your device ids to an array
$deviceIds = array(
'97c8c0a77e1380d052d17352e33b1f2224f082a3436ee90310cf88c7278329e7'
);

// this is where you can customize your notification
$payload = '{"aps":{"alert":"' . $message . '","sound":"default"}}';

$result = 'Start' . "rn";

////////////////////////////////////////////////////////////////////////////////
// start to create connection
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'apns-prod.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

echo count($deviceIds) . " devices will receive notifications.rn";

foreach ($deviceIds as $item) {
    // wait for some time
    sleep(1);

    // Open a connection to the APNS server
    $fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx);

    if (!$fp) {
        exit("Failed to connect: $err $errstr" . "rn");
    } else {
        echo 'Apple service is online. ' . "rn";
    }

    // Build the binary notification
    $msg = chr(0) . pack('n', 32) . pack('H*', $item) . pack('n', strlen($payload)) . $payload;

    // Send it to the server
    $result = fwrite($fp, $msg, strlen($msg));

    if (!$result) {
        echo 'Undelivered message count: ' . $item . "rn";
    } else {
        echo("rnRESULTrnrn");
        var_dump($result);
        echo("rnrn");
        echo 'Delivered message count: ' . $item . "rn";
    }

    if ($fp) {
        fclose($fp);
        echo 'The connection has been closed by the client' . "rn";
    }
}

echo count($deviceIds) . " devices have received notifications.rn";

// set time limit back to a normal value
set_time_limit(30);

Пожалуйста помочь.

1 ответ

  1. Оказывается, я был почти там. Единственная проблема заключалась в том, что я должен был использовать конечную точку песочницы.

    ssl://gateway.sandbox.push.apple.com:2195
    

    Кроме того, в ответ на Rjv Kumar, как только я получил его работу, я попробовал его как с моим prod, так и с моим сертификатом dev, и он работал в обоих случаях. Это кажется мне подозрительным, но я просто рад, что это работает.

    [ОБНОВЛЕНИЕ]

    Хотя шаги в этом посте технически верны, я узнал, что вы не должны создавать новый идентификатор приложения, если вы действительно хотите иметь возможность выпустить новую версию вашего приложения. Вместо этого просто добавьте push-уведомления в текущий идентификатор приложения.