Como Enviar Web Notificações Push Com PHP
Web Empurrar API permite-lhe enviar notificações push para os navegadores da web e APIs. Embora a maior parte da lógica aconteça no navegador, você ainda precisa de um componente do lado do servidor para gerar suas notificações. Veja como implementar um back-end Push da Web usando PHP.
pré-requisitos
para os fins deste tutorial, assumiremos que você está familiarizado com os fundamentos da criação de APIs HTTP em PHP. Você precisará expor alguns endpoints públicos usando sua estrutura da web. Estes serão chamados pelo seu JavaScript no navegador para registrar e cancelar o registro de dispositivos.
este artigo não vai tocar no código do lado do navegador ou como ele funciona. Você precisará montar um service worker que responda a eventos push recebidos e exiba uma notificação ao usuário.
em um alto nível, o fluxo de Push da Web se parece com isso:
- uma assinatura push é registrada no navegador. O navegador emite um URL de endpoint exclusivo para o seu JavaScript.
- seu JavaScript envia os dados da assinatura para o seu servidor e identifica o usuário ao qual se aplica.
- quando seu back-end precisar enviar uma notificação por push, crie uma carga útil e envie-a para o URL do endpoint relatado como parte dos dados da Assinatura.
- o navegador do Usuário receberá a carga útil por meio da plataforma de entrega de notificações do Fornecedor. Seu service worker JavaScript lida com o evento consequente e usa a API de notificação do navegador para alertar o usuário.
veja como implementar os aspectos do lado do servidor das etapas 1 a 3.
Getting Setup
usaremos o pacote Packagist web-push
da minishlink. Isso abstrai as interações com cada plataforma de notificação do navegador para que você não precise distinguir manualmente entre os tipos de endpoint.
Adicionar o pacote para seu projeto usando Compositor:
composer require minishlink/web-push
Para usar a versão mais recente, você precisa PHP 7.2 ou superior, com a gmp
, mbstring
, curl
, e openssl
extensões. Se você precisar usar uma versão mais antiga do PHP, bloqueie o pacote para uma versão anterior para manter a compatibilidade.
a biblioteca expõe uma classe core WebPush
com métodos que permitem enviar notificações individualmente ou em lotes. As assinaturas são representadas por instâncias da classe Subscription
.
fornecer chaves VAPID
a confiança no ecossistema Web Push compatível com os padrões é aplicada através do uso de chaves VAPID. Seu servidor precisa de um par de chaves insípido para que ele possa se autenticar nos navegadores. A chave pública deve ser exposta por meio de um endpoint de API.
você pode gerar um conjunto de teclas VAPID usando o pacote web-push
:
use Minishlink\WebPush\VAPID; $keyset = VAPID::createVapidKeys(); // public key - this needs to be accessible via an API endpointecho $keyset; // private key - never expose this!echo $keyset; file_put_contents("vapid.json", json_encode($keyset));
Gerar chaves para o seu sistema e armazená-los em um local persistente. Adicione um endpoint de API para que seu JavaScript do lado do cliente possa recuperar a chave pública. Isso será usado para configurar a assinatura push do navegador. O dispositivo do Usuário aceitará eventos push recebidos se eles tiverem sido assinados usando a chave privada VAPID correspondente.
registrando assinaturas Push
o próximo passo na sequência é receber solicitações de assinatura push de seus clientes. Depois que o navegador confirmar uma nova assinatura push, seu JavaScript deverá enviar o URL do endpoint da assinatura e as chaves de autenticação associadas ao seu servidor. Armazene esses detalhes junto com o ID do Usuário para que você possa recuperar todos os dispositivos inscritos por push vinculados ao usuário mais tarde.
estamos omitindo amostras de código para esta etapa, pois a implementação depende da sua camada de armazenamento de dados e dos valores que seu JavaScript envia. Normalmente, esta será uma representação JSON de um objeto PushSubscription
. Você precisa de um conjunto simples de endpoints de API CRUD apoiados por banco de dados para criar uma assinatura, substituir uma existente e solicitar uma exclusão quando o usuário cancelar a assinatura.
preparando assinaturas
depois que um cliente é registrado com sucesso, você pode começar a enviar notificações usando a biblioteca web-push
. Comece por criar uma instância do WebPush
classe:
use Minishlink\WebPush\WebPush; $webPush = new WebPush(]);
Você pode reutilizar um WebPush
instância a cada vez que você enviar uma notificação. A biblioteca precisa ser configurada com o conjunto de teclas VAPID que você gerou anteriormente. As chaves devem ser codificadas como Base64, mas isso é tratado para você se você as Criar com a biblioteca.
o VAPID subject
é usado para identificar seu servidor e seus detalhes de contato. Você pode fornecer um URL do site ou um link de endereço de e-mail mailto:
.
em seguida, você precisa recuperar a assinatura push para a qual enviará. Use seu sistema de acesso a dados para pesquisar os URLs de endpoint push associados ao Usuário para o qual deseja enviar. Converta cada assinatura para uma instância Subscription
:
use Minishlink\WebPush\Subscription; // Get user's push data...// SELECT * FROM push_subscriptions WHERE user_id = 123456 $subscription = Subscription::create(]);
O auth
propriedade PushSubscription
é repetida duas vezes, para lidar com duas versões diferentes da especificação utilizada pelo browser serviços. A propriedade P256DH é outra chave pública que deve ser fornecida quando definida na Assinatura.
a biblioteca web-push
é compatível com os endpoints push do Chrome e do Firefox. Ele também funcionará com qualquer outra implementação Web Push que atenda ao padrão atual.
Envio de uma Notificação
Agora combinar o seu WebPush
e Subscription
instâncias para enviar uma notificação:
$result = $webPush -> sendOneNotification( $subscription, json_encode());
Chamada sendOneNotification()
fornece entrega imediata para uma única notificação. A carga útil, neste caso, é uma matriz codificada em JSON com duas propriedades. Cabe a você quais dados você envia e o formato que você usa – seu cliente JavaScript o recebe como está e pode interpretá-lo conforme necessário.
Envio de uma notificação retorna um resultado de classe, que permite verificar se a operação foi bem-sucedida:
if ($result -> isSuccess()) { // all good}else { // something went wrong error_log($result -> getReason()); // provides raw HTTP response data error_log($result -> getResponse()); }
Você pode tomar medidas para repetir ou cancelar a entrega se ocorrer um erro.
assinaturas de notificação também podem expirar. Chame o método isSubscriptionExpired()
em uma classe de resultado para determinar se esse é o motivo da falha. Você pode excluir a assinatura do seu banco de dados neste cenário, garantindo que você não envie mais nada para um endpoint morto.
Lotes de Notificações
Notificações podem ser agrupados em conjunto para entrega com uma chamada de método:
$webPush -> queueNotification($subscription, );$webPush -> queueNotification($subscription, ); foreach ($webPush -> flush() as $i => $result) { echo ("Notification $i was " . ($result -> isSuccess() ? "sent" : "not sent"));}
Isso é útil quando você sabe que vai ser o envio de um grande número de notificações em um curto período de tempo. Enfileire todas as suas cargas úteis e deixe web-push
entregá-las da maneira ideal.
Você pode limitar o número de notificações enviadas em um único flush()
, passando um inteiro para o método:
$webPush -> flush(100); // send 100 messages
O valor padrão é 1000
.
Opções de Notificação
sendOneNotification()
e queueNotification()
aceitar as seguintes opções como um terceiro argumento de matriz:
-
TTL
– Controla o tempo que o browser da notificação plataforma vai segurar a notificação, se ele não pode ser transmitido para o dispositivo do usuário imediatamente. Se o dispositivo do usuário estiver offline, as plataformas devem tentar entregá-lo nas próximas quatro semanas. Se você estiver enviando uma notificação que não será relevante na próxima semana, ajuste o TTL de acordo para que o Usuário não veja conteúdo desatualizado. -
urgency
– Aceitanormal
,low
ouvery-low
como valores. Algumas plataformas podem usar isso para ajustar a frequência de entrega de notificação. Os dispositivos que entram em um modo de economia de bateria podem suspender a entrega de notificações não urgentes. -
batchSize
– isso tem o mesmo efeito que o argumento paraflush()
descrito acima.
Você pode configurar a opção padrão de valores usando o segundo argumento para o WebPush
construtor:
$webPush = new WebPush(], );
Resumo
O web-push
biblioteca facilita o envio de Web notificações Push usando PHP. Você obtém uma camada de abstração no topo das várias plataformas de navegador que suporta lotes, tratamento de erros e todos os recursos de envio da Web.
o mecanismo Web Push é um sistema de navegador incomum, pois depende de componentes remotos do lado do servidor que você mesmo fornece. Isso pode fazer com que pareça opaco e técnico. Na prática, criar um back-end PHP simples é rápido e fácil; a implementação do front-end geralmente é o aspecto mais demorado, principalmente se você ainda não estiver usando os recursos do service worker.
Leave a Reply