版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2021.05.17 星期一 |
前言
MetricKit
由iOS13系統(tǒng)進(jìn)引入澜共,用來(lái)匯總和分析有關(guān)異常和崩潰診斷以及電源和性能指標(biāo)的每個(gè)設(shè)備的報(bào)告。下面我們就一起來(lái)看下這個(gè)框架锥腻。感興趣的可以看下面幾篇文章嗦董。
1. MetricKit框架詳細(xì)解析(一) —— 基本概覽(一)
2. MetricKit框架詳細(xì)解析(二) —— Improving Your App's Performance(一)
3. MetricKit框架詳細(xì)解析(三) —— Reducing Your App's Memory Use(一)
4. MetricKit框架詳細(xì)解析(四) —— Gathering Information About Memory Use(一)
5. MetricKit框架詳細(xì)解析(五) —— Making Changes to Reduce Memory Use(一)
6. MetricKit框架詳細(xì)解析(六) —— Preventing Memory-Use Regressions & Responding to Low-Memory Warnings(一)
7. MetricKit框架詳細(xì)解析(七) —— Reducing Your App's Launch Time(一)
8. MetricKit框架詳細(xì)解析(八) —— Reducing Disk Writes(一)
9. MetricKit框架詳細(xì)解析(九) —— Improving App Responsiveness(一)
開(kāi)始
首先看下主要內(nèi)容:
了解如何使用MetricKit在iOS應(yīng)用中監(jiān)視電源,性能和診斷瘦黑。內(nèi)容來(lái)自翻譯京革。
接著看下寫(xiě)作環(huán)境:
Swift 5, iOS 14, Xcode 12
下面就是正文了。
長(zhǎng)期以來(lái)幸斥,與Web
應(yīng)用程序不同匹摇,iOS
應(yīng)用程序被認(rèn)為過(guò)于小巧輕便,不必?fù)?dān)心監(jiān)視其性能睡毒。但是来惧,在現(xiàn)代,iOS應(yīng)用程序變得越來(lái)越大演顾,越來(lái)越復(fù)雜供搀,并且在幕后的工作比以往任何時(shí)候都要多∮缇樱現(xiàn)在,能夠遠(yuǎn)程監(jiān)視您的應(yīng)用程序在許多不同設(shè)備上的運(yùn)行方式至關(guān)重要葛虐。
某些iOS監(jiān)視工具已經(jīng)使用很長(zhǎng)時(shí)間了胎源。例如,您可以查詢(xún)?cè)O(shè)備以查看正在運(yùn)行的操作系統(tǒng)屿脐,或者是否正在使用Wi-Fi或蜂窩網(wǎng)絡(luò)連接涕蚤。另一種常見(jiàn)的做法是使用第三方分析工具(例如Firebase
或New Relic
)來(lái)幫助捕獲用戶的真實(shí)感受。
但是的诵,還有更多的診斷信息可以為iOS開(kāi)發(fā)人員提供幫助万栅!蘋(píng)果公司聽(tīng)了,并在iOS 13
中推出了MetricKit
西疤。使用此工具可以更輕松地從設(shè)備檢索診斷數(shù)據(jù)烦粒,并將其用于iOS的遠(yuǎn)程監(jiān)視。在本教程中代赁,您將通過(guò)使用Xcode
模擬接收診斷來(lái)探索MetricKit API
扰她。
您可以通過(guò)以下方式做到這一點(diǎn):
- 將
MetricKit
添加到入門(mén)應(yīng)用程序。 - 將示例數(shù)據(jù)加載到
Xcode
中芭碍。 - 使用
MetricKit
查看應(yīng)用使用統(tǒng)計(jì)信息徒役。
Looking Inside MetricKit
使用MetricKit
,您可以從OS
接收有關(guān)物理設(shè)備的診斷數(shù)據(jù)窖壕。它以JSON
格式發(fā)送包含最近24小時(shí)數(shù)據(jù)的報(bào)告忧勿。例如,如果您要將這些數(shù)據(jù)中繼到您自己的服務(wù)器上艇拍,這將很有幫助狐蜕。然后宠纯,您可以可視化和分析該數(shù)據(jù)卸夕,并使用它們來(lái)提高應(yīng)用程序的性能。
1. New APIs in iOS 14
MetricKit
自iOS 13
起就存在婆瓜,但在iOS 14
中獲得了一些重大改進(jìn)快集。
首先,它引入了一個(gè)全新的有效負(fù)載(payload)
廉白,稱(chēng)為MXDiagnosticPayload
个初。以前,您僅收到MXMetricPayload
猴蹂。新的MXDiagnosticPayload
提供了更多信息院溺,例如崩潰和異常。這是蘋(píng)果公司不斷探索擴(kuò)展框架方法的一個(gè)很好的例子磅轻。
此外珍逸,蘋(píng)果推出了全新的性能指標(biāo)MXAppExitMetric
逐虚。該對(duì)象表示應(yīng)用程序在前臺(tái)和后臺(tái)進(jìn)行的退出的類(lèi)型。此信息可以幫助您發(fā)現(xiàn)用戶為何離開(kāi)您的應(yīng)用程序以及處于何種狀態(tài)谆膳。
詳細(xì)了解
在本教程中叭爱,您將使用Shopping Trolley
,這是一個(gè)顯示不同類(lèi)型水果的簡(jiǎn)單購(gòu)物清單的應(yīng)用程序 —— 因?yàn)槭澜顼@然需要更多的水果清單應(yīng)用程序漱病。
注意:開(kāi)始之前买雾,您應(yīng)該知道
MetricKit
僅可在真實(shí)的iOS
設(shè)備上使用,并且與模擬器不兼容杨帽。因此漓穿,您需要插入真實(shí)的設(shè)備才能端到端運(yùn)行此功能。
首先打開(kāi)ShoppingListTableViewController.swift
注盈。 將此代碼添加到文件頂部器净。
import MetricKit
現(xiàn)在,您可以訪問(wèn)MetricKit
框架当凡。
接下來(lái)山害,將此代碼添加到viewDidLoad()
中:
let metricManager = MXMetricManager.shared
metricManager.add(self)
這將訪問(wèn)框架提供的MetricManager
。 然后將自身ShoppingShopTableTableViewController
添加為metricManager
的訂閱者沿量,這使它能夠偵聽(tīng)來(lái)自OS
的度量有效負(fù)載浪慌。
接下來(lái),您只需要在ShoppingListTableViewController.swift
的底部添加最后一段代碼即可朴则。
extension ShoppingListTableViewController: MXMetricManagerSubscriber {
func didReceive(_ payloads: [MXMetricPayload]) {
guard let firstPayload = payloads.first else { return }
print(firstPayload.dictionaryRepresentation())
}
func didReceive(_ payloads: [MXDiagnosticPayload]) {
guard let firstPayload = payloads.first else { return }
print(firstPayload.dictionaryRepresentation())
}
}
這是view controller
上的擴(kuò)展权纤,符合MXMetricManagerSubscriber
,其中包含兩個(gè)可以從MetricKit
接收有效負(fù)載(payloads)
的方法乌妒。在這種情況下汹想,接收有效負(fù)載時(shí),只需將其打印到控制臺(tái)即可撤蚊。但是古掏,在生產(chǎn)版本中,這是記錄指標(biāo)的好地方侦啸,例如對(duì)服務(wù)器進(jìn)行API調(diào)用槽唾。
恭喜你!您已經(jīng)集成了MetricKit
光涂。
1. Understanding MetricKit APIs
該框架的接口非常簡(jiǎn)單明了庞萍,您可以看到Apple在開(kāi)發(fā)過(guò)程中投入了多少想法。該框架包括:
- 具有訂戶協(xié)議的管理器類(lèi)忘闻。
- 每種指標(biāo)和診斷類(lèi)別的類(lèi)钝计。
- 報(bào)告數(shù)據(jù)的有效載荷
(Payload)
類(lèi)。 - 測(cè)量單位的類(lèi),例如蜂窩信號(hào)強(qiáng)度條私恬。這真太了不起了交播!
- 用于表示直方圖之類(lèi)的累積數(shù)據(jù)的類(lèi)。他們又做了艱苦的工作践付!
2. Understanding MXMetricManager
MXMetricManager
是MetricKit
框架的心臟秦士。這是共享對(duì)象,用于管理您的訂閱以接收設(shè)備上的每日指標(biāo)永高。
MetricKit
在首次調(diào)用shared
之后開(kāi)始為您的應(yīng)用程序累積報(bào)告隧土。要開(kāi)始接收度量標(biāo)準(zhǔn)報(bào)告,請(qǐng)首先使用符合MXMetricManagerSubscriber
協(xié)議的類(lèi)調(diào)用add(_ :)
命爬。
然后曹傀,系統(tǒng)最多每天發(fā)送一次這些報(bào)告。每個(gè)報(bào)告均包含過(guò)去24
小時(shí)內(nèi)的指標(biāo)以及以前未提交的報(bào)告饲宛。
Manager
還具有remove(_ :)
皆愉,可讓您隨時(shí)刪除訂閱者。
3. Implementing MXSignpostMetric
使用MetricKit
框架的一個(gè)巨大好處是艇抠,您現(xiàn)在可以將自己的指標(biāo)合并到Apple
提供的“out of the box”
的指標(biāo)中幕庐。 這非常強(qiáng)大,因?yàn)樗馕吨梢韵虬l(fā)送到服務(wù)器的報(bào)告中添加自定義指標(biāo)家淤,從而使您可以進(jìn)一步挖掘异剥。
首先添加一個(gè)自定義指標(biāo)以在用戶加載ShoppingListTableViewController
時(shí)進(jìn)行記錄。 在現(xiàn)有fruit
的正下方直接添加fruitsLogHandle
絮重。
let fruitsLogHandle = MXMetricManager.makeLogHandle(category: "Fruits")
這將創(chuàng)建一個(gè)類(lèi)似于bucket
的句柄冤寿,用于保存您的自定義指標(biāo)。
將此代碼添加到viewDidLoad()
的末尾青伤。
mxSignpost(
.event,
log: fruitsLogHandle,
name: "Loading Fruits TableViewController")
當(dāng)視圖控制器為用戶完成加載后督怜,mxSignpost
將在fruits bucket
中記錄一個(gè)自定義指標(biāo)。 這是一個(gè)簡(jiǎn)單的示例狠角,您真的可以進(jìn)一步擴(kuò)展它号杠。 例如,如果您的應(yīng)用程序具有視頻播放器擎厢,則記錄流開(kāi)始和結(jié)束的時(shí)間可能會(huì)很有用究流。
4. Implementing MXMetricPayload
您可以從MetricKit
接收兩個(gè)不同的有效負(fù)載(payloads)
辣吃。 從MXMetricPayload
開(kāi)始 —— 這是一個(gè)封裝每日指標(biāo)報(bào)告的對(duì)象动遭。 切記:要觸發(fā)MetricKit
每日?qǐng)?bào)告,您必須插入真實(shí)設(shè)備神得! 如果您沒(méi)有設(shè)備厘惦,則仍然可以通讀本教程,因?yàn)樘峁┝耸纠?code>JSON有效負(fù)載。
在設(shè)備上構(gòu)建并運(yùn)行宵蕉。
導(dǎo)航回Xcode
酝静,然后選擇Debug ? Simulate MetricKit Payloads
。
這會(huì)觸發(fā)一個(gè)示例每日?qǐng)?bào)告羡玛,其形狀與您將自然收到的報(bào)告的形狀相同别智。 您應(yīng)該在控制臺(tái)上看到兩個(gè)有效載荷。
AnyHashable("cellularConditionMetrics"): {
cellConditionTime = {
histogramNumBuckets = 3;
histogramValue = {
0 = {
bucketCount = 20;
bucketEnd = "1 bars";
bucketStart = "1 bars";
};
1 = {
bucketCount = 30;
bucketEnd = "2 bars";
bucketStart = "2 bars";
};
2 = {
bucketCount = 50;
bucketEnd = "3 bars";
bucketStart = "3 bars";
};
};
};
上面的代碼示例復(fù)制了完整的有效載荷的一小段代碼稼稿,顯示了cellConditionMetrics
薄榛。 有效負(fù)載的這一方面提供了有關(guān)您的用戶在使用您的應(yīng)用程序的最后24小時(shí)內(nèi)經(jīng)歷的蜂窩狀態(tài)的豐富數(shù)據(jù)。 通過(guò)告訴您它們?cè)谝粰谌眉撸瑑蓹诨蛉龣谏系姆?wù)次數(shù)敞恋,還可以進(jìn)一步深入研究。 您可以使用bucketCount
創(chuàng)建直方圖谋右。 想象一下硬猫,了解用戶在某些信號(hào)條上花費(fèi)的平均時(shí)間有多么大的幫助!
5. Understanding MXDiagnosticPayload
MXDiagnosticPayload
封裝設(shè)備提供的診斷數(shù)據(jù)改执,例如:
- Performance:崩潰報(bào)告和異常
- Responsiveness:應(yīng)用程序掛起率
- Disk Access:磁盤(pán)讀寫(xiě)
檢查此有效負(fù)載的樣本啸蜜。
[AnyHashable("crashDiagnostics"): <__NSArrayM 0x283764390>(
{
callStackTree = {
callStackPerThread = 1;
callStacks = (
{
callStackRootFrames = (
{
address = 74565;
binaryName = testBinaryName;
binaryUUID = "BE6FD323-B011-4E67-925B-A60362A1ADFA";
offsetIntoBinaryTextSegment = 123;
sampleCount = 20;
}
);
threadAttributed = 1;
}
);
};
diagnosticMetaData = {
appBuildVersion = 1;
appVersion = "1.0";
deviceType = "iPhone13,3";
exceptionCode = 0;
exceptionType = 1;
osVersion = "iPhone OS 14.4 (18D52)";
platformArchitecture = arm64e;
regionFormat = GB;
signal = 11;
terminationReason = "Namespace SIGNAL, Code 0xb";
virtualMemoryRegionInfo = "0 is not in any region. Bytes before following region: 4000000000 REGION TYPE START - END [ VSIZE] PRT/MAX SHRMOD REGION DETAIL UNUSED SPACE AT START ---> __TEXT 0000000000000000-0000000000000000 [ 32K] r-x/r-x SM=COW ...pp/Test";
};
version = "1.0.0";
}
上面的代碼示例復(fù)制了完整負(fù)載的一小段,顯示了crashDiagnostics
辈挂。 這捕獲了用戶經(jīng)歷的崩潰盔性。 它包括diagnosticMetaData
以及有用的詳細(xì)信息,例如操作系統(tǒng)和應(yīng)用程序版本呢岗。
由于這是崩潰冕香,因此有效負(fù)載還具有callStackTree
,接下來(lái)將對(duì)其進(jìn)行探討后豫。
6. Understanding MXCallStackTree
您對(duì)MetricKit
的探索越多悉尾,就越能了解它如何為Apple
自己的工具(例如Xcode Organizer
)提供動(dòng)力。 將應(yīng)用發(fā)布給用戶后挫酿,即使您不導(dǎo)入框架构眯,您仍然可以在Organizer
中查看由MetricKit
生成的報(bào)告。
如您所見(jiàn)早龟,此應(yīng)用程序是實(shí)時(shí)運(yùn)行的惫霸,具有可在Xcode
中進(jìn)行探索的真實(shí)數(shù)據(jù)。這是因?yàn)?code>Apple免費(fèi)提供大多數(shù)指標(biāo)數(shù)據(jù)葱弟。但是壹店,導(dǎo)入MetricKit
框架意味著您可以進(jìn)一步利用此數(shù)據(jù)并將其與您自己的指標(biāo)鏈接。如果您的服務(wù)器支持自定義可視化效果芝加,那么這也意味著您具有更大的顯示靈活性硅卢。
MXCallStackTree
是一個(gè)很好的數(shù)據(jù)示例,可以通過(guò)MetricKit
更好地利用數(shù)據(jù)。您不僅可以獲得有關(guān)崩潰和異常之類(lèi)的報(bào)告将塑,而且還可以獲得JSON
中提供的StackTrace
脉顿。通過(guò)將崩潰鏈接到實(shí)際的堆棧跟蹤信息,這對(duì)于進(jìn)一步操作非常有用点寥,因此您可以修復(fù)那些討厭的錯(cuò)誤艾疟。
7. Understanding MXAppExitMetric
MXAppExitMetric
是iOS 14
中提供的全新對(duì)象,代表用戶如何離開(kāi)您的應(yīng)用程序敢辩。退出類(lèi)型包括:
Foreground exit
Background exit
用戶可以出于多種原因退出應(yīng)用程序汉柒。關(guān)閉應(yīng)用程序可能是一個(gè)故意的決定责鳍,但有時(shí)操作系統(tǒng)會(huì)終止應(yīng)用程序 —— 最糟糕的是碾褂,由于內(nèi)存不足或發(fā)生異常。
在每個(gè)類(lèi)別中历葛,您可以得到以下數(shù)目的診斷信息:
- Normal App Exits - 正常應(yīng)用退出:該應(yīng)用從前臺(tái)或后臺(tái)正常退出乓诽。
- Abnormal App Exits - 應(yīng)用程序異常退出:應(yīng)用程序從前臺(tái)或后臺(tái)異常退出咒程。
- Memory Resource Limit - 內(nèi)存資源限制:由于使用過(guò)多內(nèi)存,系統(tǒng)從前臺(tái)或后臺(tái)終止了該應(yīng)用程序剥纷。
- Bad Access / Exception - 錯(cuò)誤的訪問(wèn)權(quán)限/異常:系統(tǒng)從前臺(tái)或后臺(tái)終止了該應(yīng)用程序确买,以嘗試進(jìn)行無(wú)效的內(nèi)存訪問(wèn)抹剩。
請(qǐng)記浊弧:每個(gè)類(lèi)別通常是一個(gè)屬性拓瞪,然后具有與直方圖結(jié)構(gòu)化數(shù)據(jù)的關(guān)系。此外呻拌,它還鏈接到其他類(lèi)缔御,例如MXStackTree
浙芙,這意味著您可以將某些應(yīng)用程序退出鏈接回實(shí)際的崩潰皇耗。
那有多強(qiáng)大南窗?功能強(qiáng)大!
Viewing in Organizer
Apple免費(fèi)提供一定級(jí)別的數(shù)據(jù)郎楼,以在Organizer
中可視化万伤。這是將來(lái)自App Store Connect
的數(shù)據(jù)直接集成到Xcode
中的項(xiàng)目的一部分。
您無(wú)法訪問(wèn)Organizer
中MetricKit
提供的所有內(nèi)容呜袁,但可以期望找到:
Crashes
Disk Writes
Energy Usage
Battery Usage
Hang Rate
Launch Time
Memory
Scrolling
Apple已在此處匯總了最常用的數(shù)據(jù)敌买,希望它們會(huì)繼續(xù)添加到此列表中。
1. Generating Graphs & Reports
上面描述的每個(gè)部分已經(jīng)呈現(xiàn)為各種圖表阶界。 通常虹钮,數(shù)據(jù)可視化為直方圖以及JSON
負(fù)載。 您將看到如何使用和顯示MetricKit
數(shù)據(jù)荐操,從而產(chǎn)生巨大的效果芜抒。
上方顯示了Scrolling
指標(biāo)的直方圖。 它代表用戶的滾動(dòng)連接時(shí)間托启,從本質(zhì)上講宅倒,這是用戶滾動(dòng)視圖所需的時(shí)間。 在此應(yīng)用程序中屯耸,您可以看到滾動(dòng)拖曳的大量減少拐迁,但隨后突然增加。 當(dāng)然疗绣,這是您要探索的東西线召,并弄清楚這些版本之間的變化。
這是來(lái)自App Store
中實(shí)時(shí)應(yīng)用的另一個(gè)示例多矮。 此特定圖顯示Battery Usage
情況缓淹,特別是用戶在應(yīng)用程序中處于活動(dòng)狀態(tài)時(shí)的電池使用情況。
細(xì)節(jié)水平真是太神奇了塔逃! 您可以在應(yīng)用程序的每個(gè)部分(網(wǎng)絡(luò)讯壶,顯示等)查看受影響最大的電池使用情況。 在此示例中湾盗,該應(yīng)用平均每天消耗用戶電池的8.29%
伏蚊。 目前尚不清楚基準(zhǔn)會(huì)是什么,但這使您能夠探索并確定在何處進(jìn)行改進(jìn)格粪。
MetricKit
是監(jiān)視iOS實(shí)時(shí)應(yīng)用程序的重要一步躏吊。 為了有效使用氛改,它確實(shí)需要考慮一些對(duì)您的用戶重要的事情。 例如比伏,如果您的應(yīng)用程序包含大量執(zhí)行滾動(dòng)的內(nèi)容(例如新聞閱讀應(yīng)用程序)胜卤,則您可能需要關(guān)注滾動(dòng)指標(biāo)。
確定了重要內(nèi)容后凳怨,就可以決定如何使用該數(shù)據(jù)以及如何顯示它們瑰艘。 例如是鬼,您可能有一個(gè)小的Vapor Swift API
肤舞,它可以使用數(shù)據(jù)并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中,而前端的小dashboard
會(huì)將其轉(zhuǎn)換為直方圖均蜜。 集成MetricKit
本身是最簡(jiǎn)單的部分李剖!
有關(guān)將Vapor
與MetricKit
結(jié)合使用的深入視頻課程,請(qǐng)查看Swift Vapor API for monitoring for iOS囤耳。
想了解更多篙顺? WWDC上有一個(gè)精彩視頻 —— What’s New in MetricKit。
后記
本篇主要講述了基于
MetricKit
的App中的電源監(jiān)控充择,性能和診斷德玫,感興趣的給個(gè)贊或者關(guān)注~~~