プログレッシブウェブアプリについて

[Progressive Web Apps](https://medium.freecodecamp.org/an-introduction-to-progressive-web-apps-6aa75f32816f)と[Service workers](https://medium.freecodecamp.org/service-workers-the-little-heroes-behind-progressive-web-apps-431cc22d0f160)について良記事があったのでこちらの知識も踏まえざっくり分かりやすくして説明します。

# 1. モバイルアプリ開発の選択肢色々
| 名前 | 説明 |
|:--|:--|
|★Progressive Web App | デバイスがサポートする機能をベースとしたHTMLベースのアプリケーション。<br>オフライン利用可能/Push通知可能/ローカルキャッシュ機能/フルスクリーン表示/セキュア/高速な読み込み |
|Native App| Android/IOSをそれぞれのSDKで完全に別のプラットフォームとして作成する必要がある。 |
|Hybrid Apps|**・Phonegap(HTML5 => Native)**<br>**・Xamarin(C#=>Native)**<br>└IOS/Androidとプロジェクトが別になるのでメリットをあまり感じない<br>**・ReactNative(JavascriptES5,6 => Native)**<br>└コードは完全に共通化されるがIOS/Androidで共通出ない機能については利用できないか書き分けが必要|
|▲Web View App|Webサイトと同等のアプリケーション<br>Nativeアプリ中のWebViewを実装して作成する事がある<br>WebViewの中身だけHTMLベースのウェブサイト<br>└アプリとサイトの両方必要な場合に開発コスト減<br>└ただしNativeの機能がほぼ扱えない|

Progressive Web App はWeb View Appの高機能な代替案になっていく事と思われます。

# 2. Progressive Web Appsの主な機能
Progressive Web Appsとはアプリ開発の選択肢の中の一つです。
Service workersというプログラミング可能なwebページとnetwork間のproxyで下記の様な機能を実装しています。
Service workersは現在Chrome上に実装されていて、IOS 11.3,macOS 10.13.4にも実装予定なので、今後Android,IOSの両方で利用していく事ができます。

とても魅力的な点は2点
1. オフラインで使える
2. プッシュ通知を受け取れる

それではこれらが技術的にどうやって実装されているのか確認しましょう。

ServiceWorkerとはメインスレッドとは別で動いているJavascriptファイルベースのワーカープロセスです。
別スレッドなのでDOMアクセスはできませんがLocalStorageAPI,XHRAPIはChannel Messaging APIを経由してメインスレッドへメッセージを返します。

Service WorkersはWeb APIのPromises,Fetch API,Cache APIを(*HTTPSしか使えないので注意)利用します。
今まで、制御できなかったキャッシュ部分が制御できるようになり、画像やCSSなどのアセットプリローディング、キャッシュクリアができ、なおかつオフラインで利用できます。サーバーサイドの更新リクエストをオフライン時にキューイングしてオンライン時にまとめて実行するなどする事が可能です。

<img width="906" alt="スクリーンショット 2018-02-08 14.44.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/89997/042445b2-ab4f-4fa6-09b8-80c6e0db17f0.png">

[Fetch](https://flaviocopes.com/fetch-api/),[Cache](https://flaviocopes.com/cache-api/),[Push](https://flaviocopes.com/push-api/)

# 3. PUSHのサンプルを試してみる
https://github.com/GoogleChrome/samples/tree/gh-pages/push-messaging-and-notifications

## 3.1 Developperコンソール
1.Firebase Developer Consoleでプロジェクトを作成
2.Settings (左隅のあたり)にいき, 'Cloud Messaging Tab'をクリック

```
$ git clone https://github.com/GoogleChrome/samples.git chrome
$ cd chrome/push-messaging-and-notifications

# 3.「config.sample.js」を「config.js」という名前でコピー
$ cp config.sample.js config.js

# 4.「manifest.sample.json」を「manifest.json」という名前でコピー
$ cp manifest.sample.json manifest.json

# 5.「config.js」の中の<Your Cloud Messaging API Key ...> を新規にFirebase上に作成したAPI keyに書き換える
$ vi config.js

# 6.「manifest.json」の中の<Your Cloud Sender ID ...> Firebaseコンソール上のsender IDに書き換える
$ vi manifest.json
```

## 3.2 サーバーインストール
```
$ vi package.json
{
  "name": "simple-serviceworker-tutorial",
  "private": true,
  "scripts": {
    "start": "http-server -c-1"
  },
  "devDependencies": {
    "http-server": "0.8.5"
  }
}

$ npm install --save
$ npm start
$ open http://localhost:8080/

```

## 3.3 PUSH配信
1. 画面上の「Enable Push Messages」をクリック
2. ChromeのデバックツールよりPUSHメッセージを送信する

![スクリーンショット 2018-02-08 17.42.10.png](https://qiita-image-store.s3.amazonaws.com/0/89997/6ec511c9-50fd-e47f-aa1b-e69b1c7abdf2.png)

PUSHボタンをクリックすると
<img width="346" alt="スクリーンショット 2018-02-08 17.41.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/89997/c55250db-28aa-9abf-bad0-e1c9c1067fc2.png">
無事にメッセージが届く事が確認できました。