Мобилне апликације су скоро постале незаменљиве за предузећа због своје способности да корисницима пруже потребне услуге брзо и са лакоћом. Међутим, шта ако вам кажем да је могуће имати искуство слично мобилној апликацији на вебу? За то служе прогресивне веб апликације (ПВА).
Све је већа потражња за мобилним апликацијама, као што је показало истраживање Топ Десигн Фирмс . У 2022. години, скоро половина – 48% – малих предузећа је имала своје мобилне апликације у поређењу са једном трећином од 32% у 2021. Овај тренд показује промену у потребама корисника који захтевају интеракције сличне мобилним уређајима на свим платформама.
Развојем ПВА, предузећа могу директно да пруже ово искуство изворне апликације преко веб претраживача, дајући крајњим корисницима поуздану и привлачну апликацију без потребе за посебном мобилном апликацијом
Прогресивна веб апликација је апликација која корисницима пружа изворну подршку, сродну мобилним уређајима, без потребе за прављењем уз разматрање специфичних за платформу која варира од Андроид-а преко ИОС-а до десктоп рачунара. Они су лагани, доступни на свим уређајима и аутоматски се ажурирају када су повезани на интернет.
Недавно сам истраживао најбоље могуће да своју НектЈс апликацију учиним прогресивном веб апликацијом када сам наишао на коментар на Реддиту испод о недавним ажурирањима Нект.јс укључујући изворну подршку за ПВА.
Погледајте коментар овде .
Након прегледа ажурирања, могу рећи да никада није било лакше креирати ПВА и то ћу доказати.
ПС: Две датотеке су веома важне да би се ваша апликација препознала као ПВА – датотека манифеста и датотека сервисера .
npx create-next-app@latest my-pwa-app
Ор
yarn create next-app my-pwa-app
Након што покренете команду, пратите упутства за спецификације ваше инсталације, а затим идите у директоријум пројекта
cd my-pwa-app
Покрените дев сервер
npm run dev
Направите датотеку manifest.json
или manifest.ts
у директоријуму app
.
import type { MetadataRoute } from 'next' export default function manifest(): MetadataRoute.Manifest { return { name: 'Next.js PWA', short_name: 'NextPWA', description: 'A Progressive Web App built with Next.js', start_url: '/', display: 'standalone', background_color: '#ffffff', theme_color: '#000000', icons: [ { src: '/icon-192x192.png', sizes: '192x192', type: 'image/png', }, { src: '/icon-512x512.png', sizes: '512x512', type: 'image/png', }, ], } }
standalone
minimal-ui
fullscreen
или browser
src
, size
и type
. За ваш ПВА, важно је да имате најмање иконе величине 192x192
и 512x512
.Веб локације као што је манифест-генератор могу се користити за брзо генерисање датотеке манифеста и различитих величина икона
Сервисни радник би слушао пусх догађаје и извршио доњу функцију за пусх обавештења
self.addEventListener("push", function (event) { if (event.data) { const data = event.data.json(); const options = { body: data.body, icon: data.icon || '/icon.png', badge: "/icons/timer-icon-144.png", vibrate: [100, 50, 100], data: { dateOfArrival: Date.now(), primaryKey: "5", }, }; event.waitUntil(self.registration.showNotification(data.title, options)); } }); self.addEventListener("notificationclick", function (event) { console.log("Notification click received."); event.notification.close(); event.waitUntil(clients.openWindow("<https://your-website.com>")); //This should be the url to your website });
Да бисте регистровали сервисера, потребно је да наведете руту на којој се креира сервисер.
const registration = await navigator.serviceWorker.register("/sw.js", { //provide the route to the service worker scope: "/", updateViaCache: "none", });
Инсталирајте веб-пусх за руковање обавештењима и претплатама
npm install web-push --save
Затим морамо да добијемо претплату ако је корисник има или да претплатимо корисника да гура догађаје. У стварној апликацији, ову претплату треба послати на сервер за складиштење
async function registerServiceWorker() { const registration = await navigator.serviceWorker.register("/sw.js", { scope: "/", updateViaCache: "none", }); const sub = await registration.pushManager.getSubscription(); if (sub) { setSubscription(sub); //This would be sent to a server } else { const pushSubscription = await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY, // Your VAPID public key }); setSubscription(pushSubscription); } }
Да бисте генерисали ВАПИД кључеве, покрените:
npx web-push generate-vapid-keys
Све то састављамо за кориснички интерфејс са функцијом за тестирање пусх обавештења
"use client"; import { useEffect, useState } from "react"; const Home = () => { const [subscription, setSubscription] = useState<PushSubscription | null>( null ); useEffect(() => { if ("serviceWorker" in navigator && "PushManager" in window) { registerServiceWorker(); } }, []); async function registerServiceWorker() { const registration = await navigator.serviceWorker.register("/sw.js", { //provide the route to the service worker scope: "/", updateViaCache: "none", }); const sub = await registration.pushManager.getSubscription(); if (sub) { setSubscription(sub); //This would be sent to a server } else { const pushSubscription = await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY, // Your VAPID public key }); setSubscription(pushSubscription); } } //Create a function to test the notification const handleSendNotification = async () => { await fetch("/api/sendNotification", { method: "POST", body: JSON.stringify({ message: "Your timer has completed!", subscription: subscription, // This ideally, should not be included in the body. It should have already been saved on the server }), headers: { "Content-Type": "application/json", }, }); }; return ( <div> <h1>My PWA with Push Notifications</h1> <button onClick={handleSendNotification}>Notify Me!</button> </div> ); }; export default Home;
app
направите нову фасциклу под називом api
.api
фасцикле, направите другу фасциклу под називом sendNotification
.sendNotification
креирајте датотеку под називом route.ts
.
Структура треба да буде следећа
app/ └── api/ └── sendNotification/ └── route.ts
У датотеку роуте.тс укључите следеће линије кода
import { NextResponse } from "next/server"; import webpush from "web-push"; webpush.setVapidDetails( "mailto:[email protected]", // Your email process.env.NEXT_PUBLIC_VAPID_PUBLIC_KEY!, process.env.VAPID_PRIVATE_KEY! ); export async function POST(req: Request) { const { message, subscription } = await req.json(); if (!subscription) { return NextResponse.json( { error: "No subscription available" }, { status: 400 } ); } try { await webpush.sendNotification( subscription, JSON.stringify({ title: "Notification", body: message }) ); return NextResponse.json({ success: true }); } catch (error) { console.error("Error sending notification:", error); return NextResponse.json( { error: "Failed to send notification" }, { status: 500 } ); } }
Да бисте потврдили да је апликација сада ПВА, икона за преузимање би требало да се појави крајње десно у УРЛ траци. Такође би требало да будете у могућности да видите информације о веб манифесту на картици апликација.
Недавна исправка Нект.јс са изворном ПВА подршком учинила је процес креирања прогресивних веб апликација веома беспрекорним. Уз Нект.јс, развој и примена ПВА је сада једноставан процес у делу модерног веб развоја, јер програмери сада могу брзо да креирају апликације са функцијама сличним изворном језику које корисници очекују, све из веб претраживача.