Simple guide to creating quick Progressive web apps.
- install on homepage
- access app offline
- push notifications
- Made with device specific SDK
- publish on store then installed
- runs on device and has access to device features
- used offline and has notifications
- uses Web tech
- accessed via web
- can be installed
- used offline and push notification
- Basic project template set up
- Json file with info for browser on how to display the app on phone
- Root of the project
manifest.json
- Json file
- short_name -> used for icon name on device.
- display:standalone -> not like browser
- background_color -> when first loading app
- orientation -> portrait-primary
- inco-> add array of icon
- Link json in all html files
<link rel="manifest" href="/manifest.json">
- android studio
- go to pc loclhoset address 10.0.2.2:portn
- icon not suported
- insert link in html
<link rel="apple-touch-icon" href="img/icons/88.png">
<link rel="apple-touch-icon" href="img/icons/256.png">
<!-- and so on-->
- For status bar
<meta name="apple-mobile-web-app-status-bar" content="#aa7700">
- Load content offline without internet
- sync data upon connection
- push notification
- Runs on a diffrent thread irrespective of html page (has not acess to DOM)
- background process
- listens for event in background to reposed accordingly
- project we create
sw.js
giving it global scope - first register it on browser with app.js or main js
- upon registration its put on separate sw thread
- fires installs event (we can do multiple manipulations here)
- fires active event (sw now listens for events)
- upon refresh does nothing unless sw code changes
- new sw active event gets strted only when app tab/browser with old SW are closed
- created in root dir
sw.js
for global access
- look for browser support
- returns promise
// Service worker registration
if ('serviceWorker' in navigator){
navigator.serviceWorker.register('sw.js').then((reg)=>{
console.log("service worker registered ", reg)
}).catch((error)=> console.log("Could not register worker", error));
} else console.log("SW not supported");
- while sw is being installed 'install event' is triggred
- we lsiten for this on sw.js
- Install event wont be triggred again unless
sw.js
file has changes - we could use this to add assets for offline mode (css, js and so on)
- Keep devtools -> update on reload checked
- save a trip to server on fetch
- look for items in cashe and try to work offline when possible
- load content offline using cashe api
- storing assets locally
- disable browser cashed and we store cashe using sw
- sw store assets from server in cashe
- if we go offline sw looks up cashe Resourses we need to cashe
- App shell assets that dont change over time
- We do it inside install event handler
self.addEventListener('install', (evt) =>{
// console.log('Install Triggered', evt);
evt.waitUntil(
caches.open(staticCacheName).then((cache)=>{
console.warn('adding assets');
cache.addAll(assets);
console.warn('Done assets');
});
);
});
-
check chashe for fetch request insted of server
-
fetch event listner
we can intercept here -
on fetch check if resource exists in cache
self.addEventListener('fetch', (evt)=> {
//console.log(evt);
evt.respondWith(caches.match(evt.request).then( response => {
return response || fetch(evt.request);
}
))
- delete previous caches
- update new cache based on version currently
- in activate so new cache is worked on before fetch
Caching approch
- wait for user to browse pages to cache
- casche response form server into dynamic assets
- if the page has been cached brose it if not add to dynamic
What if user visits the page while offline
- get a 404 for offline page
- Show a fallback page when offline.
- Create a fallback page.
- store it in static cache
- make sure to only display it if the request is resourcing a page. not image or css or something.
Limit cache to numbe of items
- cache size limit function.
- acessing DATA in PWA
- google firebase
- create project -> database
- new collection -> documents -> title and recipes