接入友盟统计与 U-APM,并优化宣传页打卡点标签交互。

友盟 SDK 改为隐私同意后再初始化;宣传页标签新增滑块位移动画,超过 5 个时选中项自动滚动居中。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-03 09:23:15 +08:00
parent c7f557f361
commit 00c3cd0a93
134 changed files with 6555 additions and 590 deletions

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AvailableLibraries</key>
<array>
<dict>
<key>BinaryPath</key>
<string>UMAPM.framework/UMAPM</string>
<key>LibraryIdentifier</key>
<string>ios-arm64</string>
<key>LibraryPath</key>
<string>UMAPM.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
</dict>
<dict>
<key>BinaryPath</key>
<string>UMAPM.framework/UMAPM</string>
<key>LibraryIdentifier</key>
<string>ios-arm64_x86_64-simulator</string>
<key>LibraryPath</key>
<string>UMAPM.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
</array>
<key>CFBundlePackageType</key>
<string>XFWK</string>
<key>XCFrameworkFormatVersion</key>
<string>1.0</string>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,548 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>ios-arm64/UMAPM.framework/Headers/UAPMLog.h</key>
<data>
Fn6vM2xcK6hAKzlIp/5uiu64Rn8=
</data>
<key>ios-arm64/UMAPM.framework/Headers/UMAPMConfig.h</key>
<data>
mTeYNKzjMFj7uRq7O19dZHVBRD8=
</data>
<key>ios-arm64/UMAPM.framework/Headers/UMAPMCustomData.h</key>
<data>
pGDGvAwho/0FYy679Vy3b+BYUVU=
</data>
<key>ios-arm64/UMAPM.framework/Headers/UMAPMCustomLog.h</key>
<data>
o95XAdUl8mE0xQJmhqp0Nk3eSXk=
</data>
<key>ios-arm64/UMAPM.framework/Headers/UMCrashConfigure.h</key>
<data>
iIlEYTQCxTsTg94OtWmZlFbBn6g=
</data>
<key>ios-arm64/UMAPM.framework/Headers/UMLaunch.h</key>
<data>
OVIv4rBQJxSJvQhEQ36PlO44v/s=
</data>
<key>ios-arm64/UMAPM.framework/Headers/UMPage.h</key>
<data>
iDEulCPV+Ts1qh4XTYIIT6eYz3g=
</data>
<key>ios-arm64/UMAPM.framework/Info.plist</key>
<data>
/uxcz9IIT5iV5iif1cHecFjIeT4=
</data>
<key>ios-arm64/UMAPM.framework/PrivacyInfo.xcprivacy</key>
<data>
Tvto37j0/VhNsssb2KK8vt+bz80=
</data>
<key>ios-arm64/UMAPM.framework/UMAPM</key>
<data>
ESG5E9JbR147LytWe6AjbE6W824=
</data>
<key>ios-arm64/UMAPM.framework/_CodeSignature/CodeDirectory</key>
<data>
eaO4KTPyp89lfMFXq8qMbE682io=
</data>
<key>ios-arm64/UMAPM.framework/_CodeSignature/CodeRequirements</key>
<data>
JuNmgPswdtEyu7+QArT1A5d+MPA=
</data>
<key>ios-arm64/UMAPM.framework/_CodeSignature/CodeRequirements-1</key>
<data>
urAypb7vGZjeAwfy2GgbRiQ6lHY=
</data>
<key>ios-arm64/UMAPM.framework/_CodeSignature/CodeResources</key>
<data>
zgHfCYS9Rb+oc+cLNDVDz0j/rqQ=
</data>
<key>ios-arm64/UMAPM.framework/_CodeSignature/CodeSignature</key>
<data>
Wna+elk1MHzQhbI1bK3amvjEhsY=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Headers/UAPMLog.h</key>
<data>
Fn6vM2xcK6hAKzlIp/5uiu64Rn8=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Headers/UMAPMConfig.h</key>
<data>
mTeYNKzjMFj7uRq7O19dZHVBRD8=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Headers/UMAPMCustomData.h</key>
<data>
pGDGvAwho/0FYy679Vy3b+BYUVU=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Headers/UMAPMCustomLog.h</key>
<data>
o95XAdUl8mE0xQJmhqp0Nk3eSXk=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Headers/UMCrashConfigure.h</key>
<data>
iIlEYTQCxTsTg94OtWmZlFbBn6g=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Headers/UMLaunch.h</key>
<data>
OVIv4rBQJxSJvQhEQ36PlO44v/s=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Headers/UMPage.h</key>
<data>
iDEulCPV+Ts1qh4XTYIIT6eYz3g=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Info.plist</key>
<data>
G4Wp1i8Uvp5koz1XDrvQEtwTgW4=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/PrivacyInfo.xcprivacy</key>
<data>
Tvto37j0/VhNsssb2KK8vt+bz80=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/UMAPM</key>
<data>
94QfxlcaRn46COPnsinJ7a6ouqM=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/_CodeSignature/CodeDirectory</key>
<data>
R8V95INDIJPLBmuxbHtqP+crLtE=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/_CodeSignature/CodeRequirements</key>
<data>
OnX22wWFKRSOFN1+obRynMCeyXM=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/_CodeSignature/CodeRequirements-1</key>
<data>
gvz47ZSMF3UtvlxSxyWcH77fZBw=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/_CodeSignature/CodeResources</key>
<data>
FPr+i3ZJYTRZDOTLMbCl9QI10Pc=
</data>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/_CodeSignature/CodeSignature</key>
<data>
2jmj7l5rSw0yVb/vlWAYkK/YBwk=
</data>
</dict>
<key>files2</key>
<dict>
<key>ios-arm64/UMAPM.framework/Headers/UAPMLog.h</key>
<dict>
<key>hash</key>
<data>
Fn6vM2xcK6hAKzlIp/5uiu64Rn8=
</data>
<key>hash2</key>
<data>
se6jej/6AiNbawn8j2zY8xeOwPLt10WGP5HPl8k5KMM=
</data>
</dict>
<key>ios-arm64/UMAPM.framework/Headers/UMAPMConfig.h</key>
<dict>
<key>hash</key>
<data>
mTeYNKzjMFj7uRq7O19dZHVBRD8=
</data>
<key>hash2</key>
<data>
DRvvGO8dMQ4cdxXaT/jGW0byyr8G5pVb2iqNY+jCWpA=
</data>
</dict>
<key>ios-arm64/UMAPM.framework/Headers/UMAPMCustomData.h</key>
<dict>
<key>hash</key>
<data>
pGDGvAwho/0FYy679Vy3b+BYUVU=
</data>
<key>hash2</key>
<data>
44++KY+/UmdG1BbWQQIWNyo9hAymOPllP02E7PmkvOo=
</data>
</dict>
<key>ios-arm64/UMAPM.framework/Headers/UMAPMCustomLog.h</key>
<dict>
<key>hash</key>
<data>
o95XAdUl8mE0xQJmhqp0Nk3eSXk=
</data>
<key>hash2</key>
<data>
wk8jfwqKbTZz8MQ4ihO+0zta2o0211qdXPsK9/TjtuU=
</data>
</dict>
<key>ios-arm64/UMAPM.framework/Headers/UMCrashConfigure.h</key>
<dict>
<key>hash</key>
<data>
iIlEYTQCxTsTg94OtWmZlFbBn6g=
</data>
<key>hash2</key>
<data>
pgUbY1EZa2rozFOKEURboXYOycdcgNMbuCiz1qEgKbw=
</data>
</dict>
<key>ios-arm64/UMAPM.framework/Headers/UMLaunch.h</key>
<dict>
<key>hash</key>
<data>
OVIv4rBQJxSJvQhEQ36PlO44v/s=
</data>
<key>hash2</key>
<data>
tDeaqfSmsuTlX2h3g7Tmr7s5wCZumg9TJG5pKpMSHTM=
</data>
</dict>
<key>ios-arm64/UMAPM.framework/Headers/UMPage.h</key>
<dict>
<key>hash</key>
<data>
iDEulCPV+Ts1qh4XTYIIT6eYz3g=
</data>
<key>hash2</key>
<data>
BrhM9tqdBA/3L91G3fB6Zd4TDnuuv5NS4XbL8r7G1yQ=
</data>
</dict>
<key>ios-arm64/UMAPM.framework/Info.plist</key>
<dict>
<key>hash</key>
<data>
/uxcz9IIT5iV5iif1cHecFjIeT4=
</data>
<key>hash2</key>
<data>
Z/z1XDnj7NS+EYNWQwRe2x5sYiw+hoUfgV6ATj1g3VI=
</data>
</dict>
<key>ios-arm64/UMAPM.framework/PrivacyInfo.xcprivacy</key>
<dict>
<key>hash</key>
<data>
Tvto37j0/VhNsssb2KK8vt+bz80=
</data>
<key>hash2</key>
<data>
AN+41cR8Kh4TFlkxEXlc+KPioYQWdsVnoaCLixQmBS4=
</data>
</dict>
<key>ios-arm64/UMAPM.framework/UMAPM</key>
<dict>
<key>hash</key>
<data>
ESG5E9JbR147LytWe6AjbE6W824=
</data>
<key>hash2</key>
<data>
LI5mswUMCaX9SbNi5Vsm/tXbMMl1thjW2MHzkWEoYRc=
</data>
</dict>
<key>ios-arm64/UMAPM.framework/_CodeSignature/CodeDirectory</key>
<dict>
<key>hash</key>
<data>
eaO4KTPyp89lfMFXq8qMbE682io=
</data>
<key>hash2</key>
<data>
fQLeoT0MhOk7vjUd7kjQRpd0Eu4JHIVrNA7vd3LskrI=
</data>
</dict>
<key>ios-arm64/UMAPM.framework/_CodeSignature/CodeRequirements</key>
<dict>
<key>hash</key>
<data>
JuNmgPswdtEyu7+QArT1A5d+MPA=
</data>
<key>hash2</key>
<data>
pC9PuND5Sexl2uttl6cAe+QBsASVXWTkIRSueQEcS/E=
</data>
</dict>
<key>ios-arm64/UMAPM.framework/_CodeSignature/CodeRequirements-1</key>
<dict>
<key>hash</key>
<data>
urAypb7vGZjeAwfy2GgbRiQ6lHY=
</data>
<key>hash2</key>
<data>
nY0zRCseAii7mncXiFUdkg3tFLP3W2+m3TEcqWSsHK0=
</data>
</dict>
<key>ios-arm64/UMAPM.framework/_CodeSignature/CodeResources</key>
<dict>
<key>hash</key>
<data>
zgHfCYS9Rb+oc+cLNDVDz0j/rqQ=
</data>
<key>hash2</key>
<data>
3GHuJCIlm5+pp/raCzWV24LgkyCWoSZvolpqWP8m/LM=
</data>
</dict>
<key>ios-arm64/UMAPM.framework/_CodeSignature/CodeSignature</key>
<dict>
<key>hash</key>
<data>
Wna+elk1MHzQhbI1bK3amvjEhsY=
</data>
<key>hash2</key>
<data>
C/GzF4sskdotFFPQzRlWYRFLyptJQcKCh+M0HIa2lRI=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Headers/UAPMLog.h</key>
<dict>
<key>hash</key>
<data>
Fn6vM2xcK6hAKzlIp/5uiu64Rn8=
</data>
<key>hash2</key>
<data>
se6jej/6AiNbawn8j2zY8xeOwPLt10WGP5HPl8k5KMM=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Headers/UMAPMConfig.h</key>
<dict>
<key>hash</key>
<data>
mTeYNKzjMFj7uRq7O19dZHVBRD8=
</data>
<key>hash2</key>
<data>
DRvvGO8dMQ4cdxXaT/jGW0byyr8G5pVb2iqNY+jCWpA=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Headers/UMAPMCustomData.h</key>
<dict>
<key>hash</key>
<data>
pGDGvAwho/0FYy679Vy3b+BYUVU=
</data>
<key>hash2</key>
<data>
44++KY+/UmdG1BbWQQIWNyo9hAymOPllP02E7PmkvOo=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Headers/UMAPMCustomLog.h</key>
<dict>
<key>hash</key>
<data>
o95XAdUl8mE0xQJmhqp0Nk3eSXk=
</data>
<key>hash2</key>
<data>
wk8jfwqKbTZz8MQ4ihO+0zta2o0211qdXPsK9/TjtuU=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Headers/UMCrashConfigure.h</key>
<dict>
<key>hash</key>
<data>
iIlEYTQCxTsTg94OtWmZlFbBn6g=
</data>
<key>hash2</key>
<data>
pgUbY1EZa2rozFOKEURboXYOycdcgNMbuCiz1qEgKbw=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Headers/UMLaunch.h</key>
<dict>
<key>hash</key>
<data>
OVIv4rBQJxSJvQhEQ36PlO44v/s=
</data>
<key>hash2</key>
<data>
tDeaqfSmsuTlX2h3g7Tmr7s5wCZumg9TJG5pKpMSHTM=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Headers/UMPage.h</key>
<dict>
<key>hash</key>
<data>
iDEulCPV+Ts1qh4XTYIIT6eYz3g=
</data>
<key>hash2</key>
<data>
BrhM9tqdBA/3L91G3fB6Zd4TDnuuv5NS4XbL8r7G1yQ=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/Info.plist</key>
<dict>
<key>hash</key>
<data>
G4Wp1i8Uvp5koz1XDrvQEtwTgW4=
</data>
<key>hash2</key>
<data>
rLjmMpCL3wAk5aELONK7mMdKvDDomfZ0J4Ynmstk3ys=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/PrivacyInfo.xcprivacy</key>
<dict>
<key>hash</key>
<data>
Tvto37j0/VhNsssb2KK8vt+bz80=
</data>
<key>hash2</key>
<data>
AN+41cR8Kh4TFlkxEXlc+KPioYQWdsVnoaCLixQmBS4=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/UMAPM</key>
<dict>
<key>hash</key>
<data>
94QfxlcaRn46COPnsinJ7a6ouqM=
</data>
<key>hash2</key>
<data>
cL0TsmtXyuqQDHzXPyjqkaojhXj7GLwS96yMjFvDwC0=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/_CodeSignature/CodeDirectory</key>
<dict>
<key>hash</key>
<data>
R8V95INDIJPLBmuxbHtqP+crLtE=
</data>
<key>hash2</key>
<data>
gdy1P+FoLiF8yYcub/lkP37uO/kNebm8mgUQYJeIx/c=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/_CodeSignature/CodeRequirements</key>
<dict>
<key>hash</key>
<data>
OnX22wWFKRSOFN1+obRynMCeyXM=
</data>
<key>hash2</key>
<data>
mHkgkE6rZQ51eIwFSqCwUk5qgL/HGqMt+NI3phdD+YY=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/_CodeSignature/CodeRequirements-1</key>
<dict>
<key>hash</key>
<data>
gvz47ZSMF3UtvlxSxyWcH77fZBw=
</data>
<key>hash2</key>
<data>
XASeO8seEqrKlR3yv1l5KNCVuCmJtEaLLGH4Ug6iM0w=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/_CodeSignature/CodeResources</key>
<dict>
<key>hash</key>
<data>
FPr+i3ZJYTRZDOTLMbCl9QI10Pc=
</data>
<key>hash2</key>
<data>
n1H/Dp9CCAilOtR0O2/l7sYtWDi0ofdyr8VwxSWwYwQ=
</data>
</dict>
<key>ios-arm64_x86_64-simulator/UMAPM.framework/_CodeSignature/CodeSignature</key>
<dict>
<key>hash</key>
<data>
2jmj7l5rSw0yVb/vlWAYkK/YBwk=
</data>
<key>hash2</key>
<data>
47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

Binary file not shown.

View File

@ -0,0 +1,27 @@
//
// UAPMLog.h
// WPKCore
//
// Created by baxiong on 2024/7/2.
// Copyright © 2024 uc. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface UAPMLog : NSObject
+ (void)verbose:(NSString *)tag msg:(NSString *)msg;
+ (void)debug:(NSString *)tag msg:(NSString *)msg;
+ (void)info:(NSString *)tag msg:(NSString *)msg;
+ (void)warn:(NSString *)tag msg:(NSString *)msg;
+ (void)error:(NSString *)tag msg:(NSString *)msg;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,105 @@
//
// UMAPMConfig.h
// UMAPM
//
// Created by zhangjunhua on 2021/6/21.
// Copyright © 2021 wangkai. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface UMAPMConfig : NSObject<NSCopying>
+(UMAPMConfig*)defaultConfig;
/**
* crash&卡顿监控开关,默认开启
*/
@property (nonatomic,assign) BOOL crashAndBlockMonitorEnable;
/**
* 启动模块监控开关,默认开启
*/
@property (nonatomic,assign) BOOL launchMonitorEnable;
/**
* 内存模块监控开关,默认开启
*/
@property (nonatomic,assign) BOOL memMonitorEnable;
/**
* OOM模块监控开关默认开启
*/
@property (nonatomic,assign) BOOL oomMonitorEnable;
/**
* 网络模块监控开关,默认开启
*/
@property (nonatomic,assign) BOOL networkEnable;
/**
* H5打通模块开关默认开启
*/
@property (nonatomic,assign) BOOL javaScriptBridgeEnable;
/**
* 页面分析打通模块开关,默认开启
*/
@property (nonatomic,assign) BOOL pageMonitorEnable;
/**
* 日志回捞模块开关,默认开启
*/
@property (nonatomic,assign) BOOL logCollectEnable;
/**
* 日志回捞模块userId
*/
@property (nonatomic,copy) NSString *logCollectUserId;
/**
*启用cxa_throw 方案规避第三方SDK也实现了__cxa_throw()导致CPP堆栈为空的问题默认关闭
*/
@property (nonatomic,assign) BOOL swapOfCxaThrow;
/**
*集成测试。
*/
+ (BOOL)handleUrl:(NSURL *)url;
/*
* 卡顿监控参数
* 发送检测心跳的时间间隔。单位:秒。
* 区间范围[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
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,52 @@
//
// UMAPMCustomData.h
// UMCrash
//
// Created by yanke on 2024/10/10.
// Copyright © 2024 wangkai. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef NSString * UMAPMCustomStringDataKey NS_STRING_ENUM;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey1;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey2;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey3;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey4;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey5;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey6;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey7;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey8;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey9;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey10;
// 字符串不能超过100个字符
FOUNDATION_EXPORT int const UMAPM_CUSTOM_DATA_MAX_STRING_VALUE_LENGTH;
@interface UMAPMCustomData : NSObject
- (NSDictionary *)customDataDictInfo;
/**
* 获取设置的自定义维度数据
* @param key 如果KEY不在预设的中返回nil
* @return 如果有设置则返回当前值如果没有设置返回nil
*/
- (nullable NSString *)getStringParam:(UMAPMCustomStringDataKey)key;
/**
* 设置自定义维度数据
* @param key 如果KEY不在预设的中则设置失败
* @param param 长度不能超过 UMAPM_CUSTOM_DATA_MAX_STRING_VALUE_LENGTH
* value = null, 则会设置空串
* value = 长度超标字符串则会截取前UMAPM_CUSTOM_DATA_MAX_STRING_VALUE_LENGTH个字符设置
*/
- (BOOL)putStringParam:(nullable NSString *)param forKey:(UMAPMCustomStringDataKey)key;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,26 @@
//
// UMAPMCustomLog.h
// UMCrash
//
// Created by 彦克 on 2024/6/5.
// Copyright © 2024 wangkai. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface UMAPMCustomLog : NSObject
+ (void)vTag:(NSString *)tag msg:(NSString *)msg;
+ (void)dTag:(NSString *)tag msg:(NSString *)msg;
+ (void)iTag:(NSString *)tag msg:(NSString *)msg;
+ (void)wTag:(NSString *)tag msg:(NSString *)msg;
+ (void)eTag:(NSString *)tag msg:(NSString *)msg;
/// 设置写入日志的缓存大小,日志将根据设置的缓存大小循环写入
/// - Parameter size: 最大缓存条数
+ (void)setMaxCount:(NSInteger)size;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,156 @@
//
// UMCrashConfigure.h
// UMCrash
//
// Created by wangkai on 2020/9/3.
// Copyright © 2020 wangkai. All rights reserved.
//
#import <Foundation/Foundation.h>
typedef NSString *_Nullable(^CallbackBlock)(void);
FOUNDATION_EXPORT NSString * _Nonnull const UMReportExceptionNameForCSharp;
@class UMAPMConfig,UMAPMCustomData;;
typedef NS_ENUM(NSInteger, UMCrashType)
{
/* 崩溃 */
UMCrashTypeException = 0x01,
/* 卡顿 */
UMCrashTypeBlock = 0x02,
/* 自定义错误 */
UMCrashTypeUserReported = 0x03,
/* 其他 */
UMCrashTypeOther = 0x04,
};
typedef NSString *_Nullable(^CrashCallBackBlock)(UMCrashType type);
typedef NSString * UMAPMPerfTypeName NS_TYPED_EXTENSIBLE_ENUM;
FOUNDATION_EXTERN UMAPMPerfTypeName const _Nonnull UMAPMPerfTypeLaunch;
@interface UMCrashConfigure : NSObject
//获取sdk版本号
+ (NSString *_Nonnull)getVersion;
/**
* 异常回调随异常信息一起上报。return字符串不能大于256字节
*/
+ (void)setCrashCBBlock:(CallbackBlock _Nullable )cbBlock;
/**
* 异常回调随异常信息一起上报。不同于“setCrashCBBlock:”方法回调中提供了异常类型两个方法按需取一个实现即可。return字符串不能大于256字节。
*/
+ (void)setCrashCallBackBlock:(CrashCallBackBlock _Nullable )cbBlock;
/**
* 设置自定义版本号和build版本号即子版本号 (需要在初始化appkey方法之前调用)
*/
+ (void)setAppVersion:( NSString * __nonnull )appVersion buildVersion:(NSString* __nullable)buildVersion;
/**
* 设置APM的各个模块的开启/关闭配置(需要在初始化appkey方法之前调用)
*/
+(void)setAPMConfig:(UMAPMConfig*_Nonnull)config;
/**
* @brief 设置APM的网络模块针对iOS13及以下系统的单独开关以避免在同时集成NSURLProtocol和APM的网络模块的本身冲突引起崩溃。
* 如果需要调用在初始化UAPM网络模块前调用。
*
* @param enable 指定开关。YES(捕获iOS13及以下特定网络请求默认开启)。NO:不捕获iOS13及以下特定网络请求。
*
* @note 问题原因同时集成NSURLProtocol和APM的网络模块的场景先初始化APM的网络模块再初始化NSURLProtocol的registerClass会导致崩溃在iOS13及以下版本会崩溃目前可以确定为iOS系统API引起的问题iOS14无此问题。先初始化NSURLProtocol的registerClass再初始化APM的网络模块是不会出现问题的
* 兼容iOS13及以下的初始化代码如下
* @example:
* //确保NSURLProtocol的初始化在UMAPM的上面
* [NSURLProtocol registerClass:[UMURLProtocol class]];
* UMAPMConfig* config = [UMAPMConfig defaultConfig];
* config.networkEnable = YES;
* [UMCrashConfigure setAPMConfig:config];
* [UMConfigure initWithAppkey:UMAPPKEY channel:@"App Store"];
*
* @note
* 此开关默认打开在同时集成NSURLProtocol和APM的网络模块的场景时候根据需要调用如果按照上述初始化顺序不需要调用。
*
* @note 此函数关闭生效后不会完全关闭网络模块只是针对特定网络请求不再捕获如果开发者能知道同时集成NSURLProtocol和APM的网络模块的场景的时候最好通过调整初始化顺利来兼容所有场景并在iOS13及以下版本测试兼容性。
* @note:其他场景下,不需要调用此函数。
*/
+(void)enableNetworkForProtocol:(BOOL)enable;
/**
* 上报自定义错误
* 用户可以用SDK预定义的字符串UMReportExceptionNameForCSharp来传递csharp类型的自定义异常
* @name 名称 长度限制256字符以内超过截断。
* @reason 错误原因 长度限制256字符以内超过截断。
* @stackTrace 堆栈 长度累计限制5000字符以内超过部分的数组项会丢弃。
*
* @example:
* // 日志类型唯一标识
NSString* name = @"csharp";
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;
/**
* 增加自定义信息
* 设置此接口后当发生崩溃、卡顿、自定义错误时会携带相应信息。如用户ID、直播房间号。注一个生命周期最多支持设置10对
* @key NSString 键。
* @value NSString 值。
*
*/
+ (void)addCustomInfoKey:(NSString *_Nonnull)key value:(NSString *_Nonnull)value;
/**
* 添加自定义维度SDK初始化前调用无效
* @param data 需要更新的自定义维度
*/
+ (void)updateCustomData:(UMAPMCustomData *_Nonnull)data;
/**
* 获取当前自定标维度信息,若未设置,返回空
* @return 已设置的自定义维度
*/
+ (nullable UMAPMCustomData *)currentCustomData;
/**
* 性能日志回调 目前仅支持启动UMAPMPerfTypeLaunch
*/
+ (void)setPerfCallBackBlock:(void(^_Nullable)(UMAPMPerfTypeName _Nonnull type))cbBlock;
/**
* 设置网络分析Response用于补齐网络分析中的Response
* */
+ (void)setResponse:(NSString *_Nonnull)responseStr forTaskDesc:(NSString *_Nonnull)taskDesc;
/**
* 网络分析环境状态
* Yes环境可用 NO环境不可用
*
*/
+ (BOOL)networkMonitorStatus;
/**
* 控制写入日志回捞写入频率,使用前请联系开发者,自行修改可能产生未知问题
*
*/
+ (void)setLogCollectSaveSize:(long) size;
+ (void)setLogCollectInitImmediately:(BOOL) initImmediately;
@end

View File

@ -0,0 +1,47 @@
//
// UMLaunch.h
// WPKCore
//
// Created by zhangjunhua on 2021/4/20.
// Copyright © 2021 uc. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
//冷启动的预定义类型
typedef NS_ENUM(NSInteger,UMPredefineLaunchType){
UMPredefineLaunchType_DidFinishLaunchingEnd,//在didFinishLaunchingWithOptions的最后一句设置
UMPredefineLaunchType_ViewDidLoadEnd,//在第一个ViewController的viewDidLoad函数的最后调用
UMPredefineLaunchType_ViewDidAppearEnd//在第一个ViewController的viewDidAppear函数的最后调用
};
@interface UMLaunch : NSObject
+(instancetype)shareInstance;
+(void)setRootVCCls:(Class)cls;//在DidFinishLaunching第一句代码提前设置RootViewController
/*
* 手动设置三个预定义时间结束时间(初始化耗时结束,应用构建耗时结束,页面加载耗时结束)
*/
+(void)setPredefineLaunchType:(UMPredefineLaunchType)predefineLaunchType;
/*
* 用户在冷启动阶段设置自己的自定义阶段
* @note beginLaunch和endLaunch必须要配对调用
* 如果调用时间段,不在页面加载耗时结束前调用,是不会上报的
*/
+ (void)beginLaunch:(NSString *)methodName;
+ (void)endLaunch:(NSString *)methodName;
/*
* 开启关闭启动模块采集
*/
+(void)setLaunchEnable:(BOOL)enable;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,21 @@
//
// UMPage.h
// WPKCore
//
// Created by liuwei on 2022/6/16.
// Copyright © 2022 uc. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UMPage : NSObject
+ (void)trackBegin:(NSString *)methodName viewController:(UIViewController *)vc;
+ (void)trackEnd:(NSString *)methodName viewController:(UIViewController *)vc;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>35F9.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>7D9E.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View File

@ -0,0 +1,222 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Headers/UAPMLog.h</key>
<data>
Fn6vM2xcK6hAKzlIp/5uiu64Rn8=
</data>
<key>Headers/UMAPMConfig.h</key>
<data>
mTeYNKzjMFj7uRq7O19dZHVBRD8=
</data>
<key>Headers/UMAPMCustomData.h</key>
<data>
pGDGvAwho/0FYy679Vy3b+BYUVU=
</data>
<key>Headers/UMAPMCustomLog.h</key>
<data>
o95XAdUl8mE0xQJmhqp0Nk3eSXk=
</data>
<key>Headers/UMCrashConfigure.h</key>
<data>
iIlEYTQCxTsTg94OtWmZlFbBn6g=
</data>
<key>Headers/UMLaunch.h</key>
<data>
OVIv4rBQJxSJvQhEQ36PlO44v/s=
</data>
<key>Headers/UMPage.h</key>
<data>
iDEulCPV+Ts1qh4XTYIIT6eYz3g=
</data>
<key>Info.plist</key>
<data>
/uxcz9IIT5iV5iif1cHecFjIeT4=
</data>
<key>PrivacyInfo.xcprivacy</key>
<data>
Tvto37j0/VhNsssb2KK8vt+bz80=
</data>
</dict>
<key>files2</key>
<dict>
<key>Headers/UAPMLog.h</key>
<dict>
<key>hash</key>
<data>
Fn6vM2xcK6hAKzlIp/5uiu64Rn8=
</data>
<key>hash2</key>
<data>
se6jej/6AiNbawn8j2zY8xeOwPLt10WGP5HPl8k5KMM=
</data>
</dict>
<key>Headers/UMAPMConfig.h</key>
<dict>
<key>hash</key>
<data>
mTeYNKzjMFj7uRq7O19dZHVBRD8=
</data>
<key>hash2</key>
<data>
DRvvGO8dMQ4cdxXaT/jGW0byyr8G5pVb2iqNY+jCWpA=
</data>
</dict>
<key>Headers/UMAPMCustomData.h</key>
<dict>
<key>hash</key>
<data>
pGDGvAwho/0FYy679Vy3b+BYUVU=
</data>
<key>hash2</key>
<data>
44++KY+/UmdG1BbWQQIWNyo9hAymOPllP02E7PmkvOo=
</data>
</dict>
<key>Headers/UMAPMCustomLog.h</key>
<dict>
<key>hash</key>
<data>
o95XAdUl8mE0xQJmhqp0Nk3eSXk=
</data>
<key>hash2</key>
<data>
wk8jfwqKbTZz8MQ4ihO+0zta2o0211qdXPsK9/TjtuU=
</data>
</dict>
<key>Headers/UMCrashConfigure.h</key>
<dict>
<key>hash</key>
<data>
iIlEYTQCxTsTg94OtWmZlFbBn6g=
</data>
<key>hash2</key>
<data>
pgUbY1EZa2rozFOKEURboXYOycdcgNMbuCiz1qEgKbw=
</data>
</dict>
<key>Headers/UMLaunch.h</key>
<dict>
<key>hash</key>
<data>
OVIv4rBQJxSJvQhEQ36PlO44v/s=
</data>
<key>hash2</key>
<data>
tDeaqfSmsuTlX2h3g7Tmr7s5wCZumg9TJG5pKpMSHTM=
</data>
</dict>
<key>Headers/UMPage.h</key>
<dict>
<key>hash</key>
<data>
iDEulCPV+Ts1qh4XTYIIT6eYz3g=
</data>
<key>hash2</key>
<data>
BrhM9tqdBA/3L91G3fB6Zd4TDnuuv5NS4XbL8r7G1yQ=
</data>
</dict>
<key>PrivacyInfo.xcprivacy</key>
<dict>
<key>hash</key>
<data>
Tvto37j0/VhNsssb2KK8vt+bz80=
</data>
<key>hash2</key>
<data>
AN+41cR8Kh4TFlkxEXlc+KPioYQWdsVnoaCLixQmBS4=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View File

@ -0,0 +1,27 @@
//
// UAPMLog.h
// WPKCore
//
// Created by baxiong on 2024/7/2.
// Copyright © 2024 uc. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface UAPMLog : NSObject
+ (void)verbose:(NSString *)tag msg:(NSString *)msg;
+ (void)debug:(NSString *)tag msg:(NSString *)msg;
+ (void)info:(NSString *)tag msg:(NSString *)msg;
+ (void)warn:(NSString *)tag msg:(NSString *)msg;
+ (void)error:(NSString *)tag msg:(NSString *)msg;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,105 @@
//
// UMAPMConfig.h
// UMAPM
//
// Created by zhangjunhua on 2021/6/21.
// Copyright © 2021 wangkai. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface UMAPMConfig : NSObject<NSCopying>
+(UMAPMConfig*)defaultConfig;
/**
* crash&卡顿监控开关,默认开启
*/
@property (nonatomic,assign) BOOL crashAndBlockMonitorEnable;
/**
* 启动模块监控开关,默认开启
*/
@property (nonatomic,assign) BOOL launchMonitorEnable;
/**
* 内存模块监控开关,默认开启
*/
@property (nonatomic,assign) BOOL memMonitorEnable;
/**
* OOM模块监控开关默认开启
*/
@property (nonatomic,assign) BOOL oomMonitorEnable;
/**
* 网络模块监控开关,默认开启
*/
@property (nonatomic,assign) BOOL networkEnable;
/**
* H5打通模块开关默认开启
*/
@property (nonatomic,assign) BOOL javaScriptBridgeEnable;
/**
* 页面分析打通模块开关,默认开启
*/
@property (nonatomic,assign) BOOL pageMonitorEnable;
/**
* 日志回捞模块开关,默认开启
*/
@property (nonatomic,assign) BOOL logCollectEnable;
/**
* 日志回捞模块userId
*/
@property (nonatomic,copy) NSString *logCollectUserId;
/**
*启用cxa_throw 方案规避第三方SDK也实现了__cxa_throw()导致CPP堆栈为空的问题默认关闭
*/
@property (nonatomic,assign) BOOL swapOfCxaThrow;
/**
*集成测试。
*/
+ (BOOL)handleUrl:(NSURL *)url;
/*
* 卡顿监控参数
* 发送检测心跳的时间间隔。单位:秒。
* 区间范围[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
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,52 @@
//
// UMAPMCustomData.h
// UMCrash
//
// Created by yanke on 2024/10/10.
// Copyright © 2024 wangkai. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef NSString * UMAPMCustomStringDataKey NS_STRING_ENUM;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey1;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey2;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey3;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey4;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey5;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey6;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey7;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey8;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey9;
FOUNDATION_EXPORT UMAPMCustomStringDataKey const UMAPMCustomStringDataKey10;
// 字符串不能超过100个字符
FOUNDATION_EXPORT int const UMAPM_CUSTOM_DATA_MAX_STRING_VALUE_LENGTH;
@interface UMAPMCustomData : NSObject
- (NSDictionary *)customDataDictInfo;
/**
* 获取设置的自定义维度数据
* @param key 如果KEY不在预设的中返回nil
* @return 如果有设置则返回当前值如果没有设置返回nil
*/
- (nullable NSString *)getStringParam:(UMAPMCustomStringDataKey)key;
/**
* 设置自定义维度数据
* @param key 如果KEY不在预设的中则设置失败
* @param param 长度不能超过 UMAPM_CUSTOM_DATA_MAX_STRING_VALUE_LENGTH
* value = null, 则会设置空串
* value = 长度超标字符串则会截取前UMAPM_CUSTOM_DATA_MAX_STRING_VALUE_LENGTH个字符设置
*/
- (BOOL)putStringParam:(nullable NSString *)param forKey:(UMAPMCustomStringDataKey)key;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,26 @@
//
// UMAPMCustomLog.h
// UMCrash
//
// Created by 彦克 on 2024/6/5.
// Copyright © 2024 wangkai. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface UMAPMCustomLog : NSObject
+ (void)vTag:(NSString *)tag msg:(NSString *)msg;
+ (void)dTag:(NSString *)tag msg:(NSString *)msg;
+ (void)iTag:(NSString *)tag msg:(NSString *)msg;
+ (void)wTag:(NSString *)tag msg:(NSString *)msg;
+ (void)eTag:(NSString *)tag msg:(NSString *)msg;
/// 设置写入日志的缓存大小,日志将根据设置的缓存大小循环写入
/// - Parameter size: 最大缓存条数
+ (void)setMaxCount:(NSInteger)size;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,156 @@
//
// UMCrashConfigure.h
// UMCrash
//
// Created by wangkai on 2020/9/3.
// Copyright © 2020 wangkai. All rights reserved.
//
#import <Foundation/Foundation.h>
typedef NSString *_Nullable(^CallbackBlock)(void);
FOUNDATION_EXPORT NSString * _Nonnull const UMReportExceptionNameForCSharp;
@class UMAPMConfig,UMAPMCustomData;;
typedef NS_ENUM(NSInteger, UMCrashType)
{
/* 崩溃 */
UMCrashTypeException = 0x01,
/* 卡顿 */
UMCrashTypeBlock = 0x02,
/* 自定义错误 */
UMCrashTypeUserReported = 0x03,
/* 其他 */
UMCrashTypeOther = 0x04,
};
typedef NSString *_Nullable(^CrashCallBackBlock)(UMCrashType type);
typedef NSString * UMAPMPerfTypeName NS_TYPED_EXTENSIBLE_ENUM;
FOUNDATION_EXTERN UMAPMPerfTypeName const _Nonnull UMAPMPerfTypeLaunch;
@interface UMCrashConfigure : NSObject
//获取sdk版本号
+ (NSString *_Nonnull)getVersion;
/**
* 异常回调随异常信息一起上报。return字符串不能大于256字节
*/
+ (void)setCrashCBBlock:(CallbackBlock _Nullable )cbBlock;
/**
* 异常回调随异常信息一起上报。不同于“setCrashCBBlock:”方法回调中提供了异常类型两个方法按需取一个实现即可。return字符串不能大于256字节。
*/
+ (void)setCrashCallBackBlock:(CrashCallBackBlock _Nullable )cbBlock;
/**
* 设置自定义版本号和build版本号即子版本号 (需要在初始化appkey方法之前调用)
*/
+ (void)setAppVersion:( NSString * __nonnull )appVersion buildVersion:(NSString* __nullable)buildVersion;
/**
* 设置APM的各个模块的开启/关闭配置(需要在初始化appkey方法之前调用)
*/
+(void)setAPMConfig:(UMAPMConfig*_Nonnull)config;
/**
* @brief 设置APM的网络模块针对iOS13及以下系统的单独开关以避免在同时集成NSURLProtocol和APM的网络模块的本身冲突引起崩溃。
* 如果需要调用在初始化UAPM网络模块前调用。
*
* @param enable 指定开关。YES(捕获iOS13及以下特定网络请求默认开启)。NO:不捕获iOS13及以下特定网络请求。
*
* @note 问题原因同时集成NSURLProtocol和APM的网络模块的场景先初始化APM的网络模块再初始化NSURLProtocol的registerClass会导致崩溃在iOS13及以下版本会崩溃目前可以确定为iOS系统API引起的问题iOS14无此问题。先初始化NSURLProtocol的registerClass再初始化APM的网络模块是不会出现问题的
* 兼容iOS13及以下的初始化代码如下
* @example:
* //确保NSURLProtocol的初始化在UMAPM的上面
* [NSURLProtocol registerClass:[UMURLProtocol class]];
* UMAPMConfig* config = [UMAPMConfig defaultConfig];
* config.networkEnable = YES;
* [UMCrashConfigure setAPMConfig:config];
* [UMConfigure initWithAppkey:UMAPPKEY channel:@"App Store"];
*
* @note
* 此开关默认打开在同时集成NSURLProtocol和APM的网络模块的场景时候根据需要调用如果按照上述初始化顺序不需要调用。
*
* @note 此函数关闭生效后不会完全关闭网络模块只是针对特定网络请求不再捕获如果开发者能知道同时集成NSURLProtocol和APM的网络模块的场景的时候最好通过调整初始化顺利来兼容所有场景并在iOS13及以下版本测试兼容性。
* @note:其他场景下,不需要调用此函数。
*/
+(void)enableNetworkForProtocol:(BOOL)enable;
/**
* 上报自定义错误
* 用户可以用SDK预定义的字符串UMReportExceptionNameForCSharp来传递csharp类型的自定义异常
* @name 名称 长度限制256字符以内超过截断。
* @reason 错误原因 长度限制256字符以内超过截断。
* @stackTrace 堆栈 长度累计限制5000字符以内超过部分的数组项会丢弃。
*
* @example:
* // 日志类型唯一标识
NSString* name = @"csharp";
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;
/**
* 增加自定义信息
* 设置此接口后当发生崩溃、卡顿、自定义错误时会携带相应信息。如用户ID、直播房间号。注一个生命周期最多支持设置10对
* @key NSString 键。
* @value NSString 值。
*
*/
+ (void)addCustomInfoKey:(NSString *_Nonnull)key value:(NSString *_Nonnull)value;
/**
* 添加自定义维度SDK初始化前调用无效
* @param data 需要更新的自定义维度
*/
+ (void)updateCustomData:(UMAPMCustomData *_Nonnull)data;
/**
* 获取当前自定标维度信息,若未设置,返回空
* @return 已设置的自定义维度
*/
+ (nullable UMAPMCustomData *)currentCustomData;
/**
* 性能日志回调 目前仅支持启动UMAPMPerfTypeLaunch
*/
+ (void)setPerfCallBackBlock:(void(^_Nullable)(UMAPMPerfTypeName _Nonnull type))cbBlock;
/**
* 设置网络分析Response用于补齐网络分析中的Response
* */
+ (void)setResponse:(NSString *_Nonnull)responseStr forTaskDesc:(NSString *_Nonnull)taskDesc;
/**
* 网络分析环境状态
* Yes环境可用 NO环境不可用
*
*/
+ (BOOL)networkMonitorStatus;
/**
* 控制写入日志回捞写入频率,使用前请联系开发者,自行修改可能产生未知问题
*
*/
+ (void)setLogCollectSaveSize:(long) size;
+ (void)setLogCollectInitImmediately:(BOOL) initImmediately;
@end

View File

@ -0,0 +1,47 @@
//
// UMLaunch.h
// WPKCore
//
// Created by zhangjunhua on 2021/4/20.
// Copyright © 2021 uc. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
//冷启动的预定义类型
typedef NS_ENUM(NSInteger,UMPredefineLaunchType){
UMPredefineLaunchType_DidFinishLaunchingEnd,//在didFinishLaunchingWithOptions的最后一句设置
UMPredefineLaunchType_ViewDidLoadEnd,//在第一个ViewController的viewDidLoad函数的最后调用
UMPredefineLaunchType_ViewDidAppearEnd//在第一个ViewController的viewDidAppear函数的最后调用
};
@interface UMLaunch : NSObject
+(instancetype)shareInstance;
+(void)setRootVCCls:(Class)cls;//在DidFinishLaunching第一句代码提前设置RootViewController
/*
* 手动设置三个预定义时间结束时间(初始化耗时结束,应用构建耗时结束,页面加载耗时结束)
*/
+(void)setPredefineLaunchType:(UMPredefineLaunchType)predefineLaunchType;
/*
* 用户在冷启动阶段设置自己的自定义阶段
* @note beginLaunch和endLaunch必须要配对调用
* 如果调用时间段,不在页面加载耗时结束前调用,是不会上报的
*/
+ (void)beginLaunch:(NSString *)methodName;
+ (void)endLaunch:(NSString *)methodName;
/*
* 开启关闭启动模块采集
*/
+(void)setLaunchEnable:(BOOL)enable;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,21 @@
//
// UMPage.h
// WPKCore
//
// Created by liuwei on 2022/6/16.
// Copyright © 2022 uc. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UMPage : NSObject
+ (void)trackBegin:(NSString *)methodName viewController:(UIViewController *)vc;
+ (void)trackEnd:(NSString *)methodName viewController:(UIViewController *)vc;
@end
NS_ASSUME_NONNULL_END

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>35F9.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>7D9E.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View File

@ -0,0 +1,222 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Headers/UAPMLog.h</key>
<data>
Fn6vM2xcK6hAKzlIp/5uiu64Rn8=
</data>
<key>Headers/UMAPMConfig.h</key>
<data>
mTeYNKzjMFj7uRq7O19dZHVBRD8=
</data>
<key>Headers/UMAPMCustomData.h</key>
<data>
pGDGvAwho/0FYy679Vy3b+BYUVU=
</data>
<key>Headers/UMAPMCustomLog.h</key>
<data>
o95XAdUl8mE0xQJmhqp0Nk3eSXk=
</data>
<key>Headers/UMCrashConfigure.h</key>
<data>
iIlEYTQCxTsTg94OtWmZlFbBn6g=
</data>
<key>Headers/UMLaunch.h</key>
<data>
OVIv4rBQJxSJvQhEQ36PlO44v/s=
</data>
<key>Headers/UMPage.h</key>
<data>
iDEulCPV+Ts1qh4XTYIIT6eYz3g=
</data>
<key>Info.plist</key>
<data>
G4Wp1i8Uvp5koz1XDrvQEtwTgW4=
</data>
<key>PrivacyInfo.xcprivacy</key>
<data>
Tvto37j0/VhNsssb2KK8vt+bz80=
</data>
</dict>
<key>files2</key>
<dict>
<key>Headers/UAPMLog.h</key>
<dict>
<key>hash</key>
<data>
Fn6vM2xcK6hAKzlIp/5uiu64Rn8=
</data>
<key>hash2</key>
<data>
se6jej/6AiNbawn8j2zY8xeOwPLt10WGP5HPl8k5KMM=
</data>
</dict>
<key>Headers/UMAPMConfig.h</key>
<dict>
<key>hash</key>
<data>
mTeYNKzjMFj7uRq7O19dZHVBRD8=
</data>
<key>hash2</key>
<data>
DRvvGO8dMQ4cdxXaT/jGW0byyr8G5pVb2iqNY+jCWpA=
</data>
</dict>
<key>Headers/UMAPMCustomData.h</key>
<dict>
<key>hash</key>
<data>
pGDGvAwho/0FYy679Vy3b+BYUVU=
</data>
<key>hash2</key>
<data>
44++KY+/UmdG1BbWQQIWNyo9hAymOPllP02E7PmkvOo=
</data>
</dict>
<key>Headers/UMAPMCustomLog.h</key>
<dict>
<key>hash</key>
<data>
o95XAdUl8mE0xQJmhqp0Nk3eSXk=
</data>
<key>hash2</key>
<data>
wk8jfwqKbTZz8MQ4ihO+0zta2o0211qdXPsK9/TjtuU=
</data>
</dict>
<key>Headers/UMCrashConfigure.h</key>
<dict>
<key>hash</key>
<data>
iIlEYTQCxTsTg94OtWmZlFbBn6g=
</data>
<key>hash2</key>
<data>
pgUbY1EZa2rozFOKEURboXYOycdcgNMbuCiz1qEgKbw=
</data>
</dict>
<key>Headers/UMLaunch.h</key>
<dict>
<key>hash</key>
<data>
OVIv4rBQJxSJvQhEQ36PlO44v/s=
</data>
<key>hash2</key>
<data>
tDeaqfSmsuTlX2h3g7Tmr7s5wCZumg9TJG5pKpMSHTM=
</data>
</dict>
<key>Headers/UMPage.h</key>
<dict>
<key>hash</key>
<data>
iDEulCPV+Ts1qh4XTYIIT6eYz3g=
</data>
<key>hash2</key>
<data>
BrhM9tqdBA/3L91G3fB6Zd4TDnuuv5NS4XbL8r7G1yQ=
</data>
</dict>
<key>PrivacyInfo.xcprivacy</key>
<dict>
<key>hash</key>
<data>
Tvto37j0/VhNsssb2KK8vt+bz80=
</data>
<key>hash2</key>
<data>
AN+41cR8Kh4TFlkxEXlc+KPioYQWdsVnoaCLixQmBS4=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>