1.背景
大家都清楚在iOS上實現(xiàn)APP的啟動圖可以使用兩種方式,一種是LaunchImage,一種是LaunchScreen,后者是蘋果于iOS8推出并且大力推薦的,但殊不知這里邊的坑深似海。
網(wǎng)上有很多對于LaunchScreen設(shè)置啟動圖不更新的帖子,總結(jié)來說就是蘋果的Springboard對于APP的啟動圖進行了緩存,目的是APP可以高效的切換,我們咨詢了蘋果的工程師,得到的答案是緩存策略maybe forever。。。
2.測試結(jié)論
因為啟動圖對于APP來說完全是黑盒,外加蘋果的閉源,所以我們經(jīng)過大量的測試得出如下結(jié)論:
【1】LaunchScreen的優(yōu)先級高于LaunchImage,同一款A(yù)PP只要安裝了有LaunchScreen的版本,即使你重新安裝回LaunchImage的版本,不好意思啟動圖將不生效,展現(xiàn)的依然是LaunchScreen版本的啟動圖。
【2】沒有安裝launchScreen版本的APP,LaunchImage可以自由更換啟動圖,并且即時更新。
看上去是蘋果對于緩存策略的一個bug,但我們真的沒有辦法嗎?
3.workround蘋果之路
我們展開了workround蘋果之路,探究之路就不說了,結(jié)論如下:
【1】如果你想在LaunchScreen的情況下更新啟動圖,你需要修改storyboard的名字以及引用的圖片的名字,并且把圖片從xcassets里邊拿到普通的目錄下,直接引用2X和3X圖(有一個小細節(jié)就是圖片必須是全屏圖片,我們使用iPhoneX分辨率的2X和3X圖)。
上面的方法確實能解決啟動圖更新的問題,但是會在一些場景下黑屏。
【2】通過大量的測試,我們發(fā)現(xiàn)相同名字的覆蓋會高概率的出現(xiàn)黑屏問題,于是我們對工程進行了編譯改造,在每次編譯打包都會生成一個時間戳的stroyboard和圖片的名字,這樣確實從概率上降低了相同名字覆蓋所出現(xiàn)的黑屏問題,當(dāng)然一般的用戶不會對于一個APP頻繁的覆蓋更新
以上的手段是一個不完美但可以解決使用LaunchScreen冷啟動下啟動圖不更新的問題,但是通過openURL方式拉起熱啟動APP依舊無計可施
對于以openURL拉起的熱啟動的APP,我們進行了大量的測試,結(jié)論如下
【1】使用LaunchImage的方式實現(xiàn)啟動圖,通過openURL熱啟后,沒有啟動圖展示
【2】使用LaunchScreen的方式實現(xiàn)啟動圖,通過openURL熱啟后,會展示啟動圖,但是有一個糟糕的case,如果你先安裝了一個啟動圖的版本,通過openURL熱啟過,那么再安裝一個新啟動圖的版本,通過openURL熱啟依舊展示上一次的啟動圖,尷尬的不能再尷尬
4.原理探究
經(jīng)過這樣大量的測試,我們確實很想知道蘋果到底是怎么做的,為什么會有這樣的結(jié)果?
于是我用越獄機探究了一下蘋果的策略,蘋果會在var/mobile/Containers/Data/Application/這個目錄下存放手機上安裝APP的各種緩存數(shù)據(jù),包括啟動圖,你每一次的安裝都會生成一個新的目錄用來存放,但這僅僅是企業(yè)證書的包,且我們發(fā)現(xiàn)在越獄機器上不存在不更換啟動圖的情況,證明越獄機器和正式機器是有區(qū)別的,最后AppStore的包啟動圖沒有在這個目錄下,翻遍了越獄機器的存儲目錄沒有找到。
5.結(jié)論
用LaunchScreen的方式更換啟動圖,存在很多問題,且蘋果能讓我們操作的空間不大,沒有代碼干涉,只能進行配置,看上去不起眼的啟動圖,也存在這么多問題,蘋果的工程師確實需要檢討了,我準備去bugreport給他們報一個非常嚴重的bug。
最后百度App技術(shù)的同學(xué)發(fā)表了iOS啟動圖異常修復(fù)的文章,解決了這個問題,為百度App技術(shù)的同學(xué)點贊。