發布日期:2020 年 2 月 14 日
許多瀏覽器都允許您直接在使用者介面中啟用及宣傳 Progressive Web App (PWA) 的安裝作業。安裝 (舊稱「新增至主畫面」) 功能可讓使用者將 PWA 新增至行動裝置或桌機。安裝 PWA 後,系統會將其新增至使用者的啟動器,因此 PWA 可以像其他已安裝的應用程式一樣執行。
除了瀏覽器提供的安裝體驗,您也可以直接在應用程式中提供自訂安裝流程。
考慮是否要宣傳安裝時,請考量使用者通常如何使用 PWA。舉例來說,如果有一群使用者每週多次使用您的 PWA,他們可能會覺得從手機主畫面或電腦作業系統的「開始」選單啟動應用程式更方便。在已安裝的 standalone、minimal-ui 或 window-control-overlay 模式中,移除視窗的瀏覽器工具列後,可增加螢幕空間,有助於提升某些生產力和娛樂應用程式的使用體驗。
必要條件
開始之前,請確認 PWA 符合可安裝性規定,通常包括具備網頁應用程式資訊清單。
宣傳安裝
如要顯示漸進式網頁應用程式可供安裝,並提供自訂的應用程式內安裝流程,請按照下列步驟操作:
- 監聽
beforeinstallprompt事件。 - 儲存
beforeinstallprompt事件,以便稍後觸發安裝流程。 - 提醒使用者可以安裝 PWA,並提供按鈕或其他元素,啟動應用程式內安裝流程。
監聽 beforeinstallprompt 事件
如果漸進式網頁應用程式符合安裝條件,瀏覽器就會觸發 beforeinstallprompt 事件。儲存事件的參照,並更新使用者介面,指出使用者可以安裝 PWA。
// Initialize deferredPrompt for use later to show browser install prompt.
let deferredPrompt;
window.addEventListener('beforeinstallprompt', (e) => {
// Prevent the mini-infobar from appearing on mobile
e.preventDefault();
// Stash the event so it can be triggered later.
deferredPrompt = e;
// Update UI notify the user they can install the PWA
showInstallPromotion();
// Optionally, send analytics event that PWA install promo was shown.
console.log(`'beforeinstallprompt' event was fired.`);
});
應用程式內安裝流程
如要提供應用程式內安裝功能,請提供按鈕或其他介面元素,讓使用者點選或輕觸即可安裝應用程式。當使用者點選或輕觸該元素時,請在已儲存的 beforeinstallprompt 事件 (儲存在 deferredPrompt 變數中) 上呼叫 prompt()。系統會向使用者顯示模態安裝對話方塊,要求他們確認是否要安裝 PWA。
buttonInstall.addEventListener('click', async () => {
// Hide the app provided install promotion
hideInstallPromotion();
// Show the install prompt
deferredPrompt.prompt();
// Wait for the user to respond to the prompt
const { outcome } = await deferredPrompt.userChoice;
// Optionally, send analytics event with outcome of user choice
console.log(`User response to the install prompt: ${outcome}`);
// We've used the prompt and can't use it again, throw it away
deferredPrompt = null;
});
userChoice 屬性是會以使用者選擇的選項解析的 Promise。
您只能在延遲事件中呼叫 prompt() 一次。如果使用者關閉提示,您必須等到 beforeinstallprompt 事件再次觸發 (通常是在 userChoice 屬性解析後),才能再次顯示提示。
偵測 PWA 是否已順利安裝
您可以使用 userChoice 屬性,判斷使用者是否從使用者介面中安裝應用程式。不過,如果使用者是從網址列或其他瀏覽器元件安裝 PWA,userChoice 就無法提供協助。建議您改為監聽 appinstalled 事件,因為無論使用哪種機制安裝 PWA,這個事件都會在安裝完成時觸發。
window.addEventListener('appinstalled', () => {
// Hide the app-provided install promotion
hideInstallPromotion();
// Clear the deferredPrompt so it can be garbage collected
deferredPrompt = null;
// Optionally, send analytics event to indicate successful install
console.log('PWA was installed');
});
偵測 PWA 的啟動方式
CSS display-mode 媒體查詢會指出 PWA 的啟動方式,無論是在瀏覽器分頁中啟動,還是以已安裝的 PWA 啟動,都會顯示。因此,您可以根據應用程式的啟動方式套用不同樣式。舉例來說,您可以設定在以已安裝的 PWA 啟動時,一律隱藏「安裝」按鈕並提供返回按鈕。
追蹤 PWA 的啟動方式
如要追蹤使用者啟動 PWA 的方式,請使用 matchMedia() 測試 display-mode 媒體查詢。
function getPWADisplayMode() {
if (document.referrer.startsWith('android-app://'))
return 'twa';
if (window.matchMedia('(display-mode: browser)').matches)
return 'browser';
if (window.matchMedia('(display-mode: standalone)').matches || navigator.standalone)
return 'standalone';
if (window.matchMedia('(display-mode: minimal-ui)').matches)
return 'minimal-ui';
if (window.matchMedia('(display-mode: fullscreen)').matches)
return 'fullscreen';
if (window.matchMedia('(display-mode: window-controls-overlay)').matches)
return 'window-controls-overlay';
return 'unknown';
}
追蹤顯示模式變更時間
如要追蹤使用者是否在 browser 和其他顯示模式之間切換,請監聽 display-mode 媒體查詢的變更。
// Replace "standalone" with the display mode used in your manifest
window.matchMedia('(display-mode: standalone)').addEventListener('change', () => {
// Log display mode change to analytics
console.log('DISPLAY_MODE_CHANGED', getPWADisplayMode());
});
根據目前的顯示模式更新 UI
如要為以已安裝 PWA 啟動的 PWA 套用不同的背景顏色,請使用條件式 CSS:
@media all and (display-mode: standalone) {
body {
background-color: yellow;
}
}
更新應用程式的圖示和名稱
如果需要更新應用程式名稱或提供新圖示,該怎麼辦?請參閱「Chrome 如何處理網頁應用程式資訊清單的更新」,瞭解這些變更在 Chrome 中反映的時間和方式。