Я пытаюсь так отправить push уведомления тонна моего iPhone (APNS). Я прочитал этот пост и попытаюсь его реализовать. Так что все мои сертификаты хороши (нормальные).
Теперь у меня есть этот php-скрипт:
$device = '4f30e047 c8c05db9 3fa87e7d ca5325f7 738cb2c0 0b4a02d4 d4329a42 a7128173'; // My iphone deviceToken $payload['aps'] = array('alert' => 'This is the alert text', 'badge' => 1, 'sound' => 'default'); $payload['server'] = array('serverId' => $serverId, 'name' => $name); $output = json_encode($payload); $apnsCert = 'apple_push_notification_production.pem'; $streamContext = stream_context_create(); stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); $apns = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext); $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $device)) . chr(0) . chr(strlen($payload)) . $payload; fwrite($apns, $apnsMessage); //socket_close($apns); seems to be wrong here ... fclose($apns);
Когда я запускаю этот скрипт, ничего не происходит. нет ошибки только пустой страницы, но мой iPhone не получает push-уведомление …
У вас есть идея?
Большое спасибо !
нет места в токенах устройства, полоса их
Для получения сертификата разработки необходим URL-адрес
'SSL: //gateway.sandbox.push.apple.com: 2195'
но для производства
'SSL: //gateway.push.apple.com: 2195'
Разделите пробелы с токена, и даже тогда это не работает.
$apnsHost = 'gateway.sandbox.push.apple.com';
Удалите «песочницу» из этого URL-адреса и он будет работать.
Если у вас есть несколько устройств, и вы их просматриваете, я обнаружил, что вам нужно создать новый stream_context_create для каждого fwrite, чтобы предотвратить закрытие соединения Apple для плохого токена.
FYI
Чтобы успешно отправлять уведомления, вы должны сделать еще одну вещь.
Заменить $ output = json_encode ($ payload);
до $ payload = json_encode ($ полезная нагрузка);
Вам не хватает личного сертификата сертификата. Добавьте эту строку: stream_context_set_option ($ streamContext, 'ssl', 'passphrase', $ certificatePrivateKey);