Веб нотификации - Како се креира независна услуга
Вовед
Уведомувањата преку веб-пуш се станале основен алат за ангажирање на корисниците надвор од традиционалните граници на веб-страници и апликации. Бизнисите и развивачите често се потпираат на услуги од трети страни како OneSignal или Firebase Cloud Messaging за справување со сложеноста на испраќањето на известувања. Меѓутоа, овие надворешни услуги често воведуваат зависности, прашања за приватност или ограничувања во персонализацијата.
Овој блог пост претставува детална, чекор-по-чекор туторијал за креирање независна веб пуш услуга за известувања користејќи ја библиотеката minishlink/web-push. Ќе ја искористиме оваа PHP библиотека за интегрирање на веб пуш известувањата директно во рамките на CodeIgniter 4 (CI4) и Laravel фрмворките, овозможувајќи целосно автономен, персонализиран и приватносно ориентиран систем за известувања.
До крајот на овој водич, ќе разберете како да изградите и управувате со сигурна независна услуга за пуш известувања која не зависии од никакви надворешни доставувачи или платформи како OneSignal, давајќи ви целосна контрола врз вашата инфраструктура за известувања.
Зошто да изберете независна веб пуш услуга?
Преди да се впуштиме во имплементацијата, ветиме зошто изградбата на независна услуга за известувања е привлечен избор:
- Нема зависност од трети страни: избегнувајте прекини, промени во цени или политики што може да ги нарушат вашите известувања.
- Комплетна контрола врз приватноста на податоците: податоците за претплата и известувањата остануваат на вашите сопствени сервери, намалувајќи изложеност на трети страни.
- Персонализација: прецизно прилагодување на логиката, распоредот и форматот на содржината на вашите известувања без ограничувања.
- Ценовна ефективност: без зависност од платени тарифи или ценовни модели базирани на корисници што се користат со надворешни услуги.
- Лесна интеграција со постоечка бекенд инфраструктура: директна интеграција со вашите бази на податоци и логика во Laravel или CI4, олеснувајќи развој и одржување.
Почеток: Изградба на ваша сопствена услуга со minishlink/web-push
PHP библиотеката minishlink/web-push е темелот на нашата независна услуга. Таа е зрела, добро документирана алатка која ги управува сложеностите на протоколот Веб ПуШ, вклучувајќи ВАПИД автентикација, енкрипција на payload, и управување со претплатите.
Чекор 1: Подготовка на развојната средина
Најпрво, осигурајте се дека имате работна PHP средина со инсталиран Composer, како и правилно конфигуриран Laravel или CodeIgniter 4.
- PHP 7.4 или повисоко.
- Composer за управување со зависности.
- Инсталиран Laravel 8+ или CodeIgniter 4 во вашата папка за проект.
Покренете ја инсталацијата на библиотеката преку Composer:
composer require minishlink/web-push
Чекор 2: Генерирање VAPID клучеви
VAPID (Волонтерско Идентификација на Апликациски Сервер) клучевите се клучни серијали за автентикација на вашиот сервер со сервисите за пуш на графичкиот пребарувач, овозможувајќи доверливи и безбедни пораки.
Генерирајте ги вашите VAPID клучеви користејќи ја вградениот хелпер од пакетот:
php vendor/bin/web-push generate:vapid
Командата издава пар на јавен и приватен клуч. Овие клучеви мора да се сочуваат сигурно; јавниот ќе биде споделен со клиентите, а приватниот ќе остане доверлив на вашиот сервер.
Чекор 3: Реализација на серверски складишта за претплати
За да испраќате известувања, мора да складирате детали за претплатата на клиентите, што вклучуваат URL-адреса на endpoint и криптографски клучеви генерирани во прелистувачот на клиентот.
- Пример за структура на базата:
CREATE TABLE subscriptions (
id INT AUTO_INCREMENT PRIMARY KEY,
endpoint TEXT NOT NULL,
public_key VARCHAR(255),
auth_token VARCHAR(255),
content_encoding VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Зачувајте ги објектите за претплата по претплатата на клиентите на фронтендот.
Чекор 4: Прилог на претплата на клиентот со JavaScript
На фронтот, имплементирајте логика за претплата користејќи ја Push API и Service Workers. Клучната работа е да користите јавниот VAPID клуч за да претплатите прелистувачот на вашиот Push сервис.
Пример за код:
const publicVapidKey = '';
if ('serviceWorker' in navigator) {
send().catch(err => console.error(err));
}
async function send() {
const registration = await navigator.serviceWorker.register('/worker.js', {
scope: '/'
});
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(publicVapidKey)
});
await fetch('/save-subscription', {
method: 'POST',
body: JSON.stringify(subscription),
headers: {
'content-type': 'application/json'
}
});
console.log('Претплата за пуш е зачувана.');
}
function urlBase64ToUint8Array(base64String) {
const padding = '='.repeat((4 - base64String.length % 4) % 4);
const base64 = (base64String + padding)
.replace(/\-/g, '+')
.replace(/_/g, '/');
const rawData = window.atob(base64);
const outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
Овој JavaScript управува со регистрација на сервисен работник, претплата на push сервисот и испраќање на објектот за претплата кон backend рута /save-subscription, која ќе ја имплементирате следно.
Чекор 5: API ендпоинт за зачувување на претплата
Во Laravel или CI4, креирајте API ендпоинт кој прима JSON за претплата од фронтендот и го зачувува во базата на податоци за претплати.
Пример со Laravel:
Route::post('/save-subscription', function (Request $request) {
$data = $request->all();
// Валидација и санкционирање на податоците ако е потребно
DB::table('subscriptions')->updateOrInsert(
['endpoint' => $data['endpoint']],
[
'public_key' => $data['keys']['p256dh'],
'auth_token' => $data['keys']['auth'],
'content_encoding' => $request->header('Content-Encoding', 'aes128gcm')
]
);
return response()->json(['success' => true]);
});
Пример со CodeIgniter 4:
public function saveSubscription()
{
$data = json_decode($this->request->getBody(), true);
$db = \Config\Database::connect();
$builder = $db->table('subscriptions');
$existing = $builder->getWhere(['endpoint' => $data['endpoint']])->getRow();
if ($existing) {
$builder->where('id', $existing->id)->update([
'public_key' => $data['keys']['p256dh'],
'auth_token' => $data['keys']['auth'],
'content_encoding' => $this->request->getHeaderLine('Content-Encoding') ?? 'aes128gcm',
]);
} else {
$builder->insert([
'endpoint' => $data['endpoint'],
'public_key' => $data['keys']['p256dh'],
'auth_token' => $data['keys']['auth'],
'content_encoding' => $this->request->getHeaderLine('Content-Encoding') ?? 'aes128gcm',
]);
}
return $this->response->setJSON(['success' => true]);
}
Чекор 6: Испраќање на пуш известувања
Користете ја класа WebPush од библиотеката за испраќање известувања до зачуваните претплати.
Пример за Laravel:
use Minishlink\WebPush\WebPush;
use Minishlink\WebPush\Subscription;
$vapid = [
'VAPID' => [
'subject' => 'mailto:[email protected]',
'publicKey' => env('VAPID_PUBLIC_KEY'),
'privateKey' => env('VAPID_PRIVATE_KEY'),
],
];
$webPush = new WebPush($vapid);
$subscriptions = DB::table('subscriptions')->get();
foreach ($subscriptions as $sub) {
$subscription = Subscription::create([
'endpoint' => $sub->endpoint,
'publicKey' => $sub->public_key,
'authToken' => $sub->auth_token,
'contentEncoding' => $sub->content_encoding,
]);
$report = $webPush->sendOneNotification(
$subscription,
json_encode([
'title' => 'Здраво',
'body' => 'Ова е тест пуш известување',
'icon' => '/icon.png',
])
);
if ($report->isSuccess()) {
// Обработка на успех (по желба)
} else {
// По желба: отстранете истекнати претплати
}
}
Слична логика за CodeIgniter 4:
use Minishlink\WebPush\WebPush;
use Minishlink\WebPush\Subscription;
$vapid = [
'VAPID' => [
'subject' => 'mailto:[email protected]',
'publicKey' => $_ENV['VAPID_PUBLIC_KEY'],
'privateKey' => $_ENV['VAPID_PRIVATE_KEY'],
],
];
$webPush = new WebPush($vapid);
$db = \Config\Database::connect();
$subscriptions = $db->table('subscriptions')->get()->getResult();
foreach ($subscriptions as $sub) {
$subscription = Subscription::create([
'endpoint' => $sub->endpoint,
'publicKey' => $sub->public_key,
'authToken' => $sub->auth_token,
'contentEncoding' => $sub->content_encoding,
]);
$report = $webPush->sendOneNotification(
$subscription,
json_encode([
'title' => 'Здраво',
'body' => 'Ова е тест пуш известување',
'icon' => '/icon.png',
])
);
if ($report->isSuccess()) {
// Обработка на успех ако е потребно
} else {
// Обработка на неуспеси (на пример, отстранете валидни претплати)
}
}
Чекор 7: Обработка на истечени или невалидни претплати
Протоколот Веб ПуШ дава повратни информации ако претплата повеќе не е валидна. Важно е да ги отстраните таквите претплати од вашата база за да избегнете ненаменски поврати.
Проверете ги извештаите од sendOneNotification или процесот на испраќање групно и избришете истечени endpoint-ови.
Напредни совети и најдобри практики
- Користете пакетно испраќање со методот
WebPush::sendNotificationза ефикасна обработка на повеќекратни известувања. - Имплементирајте логика на повторување и мониторинг за неуспешни известувања.
- Осигурете ги вашите endpointи — заштитете ги со автентикација за зачувување и испраќање на известувања.
- Подобрете ги payload-ите со богати податоци и функционалности како акции и слики.
- Следете GDPR барања: обезбедете управување со претплатите во согласност со правата на корисниците и согласноста.
Заклучок
Создавањето независна услуга за веб пуш известувања со користење на minishlink/web-push ја овозможува на програмерите и бизнисите целосната контрола врз својот систем за известувања без зависност од надворешни провајдери како OneSignal. Овој пристап ја зголемува приватноста, персонализацијата и ценовната ефективност.
Со следење на чекор-по-чекор туторијалот, можете да имплементирате робустен систем за пуш известувања во рамките на Laravel и CodeIgniter 4. Овој систем ви овозможува директно управување со претплатите, испраќање персонализирани известувања и избегнување на ризиците од зависност од трети страни.
Изградбата на сопствена инфраструктура за пуш известувања е инвестиција во долгорочна сигурност и флексибилност, совпаѓајќи со современите цели за ангажман на корисниците и заштита на приватноста.