Flutter SDK v1.17でPWAを作る

先日、Flutterの最新のWebサポートの紹介において、PWA(Progressive Web Apps)サポートが紹介されていました。
https://medium.com/flutter/flutter-web-support-updates-8b14bfe6a908

PWAサポートはまだ開発中の段階のため、今後も改善や修正が入っていくことと思いますが、現在でも既存のFlutter Webアプリに少し手を入れるだけでPWAサポートを追加することが出来ました。

というわけで、試してみた結果を残しておきます。

manifest.jsonの追加とindex.html の編集

この記事を書いている時点の最新版SDK v1.17でWebサポートを有効にした状態の flutter create コマンドを実行すると、web/ディレクトリにmanifest.jsonファイルが生成されるようになっています。
{
    "name": "pwa_web_app",
    "short_name": "pwa_web_app",
    "start_url": ".",
    "display": "minimal-ui",
    "background_color": "#0175C2",
    "theme_color": "#0175C2",
    "description": "A new Flutter project.",
    "orientation": "portrait-primary",
    "prefer_related_applications": false,
    "icons": [
        {
            "src": "icons/Icon-192.png",
            "sizes": "192x192",
            "type": "image/png"
        },
        {
            "src": "icons/Icon-512.png",
            "sizes": "512x512",
            "type": "image/png"
        }
    ]
}
また、index.htmlファイルの内容も次のように変化しています。
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta content="IE=Edge" http-equiv="X-UA-Compatible">
  <meta name="description" content="A new Flutter project.">

  <!-- iOS meta tags & icons -->
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black">
  <meta name="apple-mobile-web-app-title" content="pwa_web_app">
  <link rel="apple-touch-icon" href="icons/Icon-192.png">

  <!-- Favicon -->
  <link rel="shortcut icon" type="image/png" href="favicon.png"/>

  <title>pwa_web_app</title>
  <link rel="manifest" href="manifest.json">
</head>
<body>
  <!-- This script installs service_worker.js to provide PWA functionality to
       application. For more information, see:
       https://developers.google.com/web/fundamentals/primers/service-workers -->
  <script>
    if ('serviceWorker' in navigator) {
      window.addEventListener('load', function () {
        navigator.serviceWorker.register('flutter_service_worker.js');
      });
    }
  </script>
  <script src="main.dart.js" type="application/javascript"></script>
</body>
</html>
この状態で flutter build webを使ってビルドを行えば、PWAの基本的なサポートが入った状態のoutputが得られます。
詳細な情報については、 https://web.dev/progressive-web-apps/#installable から確認が可能です。

既存のアプリに適用する

既存のアプリに適用するには、上記のmanifest.json, index.htmlの2ファイルをweb/フォルダに配置します。
また、最新版のSDKでビルドができるよう、flutter pub upgrade を使った依存packageの更新も必要になるかもしれません。

もしもindex.htmlを編集している場合は、manifest参照用のmetaタグと、ServiceWorker用のscriptダグを追記しましょう。

また各種サイズのアプリアイコンも新たに用意する必要があるかもしれません。
PWAとしては、最低限192×192、512×512サイズのアイコンを用意する必要があります。

以上の対応を行うことで単純なアプリであればPWA対応のbuildファイルが書き出されているはずです。

まとめ

  • flutter createで作成されるwebのtemplateがPWAをサポートした
  • 既存のFlutter webアプリでもtemplateから必要なファイルを適用することでPWA化し始めることができる
対応したアプリケーションはこちらです。
(本記事とは逸れますが、CanvasKitを利用する設定でビルドしています。)

https://ymegane.github.io/TapTapTap2/#/

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA