ãã¯ããããããŸãïŒéææ¥ã®äŒã¿ã䜿ã£ãŠwebPushéç¥æ©èœã远å ããŸãããããã§ãã©ãŠã¶éããŠãéç¥ãããããã«ãªããŸãïŒLaravelåŽã¯ãèŠãã§ããŸãããã©ãããæè¡ã䜿çšãããæžããŠãããŸãïŒãŸãLaravelã®æ¡åŒµã©ã€ãã©ãªã䜿çšããŸããïŒ
äžèšã®ãªã³ã¯ãåç
§ãã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŠã¿ãŠãã ããïŒhttps://laravel-notification-channels.com/webpush/#installation
ã€ã³ã¹ããŒã«æé ã¯ãªã³ã¯å
ã«æžããŠããŸãã®ã§ããããåç
§ããã®åŸããã³ãåŽãèšå®ããŸãïŒäžèšã¯äœãããã®ã³ãŒãã§ããéç¥ç»é²ãå¯èœã§ããã¯ãšã³ãåŽããã¹ã±ãžã¥ãŒã«ã§éç¥ãé£ã°ãããšãåºæ¥ãŸãïŒ
ããã³ãåŽã¯ãµãŒãã¹ã¯ãŒã«ãŒã®JSãã¡ã€ã«ãšãŠãŒã¶ãŒéç¥ã®èš±å¯è¡ãããã®æ
å ±ãããã¯ãšã³ãã«æž¡ãåŠçãã¡ã€ã«ãååšããŸãïŒãµãŒãã¹ã¯ãŒã«ãŒJSã³ãŒãã¯ã°ã°ãã°æžãæ¹ãåºãŠããã®ã§æ€çŽ¢ããŠã¿ãŠãã ããïŒ
å
¬éããã®ã¯éç¥èš±å¯ãè¡ãæ¹ã®ãã¡ã€ã«ã«ãªããŸãðããšãã³ããšããŠããã¯ãšã³ããå°ãå
¬éããŸãïŒ
const vapidPublicKey = import.meta.env.VITE_VAPID_PUBLIC_KEY;
async function setupPushNotifications() {
if (Notification.permission === 'granted') {
try {
// ãµãŒãã¹ã¯ãŒã«ãŒãç»é²
await navigator.serviceWorker.register('/assets/js/npush-service-worker.js').then(async(registration) => {
if ('serviceWorker' in navigator && 'PushManager' in window) {
try {
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(vapidPublicKey),
});
const response = await fetch('/save-subscription', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-CSRF-Token': document.querySelector('[name="csrf-token"]').content
},
body: JSON.stringify(subscription),
});
if (!response.ok) throw new Error('ãµãã¹ã¯ãªãã·ã§ã³ã®ä¿åã«å€±æããŸãã');
new Notification('ãç»é²', {
body: 'ãç»é²æé£ã埡座ããŸã',
});
} catch (error) {
console.error('Push subscription error:', error);
}
} else if (result !== 'granted') {
console.log('éç¥ã®æš©éãæåŠãããŸããã');
}
});
console.log('ãµãŒãã¹ã¯ãŒã«ãŒãæ£åžžã«ç»é²ãããŸãã');
} catch (error) {
console.error('ãµãŒãã¹ã¯ãŒã«ãŒã®ç»é²ã«å€±æããŸãã:', error);
}
}
}
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;
}
document.getElementById('enable-notifications').addEventListener('click', async () => {
const permission = await Notification.requestPermission();
if (permission === 'granted') {
setupPushNotifications();
} else {
console.log('éç¥ã®æš©éãæåŠãããŸããã');
}
});
ããã§éç¥ã®èå¥ããŒã¿ãååŸãç»é²ãå¯èœã«ãªããŸãïŒç»é²ãããããŒã¿ãå
ã«åå¥éç¥ãå
šå¡ã«éç¥ãªã©ãå¯èœã«ãªããŸãïŒãªããäŒå¡ç»é²ããããŠãŒã¶ãŒã®ã¿éç¥ãé£ã¶ã·ã¹ãã ã§ãïŒ
$endpoint = $request->endpoint;
$token = $request->keys['auth'];
$key = $request->keys['p256dh'];
$user = $request->user();
$user->updatePushSubscription($endpoint, $key, $token);
äžèšã®ããŒã¿ãããã¯ãšã³ãåŽã«ä¿åãããŸãïŒããã䜿çšããŠãŒã¶ãŒã«ã©ã®ããã«éä¿¡ããã°è¯ããïŒ
use App\Notifications\Reserved;
$user = User::find(1);
$user->notify(new Reserved($reservation));
ãããªæãã ãšæã£ãŠãã ããïŒæç²ããŠããã®ã§ãããŸã§ããã³ãã§ãïŒããšã¯ãèªèº«ã§èããŠå¯Ÿå¿ããŠãã ããïŒ
ææ¥ãžç¶ã