前言
2021 下半年真的是好忙碌,工作四年來沒這麼忙過,Blog 都要長草了XD
即使去年準備我們 Cloud gaming iOS PWA Release 時好像都沒這麼忙 😅,可能跟當時有其他 Team 的工程師來 Support 的關係
這次下半年的 project,比較多都是我們 Team 自己扛,同時又要兼顧 iOS Client,Bandwidth 上真的頗緊
而 iOS 其中最讓人頭痛的一點就是更新後可能會有未爆彈,新版本的 Bug 常常高機率就是 Blocker,比如今年上半年我們曾經遭遇的 14.6 的 IndexedDB bug
症狀是只要一打開 web app,畫面就會卡在一片空白當中,團隊的 Senior Debug 後發現是 iOS Safari 的 IndexedDB 不知道什麼原因沒有 resolve Promise (如果對 JS 的 Promise 還不了解,我有一篇簡單介紹什麼是 Promise & Async & Await 的文可以參考看看)
這篇就來回憶下是怎麼處理這個問題的
如何解決 iOS Safari 原生的 Bug
首先,如果是跟 iOS Safari 有關的 Bug,大多情況都只能等 Apple 自己修正,所以第一時間我們只能看有沒有人已經發過 Bug 給 Apple,沒有的話就只能自己開 Bug,我們已經至少開了四個 PWA 相關的 Bug 給 Apple…大多時候都是被無視跟 Low priority 居多,不被認為是 Bug,而是叫我們去使用者論壇發文
再來就是尋找 workaround,畢竟在等 Apple 發布下一個 release 前,只要使用 14.6 的使用者就是會被影響,不能只是乾等 Apple 來救火XD
WebKit Bug thread
幸運的是這個 issue 已經有人發 Bug,可以根據其他人的情況來找一些 workaround 的蛛絲馬跡,
- https://bugs.webkit.org/show_bug.cgi?id=226547
- 該 IndexedDB 相關的 Bug 在 15.0 已經全面被修復
當時看大家的留言,大概可以知道只要在 web app launch 前去 query IndexedDB,就能繞過這個 forever hanging
於是我就嘗試了在 index.html 內去 call 看看 IndexedDB,但不做任何互動
Workaround
1 | <script type="text/javascript"> |
雖然這樣很簡單的就解決了這個難題,前後耗時也有大概三個工作天的時間
第一天第二天都在分析到底是哪邊問題,是我們 AWS CloudFront 的鍋呢還是新的 iOS 14.6 有問題
加上當下能搜尋到的網路資源並不多 (工作上遇到的很多問題有一半都是找不到的)
主要的突破是靠著 Senior debug 確定是 14.6 IndexedDB 有問題,才收斂整個 scope,得以聚焦在一個點上
後記
這個事件後續也有人發文章
有興趣的可以看看囉