1. 配置功能開關
配置類預設都開啟,如果使用者需要關閉部分功能,請在初始化appkey之前配置好。
請注意:此處的配置開關優先順序低於產品後台「開關與採樣配置」中設定的開關,如果您在產品後台中進行開關/採樣率更改,將在下次啟動時下發並覆蓋此處配置的開關情況。
調整開關分為兩個配置類:
UMAPMConfig類包含崩潰和卡頓的配置;
UMEFSConfig類包含啟動分析、網路分析、記憶體分析、應用內H5頁面分析、OOM異常、原生頁面分析、日誌回撈。
1.1 UMAPMConfig類開關
UMAPMConfig類為UMAPM中各個模組提供配置開啟或關閉功能。
@interface UMAPMConfig : NSObject<NSCopying>
+(UMAPMConfig*)defaultConfig;
/**
* crash&卡頓監控開關,預設開啟
*/
@property (nonatomic,assign) BOOL crashAndBlockMonitorEnable;
/*
* 卡頓監控參數
* 發送檢測心跳的時間間隔。單位:秒。
* 區間範圍[1,4],超過就用預設值2
*/
@property (nonatomic, assign) float sendBeatInterval;
/*
* 卡頓監控參數
* 檢測卡頓的時間間隔 單位是秒。 (發送心跳後checkBeatInterval秒進行檢測)
* 區間範圍[1,4],超過就用預設值2
*/
@property (nonatomic, assign) float checkBeatInterval;
/*
* 卡頓監控參數
* 連續多少次沒心跳 認為觸發卡頓
* 區間範圍[1,4],超過就用預設值3,注意此參數必須為整數
*/
@property (nonatomic, assign) NSInteger toleranceBeatMissingCount;
@end配置模組 | 組態變數名 | 預設值 |
crash&卡頓模組 | crashAndBlockMonitorEnable | YES |
樣本
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UMAPMConfig* config = [UMAPMConfig defaultConfig];
config.crashAndBlockMonitorEnable = YES;
[UMCrashConfigure setAPMConfig:config];
[QTConfigure setCustomDomain:@"您的收數服務網域名稱" standbyDomain:@""];
[QTConfigure initWithAppkey:@"您的appkey" channel:@"App Store"];
}1.2 UMEFSConfig類
UMEFSConfig類為UMEFS中各個模組的提供配置開啟或關閉功能。
@interface UMEFSConfig : NSObject
+(UMEFSConfig*)defaultConfig;
/**
* 啟動模組監控開關,預設開啟
*/
@property (nonatomic,assign) BOOL launchMonitorEnable;
/**
* 記憶體模組監控開關,預設開啟
*/
@property (nonatomic,assign) BOOL memMonitorEnable;
/**
* 網路模組監控開關,預設開啟
*/
@property (nonatomic,assign) BOOL networkEnable;
/**
* H5打通模組開關,預設開啟
*/
@property (nonatomic,assign) BOOL javaScriptBridgeEnable;
/**
* OOM模組監控開關,預設開啟
*/
@property (nonatomic,assign) BOOL oomMonitorEnable;
/**
* 原生頁面模組監控開關,預設開啟
*/
@property (nonatomic,assign) BOOL pageMonitorEnable;
/**
* 日誌回撈模組開關,預設開啟
*/
@property (nonatomic,assign) BOOL logCollectEnable;
/**
* 日誌回撈模組userId
*/
@property (nonatomic,copy) NSString *logCollectUserId;
/**
* 初始化主動發送PV
*/
@property (nonatomic, assign) BOOL initSendPVEnable;
/**
* 用於前後端鏈路打通
*/
@property (nonatomic, strong) NSDictionary* rumConfig;
@end模組說明
配置模組 | 組態變數名 | 預設值 |
啟動模組開關 | launchMonitorEnable | YES |
網路模組開關 | networkEnable | YES |
記憶體模組開關 | memMonitorEnable | YES |
H5模組開關 | javaScriptBridgeEnable | YES |
OOM模組開關 | oomMonitorEnable | YES |
原生頁面模組開關 | pageMonitorEnable | YES |
日誌回撈模組開關 | logCollectEnable | YES |
日誌回撈模組userId | logCollectUserId | 空 |
初始化主動發送PV | initSendPVEnable | NO |
前後端鏈路打通 | rumConfig | 空 |
初始化樣本
#import <UMEFS/UMEFS.h>
#import <UMEFS/UMEFSConfig.h>
#import <UMEFS/UMEFSConfigure.h>
#import <QTCommon/QTCommon.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UMEFSConfig* configForEFS = [UMEFSConfig defaultConfig];
configForEFS.networkEnable = YES;
configForEFS.launchMonitorEnable = YES;
configForEFS.memMonitorEnable = YES;
configForEFS.javaScriptBridgeEnable = YES;
configForEFS.oomMonitorEnable = YES;
configForEFS.pageMonitorEnable = YES;
configForEFS.logCollectEnable = YES;
configForEFS.logCollectUserId = @"日誌回撈模組userId";
configForEFS.initSendPVEnable = YES;
configForEFS.rumConfig = @{
@"injectTraceHeader": @"traceparent",
@"needTracedUrls":@[@"/v1/trace", @"^/v1/trace$", ...],
@"ignoredUrls": @[@"/v1/trace", @"^/v1/trace$", ...],
};
[UMEFSConfigure setAPMConfig:configForEFS];
[QTConfigure setCustomDomain:@"您的收數服務網域名稱" standbyDomain:@""];
[QTConfigure initWithAppkey:@"您的appkey" channel:@"App Store"];
return YES;
}2. 功能模組配置
2.1 崩潰分析
如您完成common和apm外掛程式整合,完成初始化即可使用崩潰分析功能。
可選補充功能:崩潰回調(產品中可在錯誤詳情-自訂欄位tab中查看)
崩潰回調說明:當崩潰發生時,您可以通過此回調到您的商務邏輯,該介面返回string類型資料,該返回的資料會寫入到崩潰檔案中並上傳到伺服器展示。崩潰回調的限制為256個字元
回調介面:
//return字串不能大於256位元組,大於部分將被截取
+(void)setCrashCBBlock:(CallbackBlock_Nullable)cbBlock;介面樣本:
#import <UMAPM/UMCrashConfigure.h>
[UMCrashConfigure setCrashCBBlock:^NSString*_Nullable{
return@“崩潰時自訂字串”;
}];上傳後即可在錯誤詳情-自訂欄位中查看到回調資訊:
下圖做功能示範樣本:

測試時需要注意以下事項:
1、觸發崩潰時,app不能處於偵錯模式。
2、崩潰日誌是在下次啟動時上傳,且下次啟動也不能處於偵錯模式。
以上兩個操作步驟,都禁止debug模式。否則會影響到崩潰的監測和識別。
Release模式下如果測試裝置用資料線串連Xcode也會影響資料上報。
2.2 自訂異常
設定使用者的自訂異常上傳功能
介面函數:
/**
* 上報自訂錯誤
* @name 名稱 長度限制256位元組以內,超過截斷。
* @reason 錯誤原因 長度限制256位元組以內,超過截斷。
* @stackTrace 堆棧 長度限制100*1024位元組以內,超過截斷。
*
* @example:
* // 日誌類型唯一標識
NSString* name = @"myUnity";
NSString* reason = @"csharp exception";
NSArray* stackTrace = [NSArray arrayWithObjects:
@"msg: Exception: Exception, Attempted to divide by zero.",
@"UnityDemo+ExceptionProbe.NormalException () (at <unknown>:0)",
@"UnityDemo.TrigException (System.Int32 selGridInt) (at <unknown>:0)",
@"UnityDemo.OnGUI () (at <unknown>:0)",
nil];
*
*[UMCrashConfigure reportExceptionWithName:name reason:reason stackTrace:stackTrace];
*
*
*/
+(void)reportExceptionWithName:(NSString* _Nonnull)name reason:(NSString* _Nonnull)reason stackTrace:(NSArray* _Nonnull)stackTrace;樣本:
#import <UMAPM/UMCrashConfigure.h>
NSString* name = @"myUnity";
NSString* reason = @"csharp exception";
NSArray* stackTrace = [NSArray arrayWithObjects:
@"msg: Exception: Exception, Attempted to divide by zero.",
@"UnityDemo+ExceptionProbe.NormalException () (at <unknown>:0)",
@"UnityDemo.TrigException (System.Int32 selGridInt) (at <unknown>:0)",
@"UnityDemo.OnGUI () (at <unknown>:0)",
nil];
[UMCrashConfigure reportExceptionWithName:name reason:reason stackTrace:stackTrace];功能示範樣本:
2.3 卡頓分析
卡頓分析需要整合基礎組件庫UMAPM.framework和UMEFS.framework方能開啟。
通過配置項crashAndBlockMonitorEnable選項設定為YES即可開啟卡頓模組
樣本:
#import <UMAPM/UMAPMConfig.h>
#import <UMAPM/UMCrashConfigure.h>
#import <QTCommon/QTCommon.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UMAPMConfig* config = [UMAPMConfig defaultConfig];
config.crashAndBlockMonitorEnable = YES;
[UMCrashConfigure setAPMConfig:config];
[QTConfigure setCustomDomain:@"您的收數服務網域名稱" standbyDomain:@""];
[QTConfigure initWithAppkey:@"您的appkey" channel:@"App Store"];
}2.4 啟動分析
2.4.1啟動階段定義說明
啟動分為冷啟動和暖開機:
冷啟動
預設監控四個預定義啟動階段:
Pre-初始化耗時:從進程開始函數exec開始到指定+load執行的階段。
初始化耗時:從指定的+load執行到finishLaunching的階段。
應用構建耗時:從finishLaunching到FirstVC.viewDidLoad()的階段。(viewDidLoad裡面還需要構建childview)
首頁面載入耗時:從FirstVC.viewDidLoad()到FirstVC.viewDidAppear()結束,首次渲染完成。
暖開機
從applicationWillEnterForeground()開始到applicationDidBecomeActive()結束。
2.4.2 啟動監控的方式
啟動監控分自動監控和手動監控兩種模式。
兩種模式可以交叉使用,以使用者手動埋點方式為準。
2.4.2.1 自動模式
使用者只需要初始化appkey即可。
使用者也可以設定可選的操作來設定首ViewController來明確首頁面,保證正確的監控冷啟動首頁面的載入耗時。
相關的API如下:
+(void)setRootVCCls:(Class)cls;//在DidFinishLaunching第一句代碼提前設定RootViewController樣本:
#import <UMAPM/UMLaunch.h>
[UMLaunch setRootVCCls:[ViewController class]];注意:
如果沒有設定,我們會尋找[UIApplication sharedApplication]的delegate的window的rootViewController為監控生命週期。
2.4.2.2 手動模式
目前手動模式只支援冷啟動/初次開機階段的埋點
相關的API如下:
/*
* 手動設定三個預定義時間結束時間(初始化耗時結束,應用構建耗時結束,頁面載入耗時結束)*/
+(void)setPredefineLaunchType:(UMPredefineLaunchType)predefineLaunchType;目前給出的冷啟動的三個預定義階段的埋點分別為:
1、初始化耗時結束時間點(UMPredefineLaunchType_DidFinishLaunchingEnd)。
2、應用構建耗時結束時間點(UMPredefineLaunchType_ViewDidLoadEnd)。
3、首頁面載入完成的結束時間點(UMPredefineLaunchType_ViewDidAppearEnd)。
分別對應的枚舉變數為:
//冷啟動的預定義類型
typedef NS_ENUM(NSInteger,UMPredefineLaunchType){
UMPredefineLaunchType_DidFinishLaunchingEnd,//在didFinishLaunchingWithOptions的最後一句設定
UMPredefineLaunchType_ViewDidLoadEnd,//在第一個ViewController的viewDidLoad函數的最後調用
UMPredefineLaunchType_ViewDidAppearEnd//在第一個ViewController的viewDidAppear函數的最後調用
};初始化耗時結束時間點樣本
使用者需要在系統回呼函數的didFinishLaunchingWithOptions的函數最後埋點,以保證準確性
#import <UMAPM/UMLaunch.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[QTConfigure initWithAppkey:@"您的AppKey" channel:@"App Store"];
//在didFinishLaunchingWithOptions的最後埋點,以保證準確性
[UMLaunch setPredefineLaunchType:UMPredefineLaunchType_DidFinishLaunchingEnd];
return YES;
}
首頁面載入耗時結束時間點樣本
使用者需要在第一個ViewController的viewDidAppear的函數最後埋點,以保證準確性。
#import <UMAPM/UMLaunch.h>
- (void)viewDidAppear {
[super viewDidAppear];
//在viewDidAppear的最後埋點
[UMLaunch setPredefineLaunchType:UMPredefineLaunchType_ViewDidAppearEnd];
}使用者自訂階段埋點
使用者自訂階段埋點只能在冷啟動階段埋點,使用者統計某個函數或者代碼塊的執行時間,方便客戶細化啟動階段。
請注意:
1、beginLaunch和endLaunch必須配對使用
2、beginLaunch和endLaunch的調用時機必須在冷啟動介面viewDidAppear之前調用,後續的調用無效
3、beginLaunch和endLaunch的參數長度不能大於10個字元
4、beginLaunch和endLaunch的數量不能超過10對,如果超過10對的話,後添加的會直接拋棄
相關的API如下:
/*
* 使用者在冷或者暖開機階段設定自己的自訂階段
* @note beginLaunch和endLaunch必須要配對調用
* 如果調用時間段,不在頁面載入耗時結束前調用,是不會上報的
*/
+ (void)beginLaunch:(NSString *)methodName;
+ (void)endLaunch:(NSString *)methodName;樣本:
#import <QTCommon/QTCommon.h>
#import <UMAPM/UMLaunch.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[UMLaunch beginLaunch:@"initCommon"];
[QTConfigure initWithAppkey:@"您的AppKey" channel:@"App Store"];
[UMLaunch endLaunch:@"initCommon"];
[UMLaunch setPredefineLaunchType:UMPredefineLaunchType_DidFinishLaunchingEnd];
return YES;
}2.5 網路分析
2.5.1 網路分析適用範圍
目前網路模組支援iOS系統的URL Loading System,支援iOS8及以上作業系統。
目前支援NSURLSession大部分通用API網路捕獲(http或https)。
目前並不支援iOS低版本的NSURLConnection相關API。目前不支援Socket捕獲。
目前支援AFNetworking的所有版本。
注意:整合NSURLProtocol的三方SDK的時候,會出現有系統版本不相容引起的崩潰,解決方案可以參考2.5.3節。
2.5.2 網路分析捕獲內容說明
網路模組目前捕獲了網路各個階段的開始結束時間,上行和下行流量及對應的URL
注意:
如果要開啟網路,需要app發起網路前開啟網路設定項,方能捕獲到全量資料,否則網路捕獲功能可能會缺失資料或者失效。
和其他三方網路程式庫一起的時候,可能會產生衝突,導致網路模組失效。
1.請查看enableNetworkForProtocol函數的說明,根據需求調用。
樣本:
#import <UMEFS/UMEFS.h>
#import <UMEFS/UMEFSConfig.h>
#import <UMEFS/UMEFSConfigure.h>
#import <QTCommon/QTCommon.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"UMEFS version:%@",[UMEFSConfigure getVersion]);
UMEFSConfig* configForEFS = [UMEFSConfig defaultConfig];
configForEFS.networkEnable = YES;
configForEFS.launchMonitorEnable = YES;
configForEFS.memMonitorEnable = YES;
configForEFS.javaScriptBridgeEnable = YES;
configForEFS.oomMonitorEnable = YES;
[UMEFSConfigure setAPMConfig:configForEFS];
[QTConfigure setCustomDomain:@"您的收數服務網域名稱" standbyDomain:@""];
[QTConfigure initWithAppkey:@"您的AppKey" channel:@"App Store"];
return YES;
}2.日誌檢查是否生效
一旦網路模組生效後,會在xcode中列印如下日誌就代表成功:UMAPM_NetworkSampling列印出YES後,就表示網路模組開啟並採樣生效。
2021-09-13 14:24:24.962273+0800 QTAPMDemo[386:36277] UMAPM_NetworkEnable(1:1):1 2021-09-13 14:24:24.977290+0800 QTAPMDemo[386:36277] UMAPM_NetworkSampling(1,1):YES
一旦看到開啟成功的日誌,就可以發送一條網路請求來測試後端能否收到,網路範例程式碼如下: 發送成功後,即可在後端介面上看到對應的URL的網路請求:
//因Get請求有緩衝,響應的內容會直接在本地擷取直接返回
#define NetworkURL @"https://www.aliyun.com/"
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:NetworkURL]];
request.HTTPMethod = @"GET";
[request addValue:@"application/html" forHTTPHeaderField:@"Content-Type"];
NSURLSessionDataTask* dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (data) {
NSString* str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"str:%@",str);
} else if (error) {
NSLog(@"error:%@",error);
}
}];
[dataTask resume];2.5.3 整合NSURLProtocol和效能監控網路分析模組注意事項
增加網路分析模組在iOS13及以下系統的單獨開關,以避免在同時整合NSURLProtocol和APM SDK的網路模組的本身衝突引起崩潰,特增加enableNetworkForProtocol函數。
發生問題的現象請見:https://developer.umeng.com/docs/193624/detail/352123
配置的函數說明如下:
/**
* @brief 設定APM的網路模組針對iOS13及以下系統的單獨開關,以避免在同時整合NSURLProtocol和APM SDK的網路模組的本身衝突引起崩潰。
* 如果需要調用,在初始化APM SDK 的網路模組前調用。
*
* @param enable 指定開關。YES:捕獲iOS13及以下特定網路請求,預設開啟。NO:不捕獲iOS13及以下特定網路請求。
*
* @note 問題原因:同時整合NSURLProtocol和APM SDK的網路模組的情境,先初始化APM SDK的網路模組,再初始化NSURLProtocol的registerClass,會導致崩潰在iOS13及以下版本會崩潰,目前可以確定為iOS系統API引起的問題,iOS14無此問題。(先初始化NSURLProtocol的registerClass,再初始化APM SDK的網路模組,是不會出現問題的)
* 相容iOS13及以下的初始化代碼如下:
* @example:
* //確保NSURLProtocol的初始化在APM SDK的上面
* [NSURLProtocol registerClass:[UMURLProtocol class]];
* UMAPMConfig* config = [UMAPMConfig defaultConfig];
* config.networkEnable = YES;
* [UMCrashConfigure setAPMConfig:config];
* [QTConfigure initWithAppkey:@"您的AppKey" channel:@"App Store"];
*
* @note
* 此開關預設開啟,在同時整合NSURLProtocol和APM SDK的網路模組的情境時候,根據需要調用,如果按照上述初始化順序,不需要調用。
*
* @note 此函數關閉生效後,不會完全關閉網路模組,只是針對特定網路請求不再捕獲,如果開發人員能知道同時整合NSURLProtocol和APM的網路模組的情境的時候,建議通過調整初始化順利來相容所有情境,並在iOS13及以下版本測試相容性。
* @note:其他情境下,不需要調用此函數。
*/
+(void)enableNetworkForProtocol:(BOOL)enable;樣本:
#import <UMEFS/UMEFSConfigure.h>
[UMEFSConfigure enableNetworkForProtocol:YES];2.6 記憶體分析
SDK 初始化前,將UMEFSConfig執行個體的memMonitorEnable屬性設定為YES (註:預設開啟)
#import <UMEFS/UMEFS.h>
#import <UMEFS/UMEFSConfig.h>
#import <UMEFS/UMEFSConfigure.h>
#import <QTCommon/QTCommon.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UMEFSConfig* configForEFS = [UMEFSConfig defaultConfig];
configForEFS.networkEnable = YES;
configForEFS.launchMonitorEnable = YES;
configForEFS.memMonitorEnable = YES;
configForEFS.javaScriptBridgeEnable = YES;
configForEFS.oomMonitorEnable = YES;
configForEFS.pageMonitorEnable = YES;
[UMEFSConfigure setAPMConfig:configForEFS];
[QTConfigure setCustomDomain:@"您的收數服務網域名稱" standbyDomain:@""];
[QTConfigure initWithAppkey:@"您的AppKey" channel:@"App Store"];
return YES;
}2.7 OOM異常
通過配置項oomMonitorEnable選項設定為YES即可開啟OOM模組。
測試時需要注意以下事項:
1、觸發OOM時,app不能處於偵錯模式,與crash類似。
2、OOM是在下次啟動時上傳,且下次啟動也不能處於偵錯模式。
以上兩個操作步驟,都禁止debug模式。否則會影響到oom的監測和識別。
OOM模組需要整合基礎組件庫UMAPM.framework和UMEFS.framework方能開啟。
Release模式下如果測試裝置用資料線串連Xcode也會影響資料上報。
樣本如下:
#import <UMEFS/UMEFS.h>
#import <UMEFS/UMEFSConfig.h>
#import <UMEFS/UMEFSConfigure.h>
#import <QTCommon/QTCommon.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UMEFSConfig* configForEFS = [UMEFSConfig defaultConfig];
configForEFS.networkEnable = YES;
configForEFS.launchMonitorEnable = YES;
configForEFS.memMonitorEnable = YES;
configForEFS.javaScriptBridgeEnable = YES;
configForEFS.oomMonitorEnable = YES;
configForEFS.pageMonitorEnable = YES;
[UMEFSConfigure setAPMConfig:configForEFS];
[QTConfigure setCustomDomain:@"您的收數服務網域名稱" standbyDomain:@""];
[QTConfigure initWithAppkey:@"您的appkey" channel:@"App Store"];
return YES;
}2.8 H5 頁面分析
SDK 初始化前,將UMEFSConfig執行個體的javaScriptBridgeEnable屬性設定為YES (註:預設開啟)
#import <UMEFS/UMEFS.h>
#import <UMEFS/UMEFSConfig.h>
#import <UMEFS/UMEFSConfigure.h>
#import <QTCommon/QTCommon.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UMEFSConfig* configForEFS = [UMEFSConfig defaultConfig];
configForEFS.javaScriptBridgeEnable = YES;
[UMEFSConfigure setAPMConfig:configForEFS];
[QTConfigure initWithAppkey:@"您的AppKey" channel:@"App Store"];
return YES;
}嵌入到App中的H5頁面整合APM SDK後需要設定App應用程式套件名白名單,橋接情境下H5不需要設定收數網域名稱。
樣本:
import { init } from '@umengfe/apm';
init({
pageFilter: {
mode: 'ignore',
rules: []
},
pid:'您的AppKey',
pkgList:['您的App應用程式套件名']
});2.9 原生頁面
模組開關
SDK 初始化前,將UMEFSConfig執行個體的pageMonitorEnable屬性設定為YES (註:預設開啟)
#import <UMEFS/UMEFS.h>
#import <UMEFS/UMEFSConfig.h>
#import <UMEFS/UMEFSConfigure.h>
#import <QTCommon/QTCommon.h>
UMEFSConfig* configForEFS = [UMEFSConfig defaultConfig];
configForEFS.pageMonitorEnable = YES;
[UMEFSConfigure setAPMConfig:configForEFS];
//初始化 QTConfigure
[QTConfigure initWithAppkey:@"您的AppKey" channel:@"App Store"];使用者自訂埋點
用於統計某個函數或者代碼塊的執行時間,方便客戶細化啟動階段。
注意:
1、trackBegin和trackEnd必須配對使用
2、trackBegin和trackEnd的調用時機必須在介面viewDidAppear結束之前調用,後續的調用無效
3、trackBegin和trackEnd的參數長度不能大於10個字元。
4、trackBegin和trackEnd的個數不能大於6個(以methodName為依據)。
@interface UMPage : NSObject
+ (void)trackBegin:(NSString *)methodName viewController:(UIViewController *)vc;
+ (void)trackEnd:(NSString *)methodName viewController:(UIViewController *)vc;
@end2.10 日誌回撈
2.10.1 模組開關
SDK 初始化前,將UMEFSConfig執行個體的logCollectEnable屬性設定為YES (註:預設開啟)
若需要自訂使用者ID(識別ID),可以設定logCollectUserId:
logCollectUserId單次冷啟動生命週期內有效,不能變更
logCollectUserId長度不能超過128位元組
2.10.2 日誌打點介面
日誌打點介面一共提供了5個不同類型的日誌等級,代表日誌嚴重程度的五個等級,可以在平台查看日誌時進行篩選。
@interface UAPMLog : NSObject
+ (void)verbose:(NSString *)tag format:(NSString *)format, ... NS_FORMAT_FUNCTION(2,3);
+ (void)debug:(NSString *)tag format:(NSString *)format, ... NS_FORMAT_FUNCTION(2,3);
+ (void)info:(NSString *)tag format:(NSString *)format, ... NS_FORMAT_FUNCTION(2,3);
+ (void)warn:(NSString *)tag format:(NSString *)format, ... NS_FORMAT_FUNCTION(2,3);
+ (void)error:(NSString *)tag format:(NSString *)format, ... NS_FORMAT_FUNCTION(2,3);
@end引入標頭檔:
#import <UMEFS/UAPMLog.h>參數限制:
Tag限制:64位元組
msg限制:1024 位元組
樣本:
[UAPMLog verbose:@"verbose_test" format:@"測試verbose類型日誌"];
[UAPMLog debug:@"debug_test" format:@"測試debug類型日誌"];
[UAPMLog info:@"info_test" format:@"測試info類型日誌"];
[UAPMLog warn:@"warn_test" format:@"測試warn類型日誌"];
[UAPMLog error:@"error_test" format:@"測試error類型日誌"];2.11 前後端鏈路打通
此功能非必須設定,使用該功能需要接入EFS SDK 2.3.0及以上版本
開啟該功能用於對iOS應用端側發起的HTTP請求注入定製Header用於滿足前後端鏈路打通情境需要。
調用樣本
#import <UMEFS/UMEFS.h>
#import <UMEFS/UMEFSConfig.h>
#import <UMEFS/UMEFSConfigure.h>
#import <QTCommon/QTCommon.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UMEFSConfig* configForEFS = [UMEFSConfig defaultConfig];
...
configForEFS.rumConfig = @{
@"injectTraceHeader": @"traceparent",
@"needTracedUrls":@[@"/v1/trace", @"^/v1/trace$", ...],
@"ignoredUrls": @[@"/v1/trace", @"^/v1/trace$", ...],
};
[UMEFSConfigure setAPMConfig:configForEFS];
[QTConfigure setCustomDomain:@"您的收數服務網域名稱" standbyDomain:@""];
[QTConfigure initWithAppkey:@"您的appkey" channel:@"App Store"];
return YES;
}詳細說明
屬性 | 含義 | 預設 | 類型 |
injectTraceHeader | SDK會對iOS應用網路請求注入設定的要求標頭,並且自動產生相關協議欄位 | 空 | 枚舉值
|
needTracedUrls | 全鏈路監控注入Urls白名單,預設值為空白 | nil,該預設值表示白名單為空白,如果設定此值,則僅符合規則的請求url會被注入要求標頭 | 數群組類型,元素支援
|
ignoredUrls | 全鏈路監控注入Urls黑名單,預設值為null | null,該預設值表示黑名單為空白,如果設定此值,則僅符合規則的請求url不會被注入要求標頭 | 數群組類型,元素支援
|
injectSDKRequest | 是否對SDK內部請求注入要求標頭,預設為NO,即不注入 | NO,該預設值表示SDK的內部請求url不會被注入要求標頭 | 布爾類型 |
3. 符號表配置
3.1 什麼是符號表
符號表是記憶體位址與函數名、檔案名稱、行號的映射表。符號表元素如下所示:<起始地址> <結束位址> <函數> [<檔案名稱:行號>]為了能快速並準確地定位使用者APP發生Crash的代碼位置,我們使用符號表對APP發生Crash的程式堆棧進行解析和還原。
3.2 為什麼要上傳符號表?
為了能快速並準確地定位使用者APP發生Crash的代碼位置,使用符號表對APP發生Crash的程式堆棧進行解析和還原。
舉一個例子

效能監控提供了手動上傳符號表
3.3 iOS符號表配置方式
什麼是dsym檔案?
iOS 平台中,dSYM 檔案是指具有調試資訊的目標檔案,儲存著檔案名稱、方法名、行號等資訊,是和可執行檔的16進位函數地址一一對應的,通過分析崩潰的崩潰檔案可以準確知道具體的崩潰資訊。檔案名稱通常為:xxx.app.dSYM,其中 xxx 通常表示應用程式的二進位包名,如下圖所示:
通常我們可以在 Xcode 打包出來的檔案xcarchive裡面看到 dSYM 檔案以及目錄架構:


如何定位dsym檔案?
工程中擷取
一般情況下,專案編譯完dSYM檔案跟app檔案在同一個目錄下,下面以XCode作為IDE詳細說明定位dSYM檔案。
-> 進入XCode;
-> 開啟工程(已編譯過);
-> 在左欄找到“Product”項;
-> 滑鼠右鍵點擊編譯產生的“xxx.app”;
-> 點擊“Show in Finder”;
如下圖所示:

如果有多個dSYM檔案,可以在使用工具時指定輸入為dSYM檔案所在的目錄或者工程目錄。
3.4 其他符號表相關問題
1.XCode編譯後沒有產生dSYM檔案?
XCode Release編譯預設會產生dSYM檔案,而Debug編譯預設不會產生,對應的Xcode配置如下:
XCode -> Build Settings -> Code Generation -> Generate Debug Symbols -> Yes
XCode -> Build Settings -> Build Option -> Debug Information Format -> DWARF with dSYM File


2.開啟Bitcode之後需要注意哪些問題?
在點“Upload to App Store”上傳到App Store伺服器的時候需要聲明符號檔案(dSYM檔案)的產生:

在配置符號表檔案之前,需要從App Store中把該版本對應的dSYM檔案下載回本地,如下圖。
注意:
不要使用本地產生的dSYM檔案來產生符號表檔案。由於本地編譯產生的dSYM檔案的符號表資訊都被隱藏了,如果用本地編譯產生的dSYM檔案產生符號表檔案並配置到U-APM平台之後,還原出來的結果將是類似於“__hiden#XXX”這樣的符號。

3.如何判斷dSYM檔案是否與堆棧的UUID匹配?
還原Crash堆棧時,需要根據UUID來匹配符號表檔案,因此只有上傳的符號表檔案的UUID與Crash對應APP的UUID一致時,才能準確地對堆棧進行還原。
需要確定在 APM 符號表管理所選版本的uuid與crash崩潰堆棧中Binary Images的 uuid一致(符號表管理中uuid末尾的0 可忽略)


4.如何查看dSYM檔案的UUID?
通過命令查看UUID
xcrun dwarfdump --uuid <dSYM檔案>
通過符號表檔案查看UUID
符號表檔案的UUID與dSYM檔案的UUID是一致的,因此可以通過符號表工具產生的符號表檔案來查看dSYM檔案的UUID:
產生符號表檔案(.zip) ---> 解壓符號表檔案(.symbol) ---> 使用文字編輯器開啟符號表檔案

其中符號表檔案的“UUID”資訊即Debug SO檔案的UUID,亦是符號表檔案的UUID,如果檔案較大,建議使用“Sublime Text”等文字編輯器來開啟符號表檔案。
5.如何找回發行到App Store的App對應的dSYM檔案?
通過Xcode找回
1、開啟 Xcode 頂部功能表列 -> Window -> Organizer 視窗:

2、找到發布的歸檔包,右鍵點擊對應歸檔包,選擇Show in Finder操作:

3、右鍵選擇定位到的歸檔檔案,選擇顯示包內容操作:

4、選擇dSYMs目錄,目錄內即為下載到的 dSYM 檔案:

通過iTunes Connect找回
1、登入iTunes Connect;
2、進入“TestFlight”的“構建版本”頁面:

3、擇對應版本,點“下載dSYM”下載dSYM檔案:

通過mdfind工具找回
在U-APM 錯誤詳情頁面查詢到crash對應的UUID:
然後在Mac的Shell中,用mdfind命令定位dSYM檔案:
mdfind"com_apple_xcode_dsym_uuids == <UUID>"
注意:使用mdfind時,UUID需要格式轉換(增加“-”): 12345678-1234-1234-1234-xxxxxxxxxxxx
例如,要定位的dSYM的UUID為:E30FC309DF7B3C9F8AC57F0F6047D65F 則定位dSYM檔案的命令如下:
mdfind"com_apple_xcode_dsym_uuids == E30FC309-DF7B-3C9F-8AC5-7F0F6047D65F"|12345678-1234-1234-1234-xxxxxxxxxxxx|
建議每次構建或者發布APP版本的時候,備份App對應的dSYM檔案!

當前支援上傳方式:後台手動上傳(最大支援400M)
3.5 符號表在產品中的使用
版本選擇
當前支援現有版本列表和手動輸入兩種方式:
如果是已經有錯誤上報到U-APM背景版本,可以直接在上傳符號表時的版本下拉框中選擇
如果是即將發布的新版本,支援手動輸入版本號碼,請輸入與新版本完全一致的內容,並點擊‘添加版本號碼‘即可手動添加

按照文檔說明將符號表檔案壓縮到一起
登入平台,找到需要上傳的符號表應用,點擊頂部的 設定 進入應用設定介面
點擊符號表管理 ,點擊 上傳 ,將第一步壓縮好的符號表檔案上傳即可