UI freezes in Flutter build iOS app in China

最近遇到的問題,只能說中國網路神奇事情多多

最近一個月同事D用 flutter 開發,希望可以寫一次程式然後build給android與 ios 使用,整個過程其實蠻順利的,兩個平台的版本測試也都很順,直到交給在上海的同事F做測試後才發現有許多詭異的問題。

最大的issue就是 ios 版本使用的時候居然會發生UI更新時整個停頓,但同事F回報說只有iOS 如此,android 版本卻一切正常,於是開始抓抓蟲大作戰。原本還在懷疑是 API call 有發生問題,但因為server已經擺在上海,且從台灣使用時都很順,再加上同事N寫了個簡單測試(只呼叫API)的native code iOS版本交給上海同事F測試一切正常,所以排除API response time異常的可能性。

後來同事C找到這篇,裏頭寫到今年(2020)年初也有人遇到這樣的問題,根本原因是因為OCSP (Online Certificate Status Protocol) stapling。而Android因為不做OCSP檢查,所以就省了這個手續,但是iOS不省略這段,所以會出問題。

問題來了,如果真的如此的話,應該 iOS 在台灣測試的時候,同事D應該就會遇到同樣的情況。在沒有其他頭緒的情況下,只好先來試試看把apache 2.4 做 ocsp stapling。因為是用 letsencrypt,所以也擔心文章內提到的 dns 汙染是不是會有影響,但反正先死馬當活馬醫。

Letsencrypt 有提供 ocsp stapling功能,只要加上 --staple-ocsp 跟 --must-staple 即可。

sudo certbot --apache --staple-ocsp --must-staple -d YOUR.DOMAIN.NAME

如果是其他的 ssl 憑證,可以看這幾篇(1, 2, 3, 4)

改完後連上 https://www.digicert.com/helphttps://www.ssllabs.com/ssltest/analyze.htm一測,居然OCSP狀態還是 not enable,看來 DNS 汙染問題真的還是存在(ref: 1, 2)。

可能的解法是設定 resolver (ref: 1, 2),弄好之後OCSP檢查正常。但萬萬沒想到,請同事F測試之後居然在iOS上更慢了...

後來同事C找到這篇,看起來flutter有在解這個問題,只是還沒進到 master branch 就是了...

解了這個問題之後,現在遇到的是 iOS 和 Android 的 loading time 明顯不一樣(對,還是在中國,然後台灣連線都還比較快),還有 Android 上頭 webview 有時會crash... 真是詭異的中國網路環境。