1. 機能スイッチの構成
すべての構成クラスはデフォルトで有効になっています。一部の機能を無効にしたい場合は、appkey を初期化する前に構成してください。
ここでの構成スイッチは、製品バックグラウンドの「スイッチとサンプリング構成」の設定におけるスイッチよりも優先度が低いことに注意してください。製品バックグラウンドでスイッチ/サンプルレートを変更した場合、次回の起動時にその設定が適用され、このスイッチの構成が上書きされます。
調整スイッチは 2 つの構成クラスに分かれています:
UMAPMConfig クラスには、クラッシュとフリーズの構成が含まれています。
UMEFSConfig クラスは、起動分析、ネットワーク分析、メモリ分析、H5 ページ分析、OOM 例外、ネイティブページ分析、およびログ復旧をサポートします。
1.1 UMAPMConfig クラスのスイッチ
UMAPMConfig クラスは、UMAPM の各モジュールの構成を有効または無効にします。
@interface UMAPMConfig : NSObject<NSCopying>
+(UMAPMConfig*)defaultConfig;
/**
* クラッシュ & フリーズ監視スイッチはデフォルトでオンになっています。
*/
@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構成モジュール | 構成変数名 | デフォルト値 |
クラッシュ & フリーズモジュール | crashAndBlockMonitorEnable | YES |
例
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UMAPMConfig* config = [UMAPMConfig defaultConfig];
config.crashAndBlockMonitorEnable = YES;
[UMCrashConfigure setAPMConfig:config];
[QTConfigure setCustomDomain:@"Your collection service domain name" standbyDomain:@""];
[QTConfigure initWithAppkey:@"Your 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;
/**
* ログ復旧モジュールの ID。
*/
@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 | Empty |
アクティブな送信 PV の初期化 | initSendPVEnable | NO |
フロントエンドとバックエンドのリンクを開く | rumConfig | Empty |
初期化の例
#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 = @"ログ復旧モジュールの ID。";
configForEFS.initSendPVEnable = YES;
configForEFS.rumConfig = @{
@"injectTraceHeader": @"traceparent",
@"needTracedUrls":@[@"/v1/trace", @"^/v1/trace$", ...],
@"ignoredUrls": @[@"/v1/trace", @"^/v1/trace$", ...],
};
[UMEFSConfigure setAPMConfig:configForEFS];
[QTConfigure setCustomDomain:@"Your collection service domain name" standbyDomain:@""];
[QTConfigure initWithAppkey:@"Your appkey" channel:@"App Store"];
return YES;
}2. 機能モジュールの構成
2.1 クラッシュ分析
共通プラグインと apm プラグインを統合すると、クラッシュ分析機能を使用できます。
オプションの補足機能: クラッシュコールバック。クラッシュコールバックは、[エラー詳細] - [カスタムフィールド] タブで表示できます。
クラッシュコールバックの説明: クラッシュが発生したときに、このコールバックをビジネスロジックに呼び出すことができます。このインターフェイスは文字列データを返し、クラッシュファイルに書き込まれ、表示のためにサーバーにアップロードされます。クラッシュコールバックは 256 文字に制限されています
コールバックインターフェイス:
// 戻り値の文字列は 256 バイトを超えることはできません。超えた部分は切り捨てられます。
+(void)setCrashCBBlock:(CallbackBlock_Nullable)cbBlock;例:
#import <UMAPM/UMCrashConfigure.h>
[UMCrashConfigure setCrashCBBlock:^NSString*_Nullable{
return @ "クラッシュ時のカスタム文字列";
}];アップロードが完了すると、[エラー詳細] - [カスタムフィールド] でコールバック情報を表示できます。
次の図は、この機能の例を示しています:

テスト中は、次の項目に注意してください:
1. クラッシュがトリガーされたとき、アプリはデバッグモードであってはなりません。
2. クラッシュログは次回の起動時にアップロードされ、次回の起動時にデバッグモードであってはなりません。
上記の両方のステップでデバッグモードを無効にします。そうしないと、クラッシュの監視と識別に影響します。
リリースモードでは、テストデバイスがデータケーブルで Xcode に接続されている場合、データレポートも影響を受けます。
2.2 カスタム例外
カスタム例外のアップロード
インターフェイス関数:
/**
* カスタムエラーをレポートします
* @name 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 Catton 分析
フリーズ分析を有効にするには、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:@"Your collection service domain name" standbyDomain:@""];
[QTConfigure initWithAppkey:@"Your appkey" channel:@"App Store"];
}2.4 起動分析
2.4.1 起動フェーズの定義
起動はコールドスタートとホットスタートに分かれます:
コールドスタート
デフォルトでは、次の 4 つの事前定義された起動フェーズが監視されます:
初期化前期間: プロセスが開始され、関数 exec が開始されてから、指定された + load 実行までの期間。
初期化期間: 指定された + load から finishLaunching フェーズまで。
アプリケーション構築期間: finishLaunching から FirstVC.viewDidLoad() まで。(childview も viewDidLoad で構築する必要があります)
最初のページの読み込み期間: 最初のページは FirstVC.viewDidLoad() から FirstVC.viewDidAppear() までレンダリングされます。
ホットスタート
applicationWillEnterForeground() から applicationDidBecomeActive() で終了します。
2.4.2 起動監視の方法
起動監視は自動監視と手動監視に分かれます。
2 つのモードは相互に使用できます。手動追跡モードが優先されます。
2.4.2.1 自動モード
appkey を初期化するだけで済みます。
ユーザーは、最初の ViewController を設定して最初のページを指定するオプションの操作を設定して、コールドスタートの最初のページの読み込み時間を正しく監視することもできます。
関連する API は次のとおりです:
+(void)setRootVCCls:(Class)cls;// DidFinishLaunching の最初の文で RootViewController を設定します例:
#import <UMAPM/UMLaunch.h>
[UMLaunch setRootVCCls:[ViewController class]];注:
設定されていない場合、[UIApplication sharedApplication] デリゲートのウィンドウの rootViewController を探して、ライフサイクルを監視します。
2.4.2.2 手動モード
現在、手動モードはコールドスタート/初回起動フェーズでの追跡のみをサポートしています
関連する API は次のとおりです:
/*
* 3 つの事前定義された終了時刻 (初期化期間の終了、アプリケーション構築期間の終了、ページ読み込み期間の終了) を手動で設定します。 */
+(void)setPredefineLaunchType:(UMPredefineLaunchType)predefineLaunchType;現在、3 つの事前定義されたステージのコールドスタートの埋め込みポイントは次のとおりです:
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:@"Your 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. viewDidAppear メソッドの前に beginLaunch と endLaunch メソッドを呼び出す必要があります。その後の呼び出しは無効です。
3. beginLaunch と endLaunch パラメーターの長さは 10 文字を超えることはできません。
4. beginLaunch と endLaunch のペアの数は 10 を超えることはできません。 beginLaunch と endLaunch のペアの数が 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:@"Your 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 をキャプチャします
注:
ネットワーク機能を有効にする場合は、アプリがネットワーク機能を開始して完全なデータをキャプチャする前に、ネットワーク構成項目機能を有効にする必要があります。そうしないと、ネットワークキャプチャ機能でデータが失われたり、無効になったりする可能性があります。
ネットワークライブラリを他のサードパーティのネットワークライブラリと一緒に使用すると、競合が発生し、ネットワークモジュールの障害につながる可能性があります。
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:@"Your collection service domain name" standbyDomain:@""];
[QTConfigure initWithAppkey:@"Your 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 iOS13 以前のシステム用の APM のネットワークモジュールの個別スイッチを設定して、NSURLProtocol と APM SDK を同時に統合するネットワークモジュール間の競合によって引き起こされるクラッシュを回避します。
* この操作を呼び出す必要がある場合は、APM SDK のネットワークモジュールを初期化する前にこの操作を呼び出してください。
*
* @param enable スイッチを指定します。YES: iOS13 以前の特定のネットワークリクエストをキャプチャします。これはデフォルトで有効になっています。NO: iOS 13 以前の特定のネットワークリクエストはキャプチャされません。
*
* @note 原因: NSURLProtocol と APM SDK のネットワークモジュールを統合する場合、最初に APM SDK のネットワークモジュールを初期化し、次に NSURLProtocol の registerClass を初期化すると、iOS13 以降のバージョンでクラッシュが発生します。現在、問題は iOS システム API が原因であることが確認されており、iOS14 ではこの問題は発生しません。(最初に NSURLProtocol の registerClass を初期化し、次に APM SDK のネットワークモジュールを初期化すると、問題は発生しません。)
* iOS13 以前の初期化コードとの互換性:
* @example:
* // APM SDK で NSURLProtocol が初期化されていることを確認します。
* [NSURLProtocol registerClass:[UMURLProtocol class]];
* UMAPMConfig* config = [UMAPMConfig defaultConfig];
* config.networkEnable = YES;
* [UMCrashConfigure setAPMConfig:config];
* [QTConfigure initWithAppkey:@"Your 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:@"Your collection service domain name" standbyDomain:@""];
[QTConfigure initWithAppkey:@"Your AppKey" channel:@"App Store"];
return YES;
}2.7 OOM 例外
OOM モジュールを有効にするには、構成項目 oomMonitorEnable オプションを YES に設定します。
次の項目に注意してください:
1. OOM がトリガーされたとき、アプリはデバッグモードであってはなりません。これはクラッシュに似ています。
2. OOM は次回の起動時にアップロードされ、次回の起動時にデバッグモードであってはなりません。
上記の両方のステップで、デバッグモードは無効になります。そうしないと、Oom の監視と識別に影響します。
OOM モジュールを有効にするには、UMAPM.framework と UMEFS.framework ライブラリを統合する必要があります。
リリースモードでは、テストデバイスがデータケーブルで 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:@"Your collection service domain name" standbyDomain:@""];
[QTConfigure initWithAppkey:@"Your 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:@"Your AppKey" channel:@"App Store"];
return YES;
}アプリに埋め込まれた H5 ページが APM SDK と統合された後、アプリのアプリケーションパッケージ名のホワイトリストを設定する必要があります。ブリッジングシナリオでは、H5 ページは受信ドメイン名を設定する必要はありません。
例:
import { init } from '@umengfe/apm';
init({
pageFilter: {
mode: 'ignore',
rules: []
},
pid: 'Your AppKey',
pkgList:['Your app package nay']
});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:@"Your AppKey" channel:@"App Store"]; カスタム追跡ポイント
関数またはコードブロックの実行時間をカウントするために使用され、顧客が起動フェーズを詳細化するのに便利です。
注:
1. trackBegin フィールドと trackEnd フィールドをペアにする必要があります。
2. viewDidAppear 操作が終了する前に trackBegin と trackEnd 操作を呼び出す必要があります。その後の呼び出しは無効です。
3. trackBegin と trackEnd パラメーターの長さは 10 文字を超えることはできません。
4. trackBegins と trackEnds の数は 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 ログドットインターフェイス
Log Togger インターフェイスは、合計 5 つの異なるタイプのログレベルを提供し、ログの重大度の 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>パラメーターの制限:
タグの制限: 64 バイト
msg の制限: 1024 バイト
例:
[UAPMLog verbose:@"verbose_test" format:@"verbose タイプのログをテスト"];
[UAPMLog debug:@"debug_test" format:@"デバッグログをテスト"];
[UAPMLog info:@"info_test" format:@"info タイプのログをテスト"];
[UAPMLog warm:@"warn_test" format:@"警告ログをテスト"];
[UAPMLog error:@"error_test" format:@"error タイプのログをテスト"]; 2.11 フロントおよびリアリンク
この機能は必須ではありません。この機能を使用するには、アクセスに EFS SDK 2.3.0 バージョン 以降が必要です。
この機能は、iOS アプリケーションによって開始される HTTP リクエストにカスタムヘッダーを挿入するために使用されます。この機能は、フロントエンドとバックエンドの接続シナリオのニーズを満たすために使用されます。
呼び出し例
#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:@"Your collection service domain name" standbyDomain:@""];
[QTConfigure initWithAppkey:@"Your appkey" channel:@"App Store"];
return YES;
}詳細な説明
プロパティ | 意味 | デフォルト | タイプ |
injectTraceHeader | SDK は、指定されたリクエストヘッダーを iOS アプリケーションのネットワークリクエストに挿入し、関連するプロトコルフィールドを自動的に生成します。 | Empty | 列挙値
|
needTracedUrls | エンドツーエンドモニタリング用の URL のホワイトリストは、デフォルトでは空です。 | nil。デフォルト値は、ホワイトリストが空であることを示します。このパラメーターを設定した場合、ルールに一致するリクエスト URL のみがリクエストヘッダーに挿入されます。 | 配列型、要素は以下をサポートします
|
ignoredUrls | エンドツーエンドモニタリング用の URL 挿入ブラックリスト。デフォルト値: null。 | null。このデフォルト値は、ブラックリストが空であることを示します。この値を設定した場合、ルールに一致するリクエスト URL のみリクエストヘッダーに挿入されません。 | 配列型、要素は以下をサポートします
|
injectSDKRequest | SDK の内部リクエストにリクエストヘッダーを挿入するかどうかを指定します。デフォルト値は NO で、挿入は実行されません。 | NO。このデフォルト値は、リクエストヘッダーが SDK の内部リクエスト URL に挿入されないことを示します。 | ブール型 |
3. シンボルテーブルの設定
3.1 シンボルテーブルとは
The シンボルテーブルは、メモリアドレスと関数名、ファイル名、行番号の間のマッピングテーブルです。シンボルテーブルの要素は次のとおりです: <開始アドレス> <終了アドレス> <関数> [<ファイル名: 行番号>]。ユーザー APP で発生したクラッシュのコードの場所を迅速かつ正確に特定するために、シンボルテーブルを使用して APP のスタックを解析し、復元します。
3.2 なぜシンボルテーブルをアップロードするのか
迅速かつ正確にクラッシュコードを特定するには、シンボルテーブルを使用して解析し、解凍します。
例を挙げる

パフォーマンスモニタリングは、シンボルテーブルの手動アップロードに対応しています。
3.3 iOS シンボルテーブル構成モード
dsym ファイルとは何ですか?
In iOS では、dSYM ファイルはデバッグ情報を含むオブジェクトファイルです。 dSYM ファイルには、ファイル名、メソッド名、行番号などの情報が格納されています。 dSYM ファイルは、実行可能ファイルの 16 進数の関数アドレスに対応します。クラッシュしたファイルを分析することで、特定のクラッシュ情報を取得できます。ファイル名は通常 xxx.app.dSYM であり、次の図に示すように、xxx は通常アプリケーションのバイナリパッケージ名を表します。
Xcode パッケージ内で dSYM ファイルとディレクトリ スキーマを表示できます。


dsym ファイルを特定するにはどうすればよいですか?
プロジェクトで取得
ほとんどの場合、コンパイルされた dSYM ファイルは app ファイルと同じディレクトリにあります。次のセクションでは、IDE として XCode を使用して dSYM ファイルの場所を特定する方法について説明します。
-> XCode を起動します。
-> プロジェクト (コンパイル済み) を開く;
-> 左側の列で [製品] 項目を探します。
-> xxx.app を右クリックします
-> [Finder で表示] をクリックします;
次の図のとおりです。

複数の dSYM ファイルがある場合、ツールを使用する際に dSYM ファイルの格納先ディレクトリまたはプロジェクトディレクトリを指定できます。
3.4 シンボルテーブルに関するその他の問題
1. Xcode でコンパイルしても dSYM ファイルが生成されませんか?
デフォルトでは、Xcode Release コンパイラは dSYM ファイルを生成します。ただし、Debug コンパイラは dSYM ファイルを生成しません。対応する Xcode 構成は次のとおりです。
XCode -> ビルド設定 -> コード生成 -> デバッグシンボルの生成 -> はい
XCode -> ビルド設定 -> ビルドオプション -> デバッグ情報フォーマット -> 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 と一致するかどうかを判断するにはどうすればよいですか?
クラッシュ後にスタックを復元する場合、シンボルテーブルファイルの UUID を一致させる必要があります。したがって、アップロードされたシンボルテーブルファイルの UUID が対応するアプリの UUID と同じである場合にのみ、スタックを正確に復元できます。
APM シンボルテーブル管理で選択したバージョンの UUID が、クラッシュスタック内のバイナリイメージの UUID と同じであることを確認してください。シンボルテーブル管理の UUID の末尾にある値 0 は無視できます。


4. dSYM ファイルの UUID を確認するにはどうすればよいですか?
コマンドを実行して UUID を表示する
xcrun dwarfdump --uuid <dSYM file>
シンボルテーブルファイルの UUID の表示
シンボルテーブルファイルの UUID は、dSYM ファイルの UUID と同じです。シンボルテーブルツールを使用すると、dSYM ファイルの UUID を確認できます。
シンボルテーブルファイル (.zip) を生成する ---> シンボルテーブルファイル (.symbol) を解凍する ---> テキストエディターでシンボルテーブルファイルを開く

シンボルテーブルファイルの UUID は、デバッグ SO ファイルの UUID とシンボルテーブルファイルの UUID です。ファイルが大きい場合は、Sublime Text などのテキストエディターを使用してシンボルテーブルファイルを開くことをお勧めします。
5. App Store に公開されたアプリの dSYM ファイルを取得するにはどうすればよいですか?
Xcode を使用してデータを取得する
1. Xcode のトップメニューバーで、ウィンドウ -> オーガナイザーウィンドウ を開きます:

2. 公開されたアーカイブ パッケージを見つけ、そのパッケージを右クリックし、[Finder で表示] を選択します。

3. 対象のアーカイブファイルを右クリックし、ショートカットメニューから [パッケージの内容を表示] を選択します。

4. dSYMs ディレクトリを選択します。このディレクトリには、ダウンロードされた dSYM ファイルが含まれています。

iTunes Connect 経由で取得
1. iTunes Connect にログインします。
2. TestFlight ページに移動します。

3. バージョンを選択し、[Download dSYM] をクリックして dSYM ファイルをダウンロードします。

mdfind ツールを使用してデータを取得する
U-APM エラー詳細ページで、クラッシュの UUID を探します:
次に、Mac シェルで mdfind コマンドを使用して、dSYM ファイルを検索します:
mdfind"com_apple_xcode_dsym_uuids == <UUID>"
注: mdfind を使用する場合、UUID を以下のフォーマットに変換する必要があります: 12345678-1234-1234-1234-xxxxxxxxxx
たとえば、dSYM ファイルの UUID が E30FC309DF7B3C9F8AC57F0F6047D65F の場合、次のコマンドを実行して dSYM ファイルを特定します:
mdfind"com_apple_xcode_dsym_uuids == E30FC309-DF7B-3C9F-8AC5-7F0F6047D65F"|12345678-1234-1234-1234-xxxxxxxxxxxx|
アプリのバージョンをビルドまたは公開するたびに、アプリの dSYM ファイルをバックアップすることをお勧めします。

対応しているアップロード方法: バックグラウンドでの手動アップロード (最大 400 MB)
3.5 プロダクト使用におけるシンボルテーブル
バージョン選択
バージョンリストから選択するか、手動でバージョンを入力できます。
すでに U-APM バックグラウンドバージョンにエラーが報告されている場合は、シンボルテーブルのバージョンドロップダウンボックスから直接選択してアップロードできます
新しいバージョンをリリースする場合は、バージョン番号を手動で入力できます。バージョンと完全に一致するバージョン番号を入力し、[バージョン番号を追加] をクリックします。

ドキュメントに従ってシンボルテーブルファイルをまとめて圧縮します
プラットフォームにログオンし、アップロードするシンボルテーブルアプリケーションを見つけて、上部の [設定] をクリックしてアプリケーション設定ページに移動します。
圧縮されたシンボルテーブルファイルをアップロードするには、 [アップロード] をクリックします。