取引先は Certilife と同じ、ただし手がける縦のラインは違います。Brightmall は commerce 側です。ウェブを主役にした storefront を iOS アプリでもう一枚包み、端末のホーム画面に置けるようにし、App Store を通じて出荷し、ウェブだけでは抱えきれないプラットフォーム固有の責任を一緒に背負わせます。
アプリケーションは Swift・UIKit・Combine、そして SPM のみの依存性構成で組みました。ネイティブのシェルがログイン・push 通知・ファイルダウンロード・ディープリンク・App Store コンプライアンスを処理し、storefront 本体は web オリジンから降りてくる WebView surface の上に乗ります。
Webとアプリは、定義したメッセージ規則で通信します。storefront はサインイン · サインアウト · 電話の発信 · セッショントークンの受け渡しといった、名前の付いた少数のメッセージでシェルを呼び、シェルはページ側の決まった関数を呼び返して応えます。トークンはネイティブ側のiOS Keychainに保存し、ページが読み込まれるたびに Web側へ渡されます。ユーザーがどこへ移動しても storefront のログインがほどけないのは、このためです。
web 層から降りてくる取引文書はシェルが受け止め、ネイティブのダウンロードとして保存し、保存できたことをトーストで知らせます。接続の監視役がネットワークを見張り、切れていた接続が戻った瞬間に、トークンを携えて storefront を読み込み直します。storefront のタブはすべて一つの web プロセスプールを共有しているので、どの区画へ移ってもログイン状態が一体のまま保たれます。push 権限を尋ねる瞬間さえ、独立した設計になっています。iOS のシステムダイアログが出る前に、通知がなぜ要るのかをネイティブの画面が先に説明します。この画面はUIKitアプリ内にSwiftUIで実装しました。
同じソースが、コンパイル時に切り替わる複数のサーバー環境へ向けて出荷されます。社内のテスターはステージングの storefront を歩き、App Store ビルドは本番を向きます。
