Web Push API permite que você envie notificações push para Navegadores da web e APIs. Embora a maior parte da lógica ocorra no navegador, você ainda precisa de um componente do lado do servidor para gerar suas notificações. Aqui está como implementar um back-end push da web usando PHP.
resumo
pré-condições
para os fins deste tutorial, assumiremos que você conhece os fundamentos da construção de APIs HTTP em PHP. Você precisará expor alguns endpoints públicos usando sua infraestrutura da web. Estes serão chamados pelo JavaScript do seu navegador para registrar e cancelar o registro de dispositivos.
este artigo NÃO cobrirá o código do lado do navegador ou como ele funciona. Você precisará configurar um service worker que responda a eventos push de entrada e exiba uma notificação ao usuário.
em um nível alto, o fluxo de push da web se parece com isso:
- uma assinatura push é salva no navegador. O navegador envia um URL de endpoint exclusivo para o JavaScript.
- seu JavaScript envia dados de assinatura para seu servidor e identifica o usuário ao qual ele 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 provedor. Seu service worker JavaScript lida com o evento resultante e usa a API de notificação do navegador para alertar o usuário.
aqui está como implementar os aspectos do lado do servidor das etapas 1 a 3.
obter configuração
usaremos o pacote web-push
Packagiste da minishlink. Isso desconsidera as interações com cada plataforma de notificação do navegador para que você não precise distinguir manualmente os tipos de endpoint.
adicione o pacote ao seu projeto usando o Composer:
composer require minishlink / web-push
para usar a versão mais recente, você precisa do PHP 7.2 ou superior com o 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 mais antiga para manter a compatibilidade.
a biblioteca expõe uma classe kernel WebPush
com métodos que permitem enviar notificações individualmente ou em lotes. As assinaturas são representadas por instâncias da classificação Subscription
.
fornecer chaves VAPID
a confiança no ecossistema Web push compatível com os padrões é aprimorada pelo uso de chaves VAPID. Seu servidor precisa de um par de chaves insípido para poder se autenticar com os navegadores. A chave pública deve ser exposta por meio de um endpoint de API.
Você pode gerar um INSÍPIDO anel de chave usando o web-push
wrap:
use MinishlinkWebPushVAPID; $ keyset = VAPID::createVapidKeys(); // public key - this needs to be accessible via an API endpointthrew out $ keyset; // private key - never expose this!threw out $ 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.
registro de 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 com o ID do Usuário para que você possa recuperar qualquer dispositivo inscrito por push vinculado ao usuário posteriormente.
omitimos as amostras de código para esta etapa porque a implementação depende da sua camada de armazenamento de dados e dos valores enviados pelo seu JavaScript. Normalmente, esta será uma representação JSON de um objeto PushSubscription
. Você precisa de um conjunto simples de endpoints de API CRUD baseados em banco de dados para criar uma assinatura, substituir uma assinatura existente e solicitar exclusão quando o usuário cancelar a assinatura.
preparação de assinaturas
uma vez 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
para classificar:
use MinishlinkWebPushWebPush; $ webPush = new WebPush(]);
Você pode reutilizar um WebPush
instância a cada vez que você enviar uma notificação. A biblioteca deve ser configurada com o anel-chave VAPID que você gerou anteriormente. As chaves devem ser codificadas com Base64, mas isso é tratado para você se você as Criar com a biblioteca.
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:
.
então você precisa pegar a assinatura push que você vai enviar para. Use seu sistema de acesso a dados para encontrar os URLs de endpoint push associados ao Usuário para o qual deseja enviar. Converta cada assinatura em um exemplo Subscription
:
use MinishlinkWebPushSubscription; // 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 diferentes versões da especificação utilizada pelo browser serviços. A propriedade P256DH é outra chave pública que deve ser fornecida quando definida na Assinatura.
o web-push
a Biblioteca é compatível com Chrome e Firefox push endpoints. 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
et Subscription
instâncias para enviar uma notificação:
$ result = $ webPush -> sendOneNotification( $ subscription, json_encode());
Appel sendOneNotification()
fornece entrega imediata para uma única notificação. A carga útil, neste caso, é uma matriz codificada JSON com duas propriedades. Cabe a você quais dados você envia e qual formato 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.
as assinaturas de notificações também podem expirar. Chame o isSubscriptionExpired()
em uma classe de resultado para determinar se esse é o motivo da falha. Você pode remover a assinatura do seu banco de dados nesse cenário, certificando-se de não enviar mais nada para um endpoint morto.
Lote de notificações
Notificações podem ser agrupados a fim de ser entregue com uma única chamada de método:
$ webPush -> queueNotification($ subscription, );$ webPush -> queueNotification($ subscription, ); foreach ($ webPush -> flush() as $i => $ result) { threw out ("Notification $i was " . ($ result -> isSuccess() ? "feels" : "not sent"));}
Isso é útil quando você sabe que você está indo para enviar 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 de maneira ideal.
você pode limitar o número de notificações enviadas em um flush()
passando um inteiro para o método:
$ webPush -> flush(100); // send 100 messages
O padrão é 1000
.
opções de Notificação
sendOneNotification()
et queueNotification()
aceitar as seguintes opções como o terceiro argumento da matriz:
-
TTL
– Controla o tempo que o browser notificação plataforma irá manter a notificação, se ela não pode ser entregue para o usuário do dispositivo imediatamente. Se o dispositivo do usuário estiver offline, as plataformas tentarão entregá-lo pelas próximas quatro semanas por padrão. Se você enviar uma notificação que não será relevante na próxima semana, ajuste a idade de acordo para que o Usuário não veja conteúdo desatualizado. -
urgency
– aceitenormal
,low
ouvery-low
como valores. Algumas plataformas podem usá-lo para ajustar a frequência de entrega de notificação. Os dispositivos que entram no modo de economia de bateria podem suspender a entrega de notificações não urgentes. -
batchSize
– isso tem o mesmo efeito que o argumento deflush()
descrito acima.
você pode configurar os valores de opção padrão usando o segundo argumento do fabricante WebPush
:
$ webPush = new WebPush(], );
Resumo
O web-push
A biblioteca facilita o envio de web notificações push usando PHP. Você obtém uma camada de abstração em cima das diferentes plataformas de navegador que suportam processamento em lote, tratamento de erros e todas as funcionalidades de envio da web.
o mecanismo Web push é um sistema de navegador incomum porque 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 front-end é geralmente o aspecto mais demorado, especialmente se você ainda não estiver usando recursos de service worker.