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

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

來自專欄掘金翻譯計劃8 人贊了文章

  • 原文地址:WebAPKs on Android
  • 原文作者:Pete LePage
  • 譯文出自:掘金翻譯計劃
  • 本文永久鏈接:github.com/xitu/gold-mi
  • 譯者:[Yuhanlolo] (github.com/Yuhanlolo)
  • 校對者:[maoqyhz] (github.com/maoqyhz)

在安卓系統上,網路應用安裝橫幅不僅僅只是將漸進式網路應用(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 文件的片段,當它從程序啟動器中被調用時,它將會以一個獨立應用程序的形式啟動 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。更多的細節我們會在之後公布。

作者:飛象會揮發

鏈接:PWA 再進化,可以生成一個安卓原生的 WebAPK 了

來源:掘金

著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

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

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

推薦閱讀:

TAG:Android應用 | 漸進式網路應用程序PWA | 掘金 |