2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DartAdvent Calendar 2018

Day 12

Dart で PWA (5) PostMessage

Last updated at Posted at 2018-12-11

前回の続きです。

今回は、Vue.dart を紹介する予定でしたが、
※ 当初はBuildRunner を 紹介して、 同等のものが作れる知識を得てもらった上で、Vue.dart の コードを解説しようと思っていたのですが..

PWA.dart解説のキリが良さそうなので、PWAの解説をします。
一応、これが、 最後の予定

Index
(1) Hello World PWA
(2) Add to Home
(3) Standard Web Notification
(4) Hook request and Do original processing
(5) Post message

Code
https://github.com/kyorohiro/memo_pwa_2018

今回は、 Background で動作している ServiceWorker と、  Front で動作している JavaScript と 通信する方法について紹介します。

Worker

Workder を使うことで、 Background Task を 簡単に作ることができます。 Front と通信して、別Thread でアレコレすることができます。
 ServiceWorker も Worker なので、 Front ろと通信することが可能です。

通信してみる

ボタンを押すと、Backgroundにメッセージを送信する

main.dart
import 'package:service_worker/window.dart' as sw;
import 'dart:html' as html;
 main() async {
  if(!sw.isSupported) {
    print(">> service worker is not support ");
    return;
  }
  print(">> service worker is support ");
  await sw.register("sw.dart.js");
  sw.onMessage.listen((sw.MessageEvent e) {
    print(">> receive: ${e.data} ");
  });
  html.querySelector("#btn").onClick.listen((html.MouseEvent e){
    sw.controller.postMessage("Hello,World");
  });
}

ECHOサーバーを作成する

sw.dart
import 'package:service_worker/worker.dart' as sw;

void main() {
  String cacheName = "v0.0.1";

  sw.onInstall.listen((sw.InstallEvent e) async {
     e.waitUntil(sw.skipWaiting()); // Activate worker immediately
  });

  sw.onActivate.listen((sw.ExtendableEvent e){
    print("##>> activate");
    // https://stackoverflow.com/questions/38168276/navigator-serviceworker-controller-is-null-until-page-refresh
    e.waitUntil(sw.clients.claim()); // Become available to all pages
  });


  //
  // message
  //
  sw.onMessage.listen((sw.ExtendableMessageEvent e){
    sw.clients.matchAll().then((List<sw.ServiceWorkerClient> cls) {
      cls.forEach((sw.ServiceWorkerClient cl){
        print("receive: ${e.data} : ${e.source.toString()}");
        cl.postMessage(e.data);
      });
    });
  });
}

確認

サーバーを起動

webdev serve --release

ブラウザーでアクセス

スクリーンショット 2018-12-11 2.21.17.png

ボタンを押す

スクリーンショット 2018-12-11 2.21.39.png

Ref

2018年12月の時点の、動くように改造した物を、以下に起きましたしました。
https://github.com/kyorohiro/memo_pwa_2018
https://github.com/kyorohiro/pwa
https://github.com/kyorohiro/service_worker

PS

https://github.com/isoos/pwa が masterブランチで、
一部、動かなかったので、フォークして修正しています。
https://github.com/kyorohiro/pwa

今回は、修正したものを使用しています。

次回

Firebase とか WASMとの連携とか
Web Bluetooth とか
PWA用のStorage とか

おわり

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?