使用 Workbox 將 PWA 整合至內建分享使用者介面

如何在系統層級的分享 UI 中,讓 PWA 顯示在平台專屬應用程式旁

Web Share Target API 可讓您在使用者安裝漸進式網頁應用程式後,在系統層級的分享功能表中顯示該應用程式。如果您有可接收要求的伺服器,這項功能就非常實用,但如果沒有,就難以運作。

本文將使用 Workbox (一組 JavaScript 程式庫,用於為網頁應用程式新增離線支援功能),建立完全位於 Service Worker 內的分享目標網址。這樣一來,靜態網站和單頁應用程式就能做為分享目標,無需專屬伺服器端點。

開啟「透過以下方式分享」導覽匣的 Android 手機。
系統層級的分享目標挑選器,其中包含名為 Share Target Test 的已安裝 PWA。

同一頁面

如果您不熟悉 Web Share Target 的運作方式,請參閱「使用 Web Share Target API 接收共用資料」一文,瞭解詳細介紹。以下是快速回顧。

導入網頁分享目標功能分為兩個部分。首先,請更新網頁應用程式資訊清單,指出您希望應用程式在安裝後成為分享目標。以下範例會透過 POST 要求,將分享內容導向 /share 網址。這會編碼為多部分表單,其中標題稱為 name,文字稱為 description,JPEG 圖片稱為 photos


"share_target": {
  "action": "/share",
  "method": "POST",
  "enctype": "multipart/form-data",
  "params": {
    "title": "name",
    "text": "description",
    "files": [
      {
        "name": "photos",
        "accept": ["image/jpeg", ".jpg"]
      }
    ]
  }
}

使用 Workbox 的 Service Worker 分享目標

雖然通常是由伺服器端點處理,但您可以為分享目標註冊路由,直接在服務工作人員中處理要求,這是一項實用技巧。這樣一來,應用程式就能成為分享目標,不必使用後端。

您可以在 Workbox 中註冊由 Service Worker 處理的路徑,首先,請從 'workbox-routing' 匯入 registerRoute。請注意,這個路徑已註冊為 /share 路由,與範例網頁應用程式資訊清單中列出的路徑相同。並呼叫 shareTargetHandler() 做為回應。

import { registerRoute } from 'workbox-routing';

registerRoute(
  '/share',
  shareTargetHandler,
  'POST'
);

shareTargetHandler() 函式為非同步,會接收事件、等待表單資料,然後從中擷取媒體檔案。

async function shareTargetHandler ({event}) {
  const formData = await event.request.formData();
  const mediaFiles = formData.getAll('media');

  for (const mediaFile of mediaFiles) {
    // Do something with mediaFile
    // Maybe cache it or post it back to a server
  });

  // Do something with the rest of formData as you need
  // Maybe save it to IndexedDB
};

接著,您就可以隨意使用這些檔案。你可以快取這些檔案。您可以透過擷取要求將這些資料傳送到其他位置。您甚至可以使用其他資訊清單選項,例如為其他共用項目提供含有某些查詢參數的網頁,或將資料和媒體指標儲存在 Cache Storage APIIndexedDB 中。

您可以在 Fugu Journal 範例應用程式中試用,並在原始碼中查看服務工作人員的實作方式。

您可能會採取的一項常見做法是保留共用資源,直到網路連線品質提升為止。Workbox 也支援定期背景同步

結論

Share Target API 可讓您輕鬆將漸進式網頁應用程式深層整合至使用者的裝置,讓應用程式在應用程式間分享內容這項重要工作上,與平台專屬應用程式並駕齊驅。但這麼做通常需要伺服器接收要求。只要運用 Workbox 在 Service Worker 中直接建立分享目標路徑,應用程式就不會受到這項限制,讓分享目標在應用程式離線時也能運作,且不需要後端。

相片來源:Elaine Casap 發表於 Unsplash 網站上