iOS app 用戶體驗(yàn)提升

iOS系統(tǒng)區(qū)別于Android系統(tǒng),系統(tǒng)設(shè)計(jì)本身就是以用戶體驗(yàn)優(yōu)先,而非程序并發(fā)常駐。隨著硬件的不斷升級,CPU和GPU的越發(fā)強(qiáng)大,手機(jī)本身的使用體驗(yàn)也在不斷提高。

但是即便如此,iOS程序設(shè)計(jì)和開發(fā)時(shí)還是有很多需要注意的地方,來進(jìn)一步提升用戶體驗(yàn)。

大概有幾個(gè)方面:

  • app 啟動(dòng)速度提升
  • 瀏覽的流暢性提升
  • 圖片、視屏、直播秒開
  • 減少發(fā)熱和和耗電

1.APP啟動(dòng)速度提升

iOS應(yīng)用的啟動(dòng)可分為pre-main階段和main兩個(gè)階段,所以App總啟動(dòng)時(shí)間 = pre-main耗時(shí) + main耗時(shí)


app啟動(dòng).png

借用兩張經(jīng)典的圖:

pre-main.png
main.png

所以,優(yōu)化啟動(dòng)時(shí)長分兩個(gè)階段

pre-main階段優(yōu)化

1、刪除無用代碼(未被調(diào)用的靜態(tài)變量、類和方法)
可以使用AppCode對工程進(jìn)行掃描,刪除 未使用的本地變量 參數(shù) 值
2、抽象重復(fù)代碼
3、+load方法中做的事情延遲到+initialize中,或者在+load中做的事情不宜花費(fèi)過多時(shí)間
因?yàn)閘oad是在啟動(dòng)的時(shí)候調(diào)用,而initialize是在類首次被使用的時(shí)候調(diào)用,不過當(dāng)你把load中的邏輯移到initialize中時(shí)候,一定要注意initialize的重復(fù)調(diào)用問題。
4、減少不必要的framework,或者優(yōu)化已有的framework

main階段優(yōu)化

main函數(shù)開始到第一個(gè)界面渲染完成這段時(shí)間,優(yōu)化出發(fā)點(diǎn)就是減少從main函數(shù)開始到第一個(gè)界面出現(xiàn)的時(shí)間,可以從兩方面入手:

1、didFinishLaunchingWithOptions中有些服務(wù)可以采用懶加載的方式
2、首次啟動(dòng)渲染的頁面優(yōu)化
不使用xib或者storyboard,直接使用代碼;
對于viewDidLoad以及viewWillAppear方法中盡量去嘗試少做,晚做,不做,或者采用異步的方式去做

2.瀏覽的流暢性提升

這里可以細(xì)分為兩個(gè)方面:本頁面的滑動(dòng)順暢性 和 新頁面跳轉(zhuǎn)

本頁面的滑動(dòng)流程性
  • 對象的創(chuàng)建
    1.盡量用輕量對象,比如CALayer 比 UIView 要輕量許多,不考慮交互,可以選擇CALayer。
    2.Storyboard和xib加載對象時(shí),消耗的成本比代碼多。慎用
    3.預(yù)加載和懶加載,cache的使用, 充分使用cel復(fù)用機(jī)制
  • 布局計(jì)算
    1.視圖計(jì)算比較消耗CPU性能,修改uiview的frame相關(guān)屬性,更是消耗cpu性能,盡量避免頻繁的布局更新
    2.自動(dòng)布局對cpu的消耗隨著復(fù)雜度是呈指數(shù)級的,慎用autoLayout
  • 紋理渲染
    1.當(dāng)在較短時(shí)間顯示大量圖片時(shí)(比如 TableView 存在非常多的圖片并且快速滑動(dòng)時(shí)),CPU 占用率很低,GPU 占用非常高。避免這種情況的方法只能是盡量減少在短時(shí)間內(nèi)大量圖片的顯示,盡可能將多張圖片合成為一張進(jìn)行顯示。
    2.當(dāng)圖片過大,超過 GPU 的最大紋理尺寸時(shí),圖片需要先由 CPU 進(jìn)行預(yù)處理,這對 CPU 和 GPU 都會(huì)帶來額外的資源消耗。目前來說,iPhone 4S 以上機(jī)型,紋理尺寸上限都是 4096×4096。所以,盡量不要讓圖片和視圖的大小超過這個(gè)值。

  • 視圖混合
    當(dāng)多個(gè)視圖或者CALayer混合顯示時(shí),GPU會(huì)將它們混合到一起,視圖多,結(jié)構(gòu)復(fù)雜就會(huì)增加混合難度。解決方法:減少視圖個(gè)數(shù)和層次,在不透明的視圖中標(biāo)明opaque 屬性以避免無用的 Alpha 通道合成?;蛘甙阉鼈兒铣傻揭粡埓髨D上。

  • 圖形生成
    CALayer 的 border、圓角、陰影、遮罩(mask),CASharpLayer 的矢量圖形顯示,以及透明半透明的使用, 會(huì)觸發(fā)離屏渲染(offscreen rendering),
    為了避免這種情況,另外解決方法是把需要顯示的圖形在后臺(tái)線程繪制為圖片,避免使用圓角、陰影、遮罩等屬性。

  • 內(nèi)存控制,及時(shí)釋放
    異步加載,避免卡主線程,避免使用dataWithContentsOfURL等方法
    數(shù)據(jù)結(jié)構(gòu)處理,json速度上優(yōu)于xml

新頁面跳轉(zhuǎn)

把關(guān)鍵的且耗時(shí)少的運(yùn)算放在viewdidload里,減少ViewController 在切換時(shí)候的卡頓時(shí)間
部分UI渲染放在 viewWillAppear 里運(yùn)算
部分復(fù)雜的運(yùn)算可以丟在 viewDidAppear 里
觸發(fā)型的做觸發(fā)加載,或者延遲加載
避免使用頁面跳轉(zhuǎn)過場動(dòng)畫
load數(shù)據(jù)的異步加載

3.圖片、視屏、直播秒開

根據(jù)策略進(jìn)行預(yù)加載,圖片緩存,注意壓縮
獲取視頻關(guān)鍵幀,根據(jù)網(wǎng)絡(luò)情況,動(dòng)態(tài)調(diào)整碼率
提高拉流優(yōu)先級,進(jìn)入頁面先拉流

4.減少發(fā)熱和耗電

定位管理器和 GPS,地理位置獲取,不用的時(shí)候關(guān)掉
減少無用的網(wǎng)絡(luò)接口請求,特別是輪詢接口
減少計(jì)算,優(yōu)化算法,數(shù)據(jù)結(jié)構(gòu)

其他

其他的用戶感知和交互方面,應(yīng)該盡量人性化。
頁面鏈路清晰,進(jìn)退有路。
一目了然,及時(shí)提示。
避免空白頁,卡主線程,等待無感知或者動(dòng)畫過渡。
等等。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一個(gè)項(xiàng)目做的時(shí)間長了,啟動(dòng)流程往往容易雜亂,庫也用的越來越多,APP的啟動(dòng)時(shí)間也會(huì)慢慢變長。本次將針對iOS...
    醬油瓶2閱讀 3,654評論 0 12
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,658評論 1 32
  • 知 識(shí) 點(diǎn) / 超 人 更新2019-03-27:添加了+load與+initialize方法的補(bǔ)充說明 前言當(dāng)自...
    樹下敲代碼的超人閱讀 14,043評論 8 70
  • 前言 最近和公司iOS小組伙伴討論準(zhǔn)備對各自手上的產(chǎn)品做一次優(yōu)化,確實(shí)對比很多產(chǎn)品來看,(支付寶,淘寶,幾乎1~2...
    Cingjin閱讀 1,880評論 0 7
  • 我打江南走過 那等在季節(jié)里的容顏如蓮花的開落 東風(fēng)不來,三月的柳絮不飛 你的心如小小的寂寞的城 恰若青石的街道向晚...
    人尋閱讀 3,147評論 0 0

友情鏈接更多精彩內(nèi)容