2021年11月19日金曜日

Oracle APEX 21.2新機能(16) - PWAのサポート

 Oracle APEX 21.2よりPWA - Progressive Web Appのサポートが始まりました。21.2にて提供される機能は、以下の4つのようです。

  1. アプリケーションのインストールができる。
  2. 静的ファイルなファイルがキャッシュされる。
  3. オフライン時に表示される画面を定義できる。
  4. JavaScriptライブラリとしてapex.pwaが提供される。
この機能を開発したVincent Morneauさんによる解説がOffice Hourの録画として公開されています。詳細については、この録画を試聴するのがよいでしょう。Oracle APEX 21.2でのPWAの実装には、プッシュでの通知やオフラインで動作するコンポーネントといったものは含まれていません。そのため、作成済みのAPEXアプリケーションをPWAとしてインストールすると、ネットワークに接続していなくても同様に操作できるようになる、といったものではありません

上記の4つの機能について確認してみます。

アプリケーションのインストールができる


アプリケーション作成ウィザード機能に、プログレッシブWebアプリケーションのインストールが追加されています。


この機能チェックを入れアプリケーションの作成します。名前従業員一覧としていますが、何でもかまいません。アプリケーションが作成された後に、ホーム・ページに表EMPを一覧する対話モード・レポートを追加しています。

アプリケーション定義の編集を開きます。名前アプリケーションの別名が日本語の場合は英数字の別名に置き換えます。ここではpwaempに変更しています。また、簡易URLONであることを確認します。PWAを有効にするには、アプリケーションへのアクセスがhttpsで構成されていること(またはlocalhostであること)、および、簡易URLが有効であることが前提条件です。


アプリケーションの定義としてプログレッシブWebアプリケーションのセクションが追加されています。プログレッシブWEBアプリケーションの有効化ONインストール可能ONであれば、アプリケーションをPWAとしてインストールできるようになります。

その他の情報は、manufest.jsonに含まれる設定になります。


ブラウザの開発者ツールを使うと、PWAとしてインストールしたアプリケーションのmanufest.jsonの内容を表示することができます。APEXアプリケーションでの設定内容が反映されていることが確認できます。


インストール可能ONであれば、ナビゲーション・バーにアプリケーションのインストールが表示されます。


macOSのChromeで開いている場合、これをクリックすると、アプリをインストールしますか?と確認されます。


macOSのMicrosoft Edgeでも同様に、以下のように表示されました。


すでにアプリケーションがインストール済みの場合「ご使用のデバイスまたはブラウザは、現在プログレッシブWebアプリケーションのインストールをサポートしていないようです。」とメッセージが表示されることがあります。本当にPWAをサポートしていないかどうかは、それぞれのブラウザの仕様を確認する必要があります。

アプリケーションをインストールして実行すると、ブラウザに関するUIがなくなります。

Chromeの場合は、chrome://apps/にインストールされたアプリケーションが追加されます。

macOSの場合は、Launchpadにも追加されます。

iOSのSafariでは以下のようにインストール手順が案内されます。

アプリケーションをインストールすると、アイコンがホーム画面に追加されます。

ホーム画面から実行したアプリケーションには、ブラウザのUIは含まれません。


静的ファイルなファイルがキャッシュされる


開発者ツールを開き、インストールされたアプリケーションについて確認します。

アプリケーション・タブを開き、キャッシュ・ストレージを確認します。いくつかのファイルがキャッシュされていることが確認できます。

アプリケーションService Workersからは、Service Workerが実行されていることが確認できます。


オフライン時に表示される画面を定義できる


Service Workersオフラインチェックを入れ、オフラインになったときの動作を確認します。(オンラインに戻すにはオフラインのチェックを外すだけではなく、開発者ツールを閉じる必要があるようです。

接続できません、というメッセージと再試行のボタンが表示されます。

この画面に表示されるメッセージはカスタマイズできます。

共有コンポーネントテキスト・メッセージとして、表示するメッセージを登録します。


テキスト・メッセージの作成を実行します。


APEX.PWA.OFFLINE.TITLEとして、画面のタイトルとなる文字列を登録します。


APEX.PWA.OFFLINE.BODYとして、画面の<body>...</body>のタグ内に記述する内容を登録します。

以上のようにテキスト・メッセージを作成すると、オフライン時の画面は以下になります。

オフライン時の画面では、html、body、main、svg、h1、p、buttonといったタグにスタイルが設定されています。画面表示をカスタマイズする際には、ページのソースに含まれるスタイルの定義を確認しておくとよいでしょう。

今回の例では、以下のHTMLが生成されていました。

<html lang="ja">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="color-scheme" content="dark light" />
    <title>アプリケーションはオフラインです。</title>
    <style>
      html {
        font-size: 100%;
      }

      body {
        font: 1.25rem system-ui, -apple-system, system-ui, sans-serif;
        display: flex;
        justify-content: center;
        text-align: center;
        padding: 1rem;
        min-width: 320px;
      }

      main {
        align-self: center;
      }

      svg {
        max-width: calc(100% - 2rem);
        width: 20rem;
        margin-bottom: 2rem;
      }

      h1 {
        font-size: 2.5rem;
        margin-block-start: 0;
        margin-block-end: 1rem;
      }

      p {
        font-size: 1.25rem;
        margin-block-start: 0;
        margin-block-end: 2rem;
      }

      button {
        background-color: #006BD8;
        color: #fff;
        border-radius: .25rem;
        font-size: 1rem;
        padding: .75rem 2rem;
        border: none;
        cursor: pointer;
        min-width: 8rem;
      }
    </style>
  </head>
  <body><main>
<h1>オフライン時のメッセージです。</h1>
<button type="button" onclick="window.location.reload()">リロード</button>
</main></body>
</html>


JavaScriptライブラリとしてapex.pwaが提供される


PWAのサポートに伴って追加されたネームスペースのapex.pwaですが、マニュアルの記載は以下になります。

https://docs.oracle.com/en/database/oracle/application-express/21.2/aexjs/apex.pwa.html

ページ・アイテムを作成し動的アクションを定義して、apex.pwa.getDisplayMode()の結果を表示させてみます。

ページ・アイテムを作成します。タイプテキスト・フィールドです。名前などは任意に決めて大丈夫です。


動的アクションを作成します。タイミングはデフォルトのまま変更しません。


TRUEアクションとして値の設定を選択します。設定タイプの設定にはJavaScript Expressionを選び、JavaScript式としてapex.pwa.getDisplayMode()を記載します。影響を受ける要素として、動的アクションを定義したページ・アイテムを選択します。実行オプション初期化時に実行ONにします。こうすることで、ページが表示されたときにページ・アイテムに表示モードが表示されます。


アプリケーションを実行して、表示モードを確認します。

ブラウザ上でアプリケーションを実行していると、表示モードはbrowserとなっています。


PWAとして実行しているときは、表示モードがstandaloneとなっています。


フルスクリーン表示をすると、表示モードはfullscreenとなります。(ちなみにiOSでPWAを実行すると必ず全画面表示ですが、表示モードはstandaloneでした。)


JavaScriptを記述する際にPWAであるかどうかを意識する必要がある場合は、表示モードによって条件分けができます。

他にgetInstallText、isInstallable、openInstallDialogのファンクションが定義されています。これらはPWAのインストール手順のカスタマイズに使用できます。

Oracle APEX 21.2の新機能であるPWAのサポートの紹介は以上です。

Oracle APEXのPWAサポートは始まったばかりでまだまだではありますが、今後の展開に期待できます。