iOS 11.3以及macOS 10.12.4將包含service Worker-一個強大的規範,容許後臺腳本支持離線web應用程序。iOS 11.3還會在將Web應用程序添加到主屏幕時諮詢Web應用程序清單。 -@rmondelloios
昨天看到Ricky Mondello的推特以及Safari 11.1 beta測試版實現了Web App Manifest和Service Workers,這意味着開發多平臺的PWA應用成爲了現實,如今讓咱們回到現實世界,看看咱們已經有了什麼。web
在iOS上測試這些新的功能並不容易,由於Safari上的開發者工具並不容許你查看Service Workers進程,並且客戶端API容許咱們用它的客戶端與服務人員進行通訊的消息通道並不在那裏。可是,我設法玩了幾個小時,儘管存在一些Bug,可是我相信在最終的版本上WebKit團隊能夠解決這些問題。我想重點關注iOS PWAs與Android的顯著差別。瀏覽器
若是你發佈了一個PWA應用或者即將發佈,你必須注意用戶體驗以及有可能在iOS上發生的一些問題
複製代碼
十八個月之前(居然已經一年半了)我宣稱:「不要在PWA應用中不負責任的使用iOS元標籤」。Twitter和Flipkart等幾家公司在這些問題出現的時候注意到了這些問題,並刪除了iOS元標籤,或者解決了這些問題。
當時的問題是,一些公司沒有進行測試以及分析安卓PWA應用與iOS之間的區別就選擇經過蘋果元標籤來支持iOS。
很抱歉,如今出現的大多數問題都和我十八個月以前說的同樣,不過有一個地方仍是很不一樣的:如今你不須要加入到iOS當中去。iOS將支持Web App Manifest,因此你的PWA將會自動變成iOS的PWA應用。但蘋果並無模仿安卓系統的行爲,這意味着:Cupertino,咱們有一個問題。緩存
若是你在主屏幕上安裝你的PWA應用,雖然Service Workers就在這裏,但一直處於註冊狀態卻沒有運行(SW不會吧web應用當成客戶端同樣處理)。因此不要指望在第一個測試版本上得到要離線體驗。不過我相信這是一個BUG,而且在之後的版本中會解決掉。
bash
Service Worker API能夠在Safari、Web View上使用HTTPS通訊(也就是Chrome、Firefox和Facebook的內置瀏覽器)上使用,應用程序能夠添加到主屏幕(Web.app)和Safari視圖控制器(好比當你在iOS的推特上點擊連接時)。
這聽起來很棒,是嗎?好吧,還有一個很大的問題:在Safari上、在每一個應用的web視圖上以及主屏幕的web應用上,引擎是不支持分享Service Workers和緩存存儲的,這就意味着用戶可能會在同一設備上以多個PWA文件的副本結束。
你也許會想:嘿,Max,一樣的事情也會發生在安卓以及其它不一樣的瀏覽器上(Chrome, Firefox, Opera, Samsung Internet, UC Web)。好吧,你是對的,但這是一個不同的用例。在安卓上,操做系統的web views上不支持Service Workers,首屏上的PWA應用都共享擁有這個應用圖標的瀏覽器的SW和緩存。一樣的,在同一設備上使用不一樣的瀏覽器載入同一web應用彷佛並非一個典型的用例。
如今,假設你是一個iOS用戶,而且使用一個PWA應用,好比Twitter Lite。當你要使用它時,你打開你的瀏覽器,像iOS上的Chrome或者 Firefox。你得到了這個應用的副本。假定你把它添加到主屏幕,這就生產了第二個應用副本。由於在iOS上你沒法修改默認的瀏覽器,因此當你在郵箱中收到一個到推特的連接,你點擊以後,Safari就會打開,在你的設備上就生成了第三個應用副本。這就結束了?尚未。若是你在其餘應用程序中使用Facebook或一些報紙應用程序,你能夠在app內只瀏覽器中體驗,當你點擊一個連接到推特或者推特帳戶,這就生成了另外一個應用副本。幸運的是,Safari的視圖控制器彷佛與Safari共享SW和cache。 app
當您的HTML中有一個manifest時,Safari將使用它而不是舊的非標準的蘋果移動元標籤。很是棒,然而,知道beat1版本,和安卓相比你也會有一些意想不到的行爲發生。
咱們來討論一下那些特性被忽略了(但如今只是beta1版本,我不肯定之後哪些特性會有或者沒有):框架
<link rel=」apple-touch-icon」>
設定來獲取的,而不是來自應用的Manifest。我猜蘋果在將來的版本中會解決這個問題,我但願可以提供120x120和180x180兩個尺寸。Manifest的做用域使得當你使用<a>
標籤建立連接時會變得不同。當你點擊連接時,它應該在PWA應用中打開,仍是去瀏覽器中打開呢?
Android瀏覽器一般在PWA上下文的範圍內打開url,或者在瀏覽器或自定義選項卡中打開其餘連接。若是你沒有特別指定web應用Manifest的做用範圍,安卓一般會把manifest的文件夾做爲默認範圍,這也是一般能預想到的操做。
若是沒有特別指定,Safari不會定義一個默認的範圍,那麼而後你的PWA中的每一個連接都將在你的應用程序的iOS窗口中打開。問題在哪裏?它是iOS,它沒有返回按鈕也沒有返回操做,因此用戶也能就會被限制在你所連接的一個外部網站上而沒法回到應用中。若是你指定了範圍,那麼每一個應用效果都會和安卓上預期的同樣,範圍以外的連接將會在Safari中打開,並帶有一個返回按鈕(狀態欄中小的那個),可以回到你的PWA應用中去。iphone
不幸的是,一個首屏上使用web應用的bug(一個特性?)仍然存在。每次你離開PWA時,你將會丟失全部的狀態,當用戶再次進入時,PWA應用將從頭開始加載。
對於性能、電池的使用以及用戶體驗,這種行爲都是一個很是嚴重的問題。若是你訪問一個外部的站點,返回按鈕回到應用時老是從頭開始載入,這將花費不少時間,這並非用戶所指望的(你可使用本地存儲來改掉這個問題,但你知道的,這並非一個好的方法)。
並且,這對於一個須要雙重驗證的應用來講是一個很大的問題,好比推特。若是你須要去另外一個應用獲取驗證碼或者打開一條消息或者郵件,你將離開PWA應用。當你回來要粘貼這些信息時,你發現頁面不見了,你須要從新登陸,而後發現驗證碼失效了。我在使用推特時就發生了這個問題!這就意味着iOS上的推特應用對我來講徹底沒有用處。工具
不幸的是,並不支持Web應用程序輪播圖或Manifest 規範的事件,好比 appinstalled(譯者不知道這是什麼意思),因此你須要想別的方式來跟蹤它。
和預想的同樣,並不支持web消息推送,即便是在今天,在死刑的邊緣上也有了推送通知。另外,也沒有後臺同步或者web共享API。從iOS的角度來看,這真是一個很使人羞恥的事情,畢竟使用原生的SocialKit框架應該很容易實現的。性能
正如我在上一篇文章中提到的,iOS有一些不一樣之處,好比:
讓然還有時間讓蘋果去作一些改變來使咱們的生活更美好。同時,咱們也有時間去檢查完善咱們的PWA應用,好比:
<a>
連接的交互界面上加一個返回按鈕你還發現別的了嗎?請記住在Twitter上關注我,由於我將常常更新信息,並在將來測試新版本。