成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

馬蜂窩 iOS App 啟動治理:回歸用戶體驗

Jinkey / 3173人閱讀

摘要:馬蜂窩旅游歷經(jīng)幾十個版本的開發(fā)迭代,在啟動流程上積累了一定的技術(shù)債務(wù)。我們定義啟動廣告曝光率啟動廣告曝光啟動廣告加載。

增長、活躍、留存是移動 App 的常見核心指標,直接反映一款 App 甚至一個互聯(lián)網(wǎng)公司運行的健康程度和發(fā)展動能。啟動流程的體驗決定了用戶的第一印象,在一定程度上影響了用戶活躍度和留存率。因此,確保啟動流程的良好體驗至關(guān)重要。

「馬蜂窩旅游」App 是馬蜂窩為用戶提供服務(wù)的主要陣地,其承載的業(yè)務(wù)模塊不斷豐富和完善,產(chǎn)品功能日趨復(fù)雜,已經(jīng)逐漸成長為一個集合旅行信息、出行決策、自由行產(chǎn)品及服務(wù)交易的一站式移動平臺。

「馬蜂窩旅游」iOS App 歷經(jīng)幾十個版本的開發(fā)迭代,在啟動流程上積累了一定的技術(shù)債務(wù)。為了帶給用戶更流暢的使用體驗,我們團隊實施了數(shù)月的專項治理,也總結(jié)出一些 iOS 啟動治理方面的實踐經(jīng)驗,借由本文和大家分享。

0X0?如何定義「啟動」

要分析和解決啟動問題,我們首先需要界定啟動的內(nèi)涵和邊界,從哪開始、到哪結(jié)束,中間經(jīng)歷了哪些階段和過程。以不同視角去觀察時,可以得出不同結(jié)論。

技術(shù)視角

App 啟動原本就是程序啟動的技術(shù)過程。作為開發(fā)人員,我們很自然地更愿意從技術(shù)階段去看待和定義啟動的流程。

App 啟動的方式分為冷啟動熱啟動兩種。簡單來說,冷啟動發(fā)生時后臺是沒有這個應(yīng)用的進程的,程序需要從頭開始,經(jīng)過漫長的準備和加載過程,最終運行起來。而熱啟動則是在后臺已有該應(yīng)用進程的情況下發(fā)生的,系統(tǒng)不需要重新創(chuàng)建和初始化。因此,從技術(shù)視角討論啟動治理時,主要針對冷啟動。

從技術(shù)視角出發(fā),分析 iOS 的啟動過程,主要分為兩個階段:

pre-main: main() 函數(shù)是程序執(zhí)行入口,從進程創(chuàng)建到進入 main 函數(shù)稱為 premain 階段, 主要包括了環(huán)境準備、資源加載等操作;

post-main: main() 函數(shù)到-didFinishLaunchWithOptions:方法執(zhí)行結(jié)束。該階段已獲得代碼執(zhí)行控制權(quán),是我們治理的主要部分。

??????????????????

??+----------------X------------------------------------X--------->

start?????????????main???????????????????-didFinishLaunchWithOptions:
用戶視角

iOS App 是面向終端用戶的產(chǎn)品,因此衡量啟動的最終標準還是要從用戶視角出發(fā)。

從用戶視角定義啟動,主要以用戶主觀視覺為依據(jù),以頁面流程為標準。這樣看來,常見的 App 啟動可以分為三個階段:

T1:閃屏頁

閃屏頁是啟動過程中的靜態(tài)展示頁。在冷啟動的過程中,App 還沒有運行起來,需要經(jīng)歷環(huán)境準備和初始化的過程。這個過渡階段需要展示一些視圖,供阻塞等待中的用戶瀏覽。

iOS 系統(tǒng) (SpringBoard) 根據(jù) App Bundle 目錄下的 Info.plist 中"Launch screen interface file base name"字段的值,找到所指定的 xib 文件,加載渲染展示該視圖。

閃屏頁的展示是系統(tǒng)行為,因此無法控制;加載的是 xib 描述文件,無法定制動態(tài)展示邏輯,因此是靜態(tài)展示。

對應(yīng)技術(shù)啟動階段的 pre-main 階段

T2(可選):歡迎頁(廣告)

App 運行后根據(jù)特定的業(yè)務(wù)邏輯展示的第一個頁面。常見的有廣告頁和裝機引導流程。

歡迎頁是業(yè)務(wù)定制的,因此可根據(jù)業(yè)務(wù)需要優(yōu)化展示策略,該階段本身也是可選的。

T3:目標頁?(落地頁)?

App 啟動的目標頁。

可以是首頁或特定的落地頁

目標頁的加載渲染渲染完成標志著 T3 階段的結(jié)束,也標志著啟動流程的結(jié)束。

啟動治理的最終目標是提升用戶體驗,在這樣的思想下,本文關(guān)于啟動流程的討論主要圍繞用戶視角進行。

0X1?方法論及關(guān)鍵指標 APM 方法論

對 iOS 啟動的治理,本質(zhì)上是對應(yīng)用性能優(yōu)化 (App Performance Management) 的過程,其基本的方法論可以歸納為:

界定問題

準確描述現(xiàn)象,確定問題的邊界

確定量化評價手段,明確關(guān)鍵指標

分析問題

分析問題產(chǎn)生的主要原因,根本原因

確定問題的重要性,優(yōu)先級

性能問題可能是單點的短板,也可能是復(fù)雜的系統(tǒng)性問題,切忌「頭痛醫(yī)頭,腳痛醫(yī)腳」。要嚴謹全面地分析問題,找到主要原因、根本原因予以優(yōu)先解決

解決問題

確定解題的具體技術(shù)方案

根據(jù)關(guān)鍵指標量化成果

對問題進行總結(jié),積累沉淀

持續(xù)監(jiān)控

性能問題是持續(xù)的,長期的

對關(guān)鍵技術(shù)指標建立長效的監(jiān)控機制,確保增量能被及時反饋,予以處理

關(guān)鍵指標

1. 啟動耗時

啟動耗時是衡量啟動性能的核心指標,因為它直接影響了用戶體驗并對用戶轉(zhuǎn)化率產(chǎn)生影響。

對啟動耗時指標的拆解有助于細粒度地監(jiān)控啟動過程,幫助找到問題環(huán)節(jié)。具體可以拆解為:

技術(shù)啟動耗時指標

pre-main

core-postmain

主觀啟動耗時指標

T1_duration? :從程序運行起點到主視窗可見

T2_duration

T3_duration

total_duration

根據(jù)對馬蜂窩 App 用戶的行為數(shù)據(jù)分析確認,我們得到以下結(jié)論:

啟動耗時和啟動流失率正相關(guān)

啟動耗時和次日留存負相關(guān)

2.啟動流失率

1). 如何定義啟動流失

用戶視角的啟動流程完成前(即目標頁渲染完成前),用戶主動離開 App(進入后臺,殺死 App, 切換到其他 App 等),記做一次啟動流失。

啟動流失率計算公式為:

啟動 PV 流失率:啟動流失 PV / App 首次進入前臺 PV

啟動 UV 流失率:啟動流失 UV / DAU

UV 絕對流失率:當日僅進入前臺一次且流失的 UV / DAU

2)?如何定義首次進入前臺

我們先來區(qū)分下冷啟動,熱啟動和首次進入前臺的概念:

iOS App 有后臺機制,App 可在某些條件下,在用戶不感知的情況下在后臺啟動(如后臺刷新)。由于用戶不感知,如果當日該用戶沒有主動進入前臺,則不會記作活躍用戶。因此,單純的后臺啟動不是啟動流失率的分母。

但是當 iOS App 從后臺啟動,并留在內(nèi)存中沒有被操作系統(tǒng)清除,而一段時間后,用戶觸發(fā) App 進入前臺,這種情況雖然是熱啟動,但應(yīng)被看作「首次進入前臺」。

3)?如何定位流失的時機

根據(jù)定義,用戶主動離開 App 則記作一次流失。從技術(shù)角度可以找到兩個點:

applicationdidEnterBackground

applicaitonWillTerminate

但在實踐的典型場景中我們發(fā)現(xiàn),從用戶點擊 Home 鍵到程序接收到-applicationdidEnterBackground 回調(diào)存在一定的時間差,該時間差會影響到流失率的判斷。

例如,用戶在時刻 0.0s 啟動 app,啟動總時長為 4.0s。用戶在時刻 3.8s 點擊了 home 鍵離開 App,則應(yīng)該記作 launch_leave = true。而程序在時刻 4.3s 接收到了-applicationDidEnterBackground 回調(diào),此時啟動已經(jīng)結(jié)束,獲得了啟動耗時 4.0s。通過比較 Tleave > Tlaunch_total,則錯誤地記為?launch_leave = false。

由此推測,這里的 delay 是設(shè)置靈敏度阻尼,消除用戶決策的擺動。這個延時大約在 0.5s 左右。

為了避免這個誤差,我們的解決方案是利用 inactive 狀態(tài),找到準確的用戶決策起點:

用戶即將離開前臺時,會先進入 inactive 狀態(tài),通過-appWillResignActive:拿到?jīng)Q策起點的時間戳 Tdetermine

根據(jù)用戶最終決策行為,是否確實離開,再決定決策 Tdetermine 是否有效

最終根據(jù)有效的 Tdetermine 作為判斷流失行為的標準,而不是-applicationdidEnterBackground 的時間點

3.?啟動廣告曝光率

廣告是 App 盈利的主要手段之一。廣告曝光率直接決定了廣告點擊消費率;而廣告曝光 PV 和加載 PV 直接影響了廣告售價。

我們定義:啟動廣告曝光率 = 啟動廣告曝光 PV / 啟動廣告加載 PV。

其中廣告素材需要下載,素材渲染需要一定耗時,這些都會對廣告曝光率產(chǎn)生影響。進一步來說,啟動廣告的曝光率會受到 App 啟動性能的影響,但更主要的是受緩存和曝光策略的影響,詳細闡述在下文「精細化策略」部分介紹。

0X2?iOS App 啟動優(yōu)化

以上,我們對 iOS App 啟動治理的思路和關(guān)鍵指標進行了分析和拆解,下面來說一下從技術(shù)層面和業(yè)務(wù)層面,我們對啟動性能的優(yōu)化和流程治理分別做了哪些事情。

?一、技術(shù)啟動優(yōu)化

1.?優(yōu)化pre-main

1). pre-main?主要流程分析

在進行該階段的優(yōu)化前,我們需要對 Pre-Main 階段的過程有所了解,網(wǎng)上的文章較多,這里主要推薦兩篇 WWDC 參考文章:

App Startup Time: Past, Present, and Future(https://developer.apple.com/v...)

Optimizing App Startup Time(https://developer.apple.com/v...)

總結(jié)來看,pre-main 主要流程包括:

????1. fork 進程

????2. 加載 executable

????3. 加載 DYLD

? ? 4. 分析依賴,迭代加載動態(tài)庫

????? ? a. rebase

????? ? b. rebind

????? ? c. 耗時多

? ? 5. 準備環(huán)境

????? ? a. 準備 OC 運行時

????? ? b. 準備 C++環(huán)境

? ? 6. main 函數(shù)

2).?優(yōu)化建議

盡量少使用動態(tài)庫

????? ? a. 盡量編譯到靜態(tài)庫中,減少 rebase,rebind 耗時

????? ? b.盡量合并動態(tài)庫,減輕依賴關(guān)系

控制 Class 類的數(shù)量規(guī)模

由于 selector 需要在初始化時做唯一性檢查,應(yīng)盡量減少使用

少用 initializers?

????? ? a. 嚴格控制 +load 方法使用

多用 Swift?

????? ? a. Swift 沒有運行時

????? ? b. Swift 沒有 initializers

????? ? c. Swift 沒有數(shù)據(jù)不對齊問題

3).?性能監(jiān)控:如何獲取啟動起點

啟動的結(jié)束時間相對來說是比較好確定的,但如何定位啟動的起點,是啟動監(jiān)控的一個難點。

對于開發(fā)環(huán)境,可以通過 Xcode 配置啟動參數(shù),獲得 pre-main 的啟動報告:

DYLD_PRINT_STATICS?=?1

對于線上環(huán)境,根據(jù) premain 主要流程的分析,我們的解決方案是:

創(chuàng)建動態(tài)庫 ABootMonitor.dylib

ABootMonitor.dylib?實現(xiàn)+load 方法,記錄啟動起點時間

將 ABootMonitor.dylib 放在 executable 動態(tài)庫依賴的頭部

通過上述方法,可以在線上環(huán)境盡量地模擬出最早的啟動時間點,從而更好地監(jiān)測優(yōu)化效果。

2.?優(yōu)化post-main

post-main 階段的技術(shù)優(yōu)化主要針對兩個方法的執(zhí)行耗時來進行:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:

- (void)applicationDidBecomeActive:(UIApplication *)application;

為什么包含 2,需要我們對 iOS App 生命周期有一定理解。從操作系統(tǒng)的視角來看,iOS App 本質(zhì)上是一個進程。對于 Mac OS/iOS 系統(tǒng),進程的生命周期狀態(tài)包括了:

not-running

running?

進程激活,可以運行的狀態(tài)

suspend?

進程被掛起,不可以執(zhí)行代碼,通常在 UIApplication 進入后臺后一段時間被系統(tǒng)掛起

zombie?

進程回收前的臨時狀態(tài),很短暫

terminated?

進程終止,并被清理

而對于 UIApplication,定義了生命周期狀態(tài):

//??UIApplication.h

typedef?NS_ENUM(NSInteger,?UIApplicationState)?{
????UIApplicationStateActive,?????//?前臺,?UIApplication響應(yīng)事件
????UIApplicationStateInactive,???//?前臺,?UIApplication不響應(yīng)事件
????UIApplicationStateBackground??//?后臺,?UIApplication不在屏幕上顯示
}?NS_ENUM_AVAILABLE_IOS(4_0);

組合起來的狀態(tài)機如下圖:

通過上面的討論,我們可以分析出以下問題:

UIApplication 會因為某種原因,在用戶不感知的情況下被喚起,進程進入 running 狀態(tài),但停留在 iOS 的 background 狀態(tài)

每次冷啟動都會執(zhí)行- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:,但未必進入前臺

在 didFinishLaunchingWithOptions 中進行大量 UI 和網(wǎng)絡(luò)請求等操作是不合理

post-main?優(yōu)化思路和建議

整理拆分啟動項,以啟動項為粒度進行測量

啟動項執(zhí)行盡量在背景線程

啟動的過程 CPU 占用較高,占用主線程會導致卡頓,耗時延長,用戶體驗不佳

啟動項并發(fā)執(zhí)行

啟動項延遲執(zhí)行

當 CPU 時間片跑滿時,使用多線程并發(fā)不能提高性能,反而會因為頻繁的線程上下文切換,造成 overhead 耗時增長

盡可能將啟動項延遲執(zhí)行,在時間軸上平滑,降低 CPU 利用率峰值

啟動項分組

-didFinishLaunchingWithOptions 只執(zhí)行必要的核心啟動項

其他啟動項,在首次調(diào)用-applicationDidBecomeActive:后執(zhí)行

二、精細化策略

1. 交互優(yōu)化

通過技術(shù)的實現(xiàn)手段,我們可以從客觀上減少啟動的絕對耗時。而從用戶視角來看,對于啟動是否流暢會受到很多心理因素的主觀影響。因此從另一方面,我們可以從優(yōu)化交互的角度提升用戶體驗。

避免阻塞等待

我們都希望用戶可以盡快地使用 App,不要出現(xiàn)流失。但在快消費的時代,用戶的耐心是極其有限的。

因此,如果有理由需要用戶進行等待,就應(yīng)該注意盡量避免產(chǎn)品流程是阻塞的。即使有更充足的理由必須讓用戶在阻塞狀態(tài)原地等待,也應(yīng)該給用戶提供可響應(yīng)的交互。

例如,在 T2 歡迎/廣告頁階段,為了避免用戶阻塞等待,應(yīng)該提供明顯的「跳過」按鈕,允許用戶進行跳過操作。

如果非要用戶在這個階段等待不可,也可以花一些小心思提供可響應(yīng)的交互,比如點擊觸發(fā)視覺的變化等,不要讓用戶除了等待無事可做。

增加視覺信息量

增加屏幕上視圖的信息量提供給用戶消費,轉(zhuǎn)移其注意力,降低用戶對等待的感受。

例如,在 T1 閃屏頁階段,用戶處于阻塞等待的狀態(tài),無法跳過。而且閃屏頁是系統(tǒng)渲染的靜態(tài)視圖,我們無法提供動態(tài)響應(yīng)。那么,我們可以通過在靜態(tài)視圖上提供更多信息量,給等待中的用戶消費。

主觀感受對比如下圖:

合理的動態(tài)提示

合適的動畫

事實上,早期在部分高性能 Android 設(shè)備上,App 的啟動比同水平 iDevice 要快。但由于 iOS 設(shè)計了符合神經(jīng)認知學的交互動畫,使得主觀感受到的時間縮短。

動畫是否「合適」,關(guān)鍵在于對場景的選擇和數(shù)量的把握。一個常見的動畫耗時約為 0.25s,對于啟動流程來說,已經(jīng)可以解決或掩蓋不少問題了。

合適的提示信息

好的交互體驗和產(chǎn)品流程,至少應(yīng)該是符合用戶預(yù)期的。給以合適的動態(tài)提示,讓用戶知道此刻使用的 App 正在發(fā)生什么,可以極大地提升用戶體驗。

例如在 T2 廣告頁階段,廣告需要占時 3 秒鐘的時間。交互上建議給與廣告消失的倒計時提示:

一方面,倒計時提示可以有動態(tài) loading 的視覺效果,展現(xiàn) App 的良好運行;

另一方面,倒計時可以讓用戶安心,主觀上耗時減少,情緒上不至于焦慮和退出。

2.?基于場景的啟動會話

根據(jù)對啟動過程的定義,我們可以列舉出一些啟動的「起點」和「終點」,比如:

啟動觸發(fā)點:

點擊 App 圖標正常啟動

初次安裝

點擊 PUSH 進入

應(yīng)用間跳轉(zhuǎn)

3DTouch

Siri 喚起

其他

啟動終點--目標頁:

應(yīng)用首頁

指定的落地頁

可以看出,啟動的起點和終點多種多樣,而對于啟動流程的設(shè)定,很多都是和業(yè)務(wù)場景強相關(guān)的,比如:

初次安裝需要進入裝機引導流程

正常啟動需要展示廣告

PUSH 進入可以不展示廣告,直達落地頁

其他

如何才能維護這些復(fù)雜的啟動關(guān)系,提高業(yè)務(wù)承載能力呢?我們的優(yōu)化思路是基于場景創(chuàng)建啟動會話:

由啟動參數(shù)和其他條件確定啟動場景

根據(jù)啟動場景創(chuàng)建具體的啟動會話

啟動會話接管之后的啟動流程

3.?啟動廣告曝光和緩存策略

廣告曝光主要流程為:請求廣告接口 —> 準備廣告素材 —> 展示廣告頁,進行曝光。

在準備廣告素材環(huán)節(jié),我們會判斷廣告素材是否命中緩存。如果命中則直接使用緩存,這樣可以明顯縮短廣告加載的時間。如果沒有命中,則開始下載廣告素材。當廣告素材超過設(shè)定的準備時長,則此次曝光不顯示。

通過以往數(shù)據(jù)量化分析,我們發(fā)現(xiàn)通常情況下,廣告未曝光的主要原因是由于廣告素材準備超時,且素材體積和廣告曝光率是負相關(guān)的。為了保證廣告的曝光率,我們應(yīng)該盡量減少廣告素材的體積,并且提高廣告素材緩存的命中率。

下面分別介紹下我們的啟動廣告預(yù)緩存策略和啟動廣告曝光策略。

啟動廣告預(yù)緩存策略

廣告素材接口和廣告曝光接口分離

在可能的合適時機,下載廣告素材

??????例如后臺啟動,后臺刷新等

盡可能地提前下發(fā)廣告素材

拉長廣告素材投放的時間窗口

常見地可提前半月下發(fā)廣告素材

對于「雙十一等大促活動,應(yīng)盡早地下發(fā)素材

啟動廣告曝光策略

分級的廣告曝光QoS策略

???????若業(yè)務(wù)許可,可對廣告優(yōu)先級進行分級

對于低優(yōu)先級,應(yīng)用 cache-only 的曝光策略

對于普通優(yōu)先級,應(yīng)用 max-wait 的曝光策略

對于高優(yōu)先級,應(yīng)用 max-retry 的曝光策略

靈活的曝光時機選擇

通常我們僅在首次進入前臺時,進行廣告曝光,但這有一定的缺陷:

啟動耗時長了,用戶體驗差,啟動流失率高

對于當日只有一次啟動且啟動流失的用戶,丟了這個 DAU

我們可以在 App 首次進入前臺,和熱啟動切回前臺時選擇時機,進行有策略的曝光

可依據(jù)策略,在首啟時不展示廣告頁,提升用戶體驗,DAU,減少啟動流失

可在 App 切回時展示,提升廣告曝光 PV,和曝光率。

由于 App 之前已經(jīng)啟動,此時大概率已經(jīng)緩存了廣告素材

由于 App 一次生命周期存在多次切回前臺,曝光 PV 可以得到提升

根據(jù)馬蜂窩 App 的統(tǒng)計分析,在激進策略下可提升曝光 PV 約 4 倍

三、合理利用平臺機制

iOS 經(jīng)過多年的迭代,提供了很多智能的平臺機制。合理利用這些機制,可以強化 App 的功能和性能。

1.?內(nèi)存?;?/strong>

我們已經(jīng)討論了冷啟動和熱啟動的區(qū)別:

冷啟動是進程并不存在的狀態(tài),一切需要從 0 開始。

熱啟動是指進程在內(nèi)存中(iOS 不支持 SWAP),此時可能處于 background 的 running 狀態(tài)或 suspend 狀態(tài),用戶喚起進去前臺。

熱啟動可以極大地減少 T1 閃屏頁時間,從而減少啟動耗時。

因此,我們應(yīng)該盡量增加熱啟動概率,并且盡量減少 App 在后臺被系統(tǒng)回收的概率。

iOS App 生命周期中關(guān)于系統(tǒng)內(nèi)回收策略如下:

App 進入后臺后,進程會活躍一段時間后,會被操作系統(tǒng)掛起,進入 suspend 狀態(tài)。除非在 info.plist 指定進入后臺即退出。

前臺運行的 App 擁有內(nèi)存的優(yōu)先使用權(quán)

當前臺的 App 需要更多物理內(nèi)存時,系統(tǒng)根據(jù)一定策略,將一部分掛起的 App 進行釋放

系統(tǒng)優(yōu)先選擇占用內(nèi)存多的 App 進行釋放

優(yōu)化思路:

App 進入后臺時,應(yīng)該將內(nèi)存資源竟可能的釋放,盡量在內(nèi)存中?;?/p>

尤其對于可重得的圖片,文件等資源進行釋放

對于可持久化的非重要內(nèi)存,也可做持久化后釋放

對于線上,應(yīng)利用后臺進程激活狀態(tài),加強對后臺內(nèi)存使用的監(jiān)控

2.?后臺拉起

iOS 系統(tǒng)提供了一些機制,可以幫助我們實現(xiàn)在用戶不感知的情況下拉起 App。合適的拉起策略,可以優(yōu)化 App 性能和功能表現(xiàn),比如提升當日首啟熱啟動的概率;在后臺準備更新一些數(shù)據(jù),如更新 PUSH token、準備啟動廣告素材等。

iOS 常見的后臺拉起機制包括:

Background-fetch 后臺刷新

需要權(quán)限

在某特定時機拉起,智能策略

PUSH?

靜默推送

遠端推送

aps 中指定 "content-available = 1"

App 實現(xiàn)相關(guān)處理方法

地理圍欄

后臺網(wǎng)絡(luò)任務(wù) NSURLBackgroundSession

VOIP 等其他

使用后臺機制時,有以下幾點需要注意:

常見的后臺機制需要 entitlement 聲明和用戶授權(quán)

部分節(jié)能模式會使部分拉起機制失效,導致節(jié)能量模式不可用

拉起策略參考用戶意圖,用戶主動殺死 App,會使部分拉起機制失效

正常進入后臺,該 App 會向系統(tǒng)應(yīng)用「AppSwitcher」注冊,并受其管理

如果用戶主動殺死 App,該 App 不會向「AppSwitcher」注冊

后臺拉起時,主要從 AppSwitcher 的注冊列表選擇 App 進行操作。例如,后臺刷新會根據(jù)某種策略排序,依此拉起 AppSwitcher 中注冊的部分 App

批量拉起會導致服務(wù)端接口壓力過大

例如使用 PUSH 拉起,則短時間內(nèi)可能有數(shù)千萬的 App 被拉起,此時接口請求不亞于一次針對服務(wù)端的 DDOS 攻擊,需要整理和優(yōu)化

四、結(jié)構(gòu)化定制

頁面棧/樹優(yōu)化

App 通過頁面進行組織,在啟動過程中,我們需要構(gòu)建根頁面棧。

由上分析我們知道,App 存在后臺拉起,我們建議在首次進入前臺時才進行頁面渲染操作。但另一方面,根頁面棧是 App 的基本結(jié)構(gòu),應(yīng)該作為核心啟動流程。因此我們提出以下解決方案:

涉及啟動的頁面,如首頁、落地頁等,應(yīng)將頁面棧創(chuàng)建、數(shù)據(jù)請求、頁面渲染分離

在核心啟動流程 (didFinishLaunch) 創(chuàng)建核心頁面棧

在即將進入前臺時,異步請求數(shù)據(jù)

在目標頁即將展示時,進行渲染

例如,在廣告頁消失前的 1s,通知首頁進行渲染,如下圖

由于目標頁可能和 T2 等啟動階段重疊,應(yīng)特別注意頁面加載的性能問題,避免交叉影響

0x3?結(jié)語

經(jīng)過團隊 3 個月的持續(xù)優(yōu)化治理,馬蜂窩 iOS App 的啟動優(yōu)化取得了一些成果:

啟動耗時:約 3.6s,減少約 50%

PV啟動流失率:降低約 30%

啟動廣告曝光率:大幅提升

ios App 的啟動治理乃至性能管理,是一個長期且艱巨的過程,需要各位開發(fā)同學具備良好的對平臺和對代碼性能的理解意識。其次,性能問題也常常是一個復(fù)雜的系統(tǒng)性問題,需要嚴謹?shù)胤治龊屯评?,在此感謝支持以上工作的馬蜂窩數(shù)據(jù)分析師。最后,這項工作需要建立完善的性能監(jiān)控機制,持續(xù)跟蹤,主動解決。

One?More Thing?

我們計劃于近期將馬蜂窩 iOS 的啟動框架開源,歡迎持續(xù)關(guān)注馬蜂窩公眾號動態(tài)。期待和大家交流。

本文作者:許旻昊,馬蜂窩 iOS 研發(fā)技術(shù)專家。

(馬蜂窩技術(shù)原創(chuàng)內(nèi)容,轉(zhuǎn)載務(wù)必注明出處保存文末二維碼圖片,謝謝配合。)

關(guān)注馬蜂窩技術(shù)公眾號,找到更多你需要的內(nèi)容

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/110222.html

相關(guān)文章

  • 蜂窩容器化平臺前端賦能實踐

    摘要:本文將結(jié)合馬蜂窩容器化平臺賦能前端應(yīng)用構(gòu)建的實踐經(jīng)驗,介紹整個平臺背后的設(shè)計和實現(xiàn)原理,取得的一些效果及問題的優(yōu)化方案。如果使用容器化平臺就不會出現(xiàn)這方面的擔憂。 容器對前端開發(fā)真的有用嗎?答案是肯定的。 最初當我向公司的前端同學「安利」容器技術(shù)的時候,很多人都會說:「容器?這不是用在后端的技術(shù)嗎?我不懂啊,而且前端開發(fā)用不上吧。」 showImg(https://segmentfau...

    wall2flower 評論0 收藏0
  • 蜂窩容器化平臺前端賦能實踐

    摘要:本文將結(jié)合馬蜂窩容器化平臺賦能前端應(yīng)用構(gòu)建的實踐經(jīng)驗,介紹整個平臺背后的設(shè)計和實現(xiàn)原理,取得的一些效果及問題的優(yōu)化方案。如果使用容器化平臺就不會出現(xiàn)這方面的擔憂。 容器對前端開發(fā)真的有用嗎?答案是肯定的。 最初當我向公司的前端同學「安利」容器技術(shù)的時候,很多人都會說:「容器?這不是用在后端的技術(shù)嗎?我不懂啊,而且前端開發(fā)用不上吧。」 showImg(https://segmentfau...

    余學文 評論0 收藏0
  • 蜂窩容器化平臺前端賦能實踐

    摘要:本文將結(jié)合馬蜂窩容器化平臺賦能前端應(yīng)用構(gòu)建的實踐經(jīng)驗,介紹整個平臺背后的設(shè)計和實現(xiàn)原理,取得的一些效果及問題的優(yōu)化方案。如果使用容器化平臺就不會出現(xiàn)這方面的擔憂。 容器對前端開發(fā)真的有用嗎?答案是肯定的。 最初當我向公司的前端同學「安利」容器技術(shù)的時候,很多人都會說:「容器?這不是用在后端的技術(shù)嗎?我不懂啊,而且前端開發(fā)用不上吧?!?showImg(https://segmentfau...

    desdik 評論0 收藏0

發(fā)表評論

0條評論

Jinkey

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<