Hi, I am Trishul

@trishulgoel

Progressive Web Apps

(aka PWA)

WHAT

@trishulgoel

@trishulgoel

"theyโ€™re just websites that took all the right vitamins."

- Alex Russell

https://medium.com/@slightlylate/progressive-apps-escaping-tabs-without-losing-our-soul-3b93a8561955

@trishulgoel

WEBSITE

NATIVE APP

PWA

@trishulgoel

Discoverability

of

web

Retention

of

app

PWA

WHY

@trishulgoel

PUSH NOTIFICATIONS

APP LIKE EXPERIENCE

@trishulgoel

WORKS OFFLINE

FASTER LOAD TIME

INSTALLABLE

SERVICEWORKERS

@trishulgoel

BUILDING BLOCKS OF PWA

@trishulgoel

@trishulgoel

CACHING

@trishulgoel

self.addEventListener('install', function(event) {
  event.waitUntil(
    caches.open('my-cahce').then(function(cache) {
      return cache.addAll(
        [
          '/css/style.css',
          '/js/script.js',
          '/index.html'
        ]
      );
    })
  );
});

self.addEventListener('fetch', function(event) {
  event.respondWith(
    caches.match(event.request).then(function(response) {
      if(!response) response = fetch(event.request);
      return response;
    })
  );
});

@trishulgoel

PUSH NOTIFICATIONS

@trishulgoel

self.addEventListener('activate', async () => {
  try {
    const options = {}
    const subscription = await self.registration.pushManager.subscribe(options)
  } catch (err) {
    console.log('Error', err)
  }
})

self.addEventListener('push', function(event) {
  if (event.data) {
    self.registration.showNotification("Here we are", event.data.text(),
  }
})

PWA on STEROIDS

@trishulgoel

PREREQUISITES

@trishulgoel

- HTTPS

- Browser Compatibility

@trishulgoel

STEROIDS

@trishulgoel

VIBRATION

@trishulgoel


  window.navigator.vibrate(200);
  window.navigator.vibrate([300, 200, 400, 200, 300]);

VISIBILITY

@trishulgoel

  
 document.addEventListener("visibilityChange", fn);

SPEECH SYNTHESIS

@trishulgoel


 const synth = window.speechSynthesis;
 const voices = synth.getVoices();

 const say = new SpeechSynthesisUtterance(text);
 say.voice = voices[<selectedindex>];
 say.rate = <rate>;
 say.pitch = <pitch>;
 
 synth.speak(say);

SPEECH RECOGNITION

@trishulgoel


 const recognition = new webkitSpeechRecognition();
 recognition.onstart = fn;
 recognition.onerror = fn;
 recognition.onend = fn;
 recognition.onresult = fn;

NETWORK INFO

@trishulgoel


 navigator.onLine

 navigator.connection.type
 navigator.connection.effectiveType //bandwidth
 navigator.connection.saveData
 navigator.connection.downlink

ORIENTATION

@trishulgoel


 window.addEventListener('deviceorientation', handleOrientation);

 function handleOrientation(event) {
    const x = event.beta;  // In degree in the range [-180,180]
    const y = event.gamma; // In degree in the range [-90,90]
 }

BLUETOOTH

@trishulgoel


 const device = await navigator.bluetooth.requestDevice({
      filters: [{ namePrefix: 'Device-name' }],
      optionalServices: [ 0xfff0 ] // what service(s)? -> uuid
 });

 const server = await device.gatt.connect();
 const service = await server.getPrimaryService( 0xffe5 );
 const characteristic = await service.getCharacteristic( 0xffe9 );

 characteristic.writeValue(
     new Uint8Array( .... ) // 'value' -> bytes
 );

MANY MORE...

@trishulgoel

- Media Capture API

- web Audio API

- GeoLocation API

- Memory API

- WebUSB API

PROS & CONS

@trishulgoel

@trishulgoel

- DISCOVERABLE

- SHARABLE

- PLATFORM AGNOSTIC

- EASILY UPDATES

- LIGHTWEIGHT

- BROWSER APIs SUPPORT

- NOT ON PLAYSTORE(?)

- iOS ๐Ÿ˜ž

PROS

CONS

SUCCESS STORIES

@trishulgoel

@trishulgoel

https://developers.google.com/web/showcase/

FUTURE

@trishulgoel

- WEBASSEMBLY ๐Ÿ˜Ž

- MORE APIs

- BETTER BROWSER SUPPORT

@trishulgoel

REFERENCES

- https://serviceworke.rs

- https://developer.mozilla.org

- https://developers.google.com/

@trishulgoel

LET'S DO IT!

@trishulgoel

@trishulgoel

@trishulgoel

PWA

By Trishul Goel

PWA

Take the web offline with service workers

  • 1,990