如何在系統層級的分享 UI 中,讓 PWA 顯示在平台專屬應用程式旁
Web Share Target API 可讓您在使用者安裝漸進式網頁應用程式後,在系統層級的分享功能表中顯示該應用程式。如果您有可接收要求的伺服器,這項功能就非常實用,但如果沒有,就難以運作。
本文將使用 Workbox (一組 JavaScript 程式庫,用於為網頁應用程式新增離線支援功能),建立完全位於 Service Worker 內的分享目標網址。這樣一來,靜態網站和單頁應用程式就能做為分享目標,無需專屬伺服器端點。

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 API 或 IndexedDB 中。
您可以在 Fugu Journal 範例應用程式中試用,並在原始碼中查看服務工作人員的實作方式。
您可能會採取的一項常見做法是保留共用資源,直到網路連線品質提升為止。Workbox 也支援定期背景同步。
結論
Share Target API 可讓您輕鬆將漸進式網頁應用程式深層整合至使用者的裝置,讓應用程式在應用程式間分享內容這項重要工作上,與平台專屬應用程式並駕齊驅。但這麼做通常需要伺服器接收要求。只要運用 Workbox 在 Service Worker 中直接建立分享目標路徑,應用程式就不會受到這項限制,讓分享目標在應用程式離線時也能運作,且不需要後端。
相片來源:Elaine Casap 發表於 Unsplash 網站上