[譯] PWA 再進化,可以生成一個安卓原生的 WebAPK 了

Yuhanlolo發表於2018-06-24

在安卓系統上,網路應用安裝橫幅不僅僅只是將漸進式網路應用(PWA)新增到使用者的主螢幕。Chrome 會自動為你的應用生成一個特殊的 APK,有時候我們稱之為 WebAPK。 將應用以 APK 的形式安裝到手機上,使得它能夠出現在使用者的應用程式啟動器和系統設定裡,以及註冊一系列 intent filters。

為了生成 WebAPK,Chrome 需要檢查 web app manifest 和後設資料。一旦 manifest 改變了,Chrome 將會生成一個新的 APK。

注意:由於 manifest 的改變會重新生成 WebAPK,我們建議只在必要的情況下修改它。同時,不要用 manifest 儲存任何跟使用者有關的資訊,或是其他需要經常變更的資料。因為頻繁地修改 manifest 將會觸發 Chrome 不斷生成新的 WebAPK,從而導致安裝時間的延長。

安卓 intent filters

當安裝一個 PWA 到安卓系統上時,該應用將會為它所有的 URL 註冊一系列 intent filters。當使用者點選任何包括在這個 PWA 中的連結時,該應用將會以應用程式的形式被開啟,而不是在瀏覽器中被開啟。

讓我們看看下面這個 manifest.json 檔案的片段,當它從程式啟動器中被呼叫時,它將會以一個獨立應用程式的形式啟動 https://example.com/,並且不需要任何瀏覽器。

"start_url": "/",
"display": "standalone",
複製程式碼

一個 WebAPK 包括如下的 intent filters:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data
    android:scheme="https"
    android:host="example.com"
    android:pathPrefix="/" />
</intent-filter>
複製程式碼

如果使用者在某個應用程式中點選了一個跳轉到 https://example.com/read 的連結,這一行為將會被 intent 捕捉到,並且在對應的 PWA 中開啟該連結。

注意:從位址列裡直接跳轉到 https://example.com/app/ 和從帶有該訊息傳遞物件(intent)過濾器的原生應用裡開啟這個連結是一樣的。Chrome 會認為使用者是有意識地想要訪問這個地址並且開啟它。

使用 scope 限制 intent filters

如果你不想要你的 PWA 處理網站上所有的連結,你可以新增 scope 屬性到 manifest 中。scope 屬性會告訴安卓系統只在 URL 與 originscope 匹配時開啟你的 PWA,並且規定哪些 URL 應該在 PWA 中被開打以及哪些 URL 應該在瀏覽器中被開啟。當你的應用與其他非應用內容在同一個域名下時,scope 非常有幫助。

讓我們看看下面這個 manifest.json 檔案的片段,當它從程式啟動器中被呼叫時,它將會以一個獨立應用程式的形式啟動 https://example.com/app/,並且不需要任何瀏覽器。

"scope": "/app/",
"start_url": "/",
"display": "standalone",
複製程式碼

和之前一樣,生成的 WebAPK 將會包括 intent filters,但它會修改 APK 中 AndroidManifest.xml 裡的 android:pathPrefix 屬性:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data
    android:scheme="https"
    android:host="example.com"
    android:pathPrefix="/app/" />
</intent-filter>
複製程式碼

讓我們看幾個簡單的例子:
https://example.com/app/ — 在/app/路徑下
https://example.com/app/read/book — 在 /app/路徑下
https://example.com/help/ — 不在 /app/路徑下
https://example.com/about/ — 不在 /app/路徑下

如果你不想設定 scope 屬性,或者想知道如何定義 PWA 的 scope,更多內容請參考 scope

許可權管理

許可權管理的運作和其他網路應用是一樣的,它們需要在執行的時候請求而不是在安裝的時候請求。理想的情況是隻在你需要它們的時候請求。比如說,不要在一開始載入的時候就請求相機的許可權,而是在使用者準備拍照的時候再請求。

注意:通常情況下,安卓系統會馬上授予剛安裝的應用傳送通知的許可權,但這並不適用於通過 WebAPK 安裝的應用。因此,你需要在執行的時候發起通知許可權的請求。

管理儲存空間和應用狀態

雖然 PWA 是通過 APK 安裝的,Chrome 會使用當前的配置檔案儲存資料,並且不會將它們隔離開。這為瀏覽器和應用程式之間互動提供了資料共享的體驗。在這裡,快取是共享且活躍的,任何客戶端的儲存空間都是可以被訪問的。與此同時,伺服器端也是安裝好並且隨時可以執行的。

不過,這在使用者清除他們的 Chrome 配置檔案或者網站資料時會出現問題。

常見問題

如果使用者已經安裝了該網站的原生應用怎麼辦?

就像 PWA 安裝橫幅一樣,使用者可以新增任何獨立於原生應用的網站到主螢幕。如果你期望使用者同時安裝這兩者,我們建議你用不同的圖示或者名字來區別你的網站和應用。

當使用者通過安裝了的 PWA 開啟某個站點時,Chrome 在執行嗎?

是的,一旦該站點通過主螢幕被開啟,主要的活動依舊在 Chrome 下執行。快取、許可權以及所有的瀏覽器狀態將會被兩者共享。

如果使用者清除了瀏覽器快取,已安裝的 PWA 的儲存空間會被清除嗎?

是的。

如果我使用一個新的裝置,我的 PWA 會被重新安裝嗎?

並不是所有的時候都會。但我們認為這是一個很重要的問題,並且在努力完善它。

我可以註冊我自己處理 URL 的方法和協議嗎?

不可以。

許可權問題是如何解決的?我收到的提示是來自於安卓系統還是 Chrome?

許可權依舊是通過 Chrome 管理的。使用者將會收到 Chrome 的提示從而授予許可權,並且可以在 Chrome 設定中編輯這些許可權。

PWA 可以在哪一個版本的安卓系統上執行?

PWA 可以在所有安裝了 Chrome 的安卓系統上執行,具體來說就是 Jelly Bean 以上的版本。

PWA 使用的是 WebView 嗎?

不是,網站是通過 Chrome 開啟的,開啟網站的 Chrome 的版本則是使用者新增該 PWA 的那一版本。

我們可以上傳能夠提交到應用商店的 APK 嗎?

不可以,因為目前還沒有可以支援 PWA 上傳到應用商店的簽名資訊。

PWA 在應用商店的列表中嗎?

不在。

我是安卓平臺上其他瀏覽器的開發者,我能為我的網路應用實現這樣快捷的安裝流程嗎?

我們正在為此努力。我們希望所有的瀏覽器都可以支援 PWA。更多的細節我們會在之後公佈。

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章