全部產品
Search
文件中心

Quick Tracking:SDK 功能介紹

更新時間:Sep 26, 2025

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@“崩潰時自訂字串”;
}];

上傳後即可在錯誤詳情-自訂欄位中查看到回調資訊:

下圖做功能示範樣本:

image

測試時需要注意以下事項:

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];

功能示範樣本:image

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;

@end

2.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應用網路請求注入設定的要求標頭,並且自動產生相關協議欄位

枚舉值

  • traceparent

  • b3

  • sw8

  • sentry-trace

needTracedUrls

全鏈路監控注入Urls白名單,預設值為空白

nil,該預設值表示白名單為空白,如果設定此值,則僅符合規則的請求url會被注入要求標頭

數群組類型,元素支援

  • 字串

  • 字串Regex

ignoredUrls

全鏈路監控注入Urls黑名單,預設值為null

null,該預設值表示黑名單為空白,如果設定此值,則僅符合規則的請求url不會被注入要求標頭

數群組類型,元素支援

  • 字串

  • 字串Regex

injectSDKRequest

是否對SDK內部請求注入要求標頭,預設為NO,即不注入

NO,該預設值表示SDK的內部請求url不會被注入要求標頭

布爾類型

3. 符號表配置

3.1 什麼是符號表

符號表是記憶體位址與函數名、檔案名稱、行號的映射表。符號表元素如下所示:<起始地址> <結束位址> <函數> [<檔案名稱:行號>]為了能快速並準確地定位使用者APP發生Crash的代碼位置,我們使用符號表對APP發生Crash的程式堆棧進行解析還原

3.2 為什麼要上傳符號表?

為了能快速並準確地定位使用者APP發生Crash的代碼位置,使用符號表對APP發生Crash的程式堆棧進行解析還原

舉一個例子

image

效能監控提供了手動上傳符號表

3.3 iOS符號表配置方式

什麼是dsym檔案?

iOS 平台中,dSYM 檔案是指具有調試資訊的目標檔案儲存著檔案名稱、方法名、行號等資訊,是和可執行檔的16進位函數地址一一對應的,通過分析崩潰的崩潰檔案可以準確知道具體的崩潰資訊。檔案名稱通常為:xxx.app.dSYM,其中 xxx 通常表示應用程式的二進位包名,如下圖所示:

通常我們可以在 Xcode 打包出來的檔案xcarchive裡面看到 dSYM 檔案以及目錄架構:

imageimage

如何定位dsym檔案?

工程中擷取

一般情況下,專案編譯完dSYM檔案跟app檔案在同一個目錄下,下面以XCode作為IDE詳細說明定位dSYM檔案。

-> 進入XCode;

-> 開啟工程(已編譯過);

-> 在左欄找到“Product”項;

-> 滑鼠右鍵點擊編譯產生的“xxx.app”;

-> 點擊“Show in Finder”;

如下圖所示:

image

如果有多個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

imageimage

2.開啟Bitcode之後需要注意哪些問題?

  • 在點“Upload to App Store”上傳到App Store伺服器的時候需要聲明符號檔案(dSYM檔案)的產生:

image

  • 在配置符號表檔案之前,需要從App Store中把該版本對應的dSYM檔案下載回本地,如下圖。

注意:

不要使用本地產生的dSYM檔案來產生符號表檔案。由於本地編譯產生的dSYM檔案的符號表資訊都被隱藏了,如果用本地編譯產生的dSYM檔案產生符號表檔案並配置到U-APM平台之後,還原出來的結果將是類似於“__hiden#XXX”這樣的符號。

image

3.如何判斷dSYM檔案是否與堆棧的UUID匹配?

還原Crash堆棧時,需要根據UUID來匹配符號表檔案,因此只有上傳的符號表檔案的UUID與Crash對應APP的UUID一致時,才能準確地對堆棧進行還原。

需要確定在 APM 符號表管理所選版本的uuid與crash崩潰堆棧中Binary Images的 uuid一致(符號表管理中uuid末尾的0 可忽略)

imageimage

4.如何查看dSYM檔案的UUID?

通過命令查看UUID

xcrun dwarfdump --uuid <dSYM檔案>

通過符號表檔案查看UUID

符號表檔案的UUID與dSYM檔案的UUID是一致的,因此可以通過符號表工具產生的符號表檔案來查看dSYM檔案的UUID:

產生符號表檔案(.zip) ---> 解壓符號表檔案(.symbol) ---> 使用文字編輯器開啟符號表檔案

image

其中符號表檔案的“UUID”資訊即Debug SO檔案的UUID,亦是符號表檔案的UUID,如果檔案較大,建議使用“Sublime Text”等文字編輯器來開啟符號表檔案。

5.如何找回發行到App Store的App對應的dSYM檔案?

通過Xcode找回

1、開啟 Xcode 頂部功能表列 -> Window -> Organizer 視窗:

image

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

image

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

image

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

image

通過iTunes Connect找回

1、登入iTunes Connect

2、進入“TestFlight”的“構建版本”頁面:

image

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

image

通過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檔案!

image

當前支援上傳方式:後台手動上傳(最大支援400M)

3.5 符號表在產品中的使用

版本選擇

當前支援現有版本列表和手動輸入兩種方式:

  1. 如果是已經有錯誤上報到U-APM背景版本,可以直接在上傳符號表時的版本下拉框中選擇

  2. 如果是即將發布的新版本,支援手動輸入版本號碼,請輸入與新版本完全一致的內容,並點擊‘添加版本號碼‘即可手動添加

image

  1. 按照文檔說明將符號表檔案壓縮到一起

  2. 登入平台,找到需要上傳的符號表應用,點擊頂部的 設定 進入應用設定介面

  3. 點擊符號表管理 ,點擊 上傳 ,將第一步壓縮好的符號表檔案上傳即可