前言

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 的蛛絲馬跡,

當時看大家的留言,大概可以知道只要在 web app launch 前去 query IndexedDB,就能繞過這個 forever hanging

於是我就嘗試了在 index.html 內去 call 看看 IndexedDB,但不做任何互動

Workaround

1
2
3
4
5
<script type="text/javascript">
if (!window.indexedDB) {
console.error('IndexedDB is not available in your browser');
}
</script>

雖然這樣很簡單的就解決了這個難題,前後耗時也有大概三個工作天的時間

第一天第二天都在分析到底是哪邊問題,是我們 AWS CloudFront 的鍋呢還是新的 iOS 14.6 有問題

加上當下能搜尋到的網路資源並不多 (工作上遇到的很多問題有一半都是找不到的)

主要的突破是靠著 Senior debug 確定是 14.6 IndexedDB 有問題,才收斂整個 scope,得以聚焦在一個點上

後記

這個事件後續也有人發文章

有興趣的可以看看囉