跳到主要内容

Unity接入指引


本文是介绍Unity SDK的详细文档,包含了基本的接入流程,和高级的接口使用介绍,以及针对Unity引擎如何更早进行初始化等内容。
如果想快速接入,验证平台和SDK功能,建议查看项目菜单中的“接入指南”。引导中已经按项目具体的信息(平台,引擎,国内/海外,AppID)生成了针对此项目的初始化代码,可以直接复制使用。如下图所示:

项目创建:公司外部项目支持自助创建项目,但有免费试用时长。公司内部项目,企业微信联系“CrashSight小助手”开通。

本文档适用于CrashSight SDK 4.2.x版本。4.3.x版本接入请参考新版Unity SDK开发接入

1 Unity引擎C#接入方案

1.1 下载并导入Unity Plugin到Unity项目工程

在平台成功创建项目后,在侧边栏的“接入指南”中,可以下载到与项目平台和引擎相匹配的SDK。如下图所示:

1.2 初始化CrashSight

选择第一个场景,或者主场景(scene), 在尽可能较早加载的脚本中调用如下代码进行初始化:

// TODO NOT Required. Enable debug log print, please set false for release version
// Debug开关,Debug模式下会打印更多便于问题定位的Log.
#if DEBUG
CrashSightAgent.ConfigDebugMode (true);
#endif

#if UNITY_IPHONE || UNITY_IOS
// 设置上报的目标域名,请根据项目需求进行填写。(必填)
CrashSightAgent.ConfigCrashServerUrl(CrashSightUploadUrliOS);
// 设置上报所指向的APP ID, 并进行初始化。APP ID可以在管理端更多->产品设置->产品信息中找到。
CrashSightAgent.InitWithAppId(CrashSightAppIDForiOS);
#elif UNITY_ANDROID
CrashSightAgent.ConfigCrashServerUrl(CrashSightUploadUrlAndroid);
CrashSightAgent.InitWithAppId(CrashSightAppIDForAndroid);
#elif UNITY_STANDALONE_WIN
CrashSightAgent.InitContext(UserId, AppVersion, CrashSightAppKeyForWindows);
// UserId和AppVersion可根据需要自行决定,APP Key可以在管理端更多->产品设置->产品信息中找到。
#endif

上报域名

国内公有云:

海外公有云

1.3 iOS集成配置

  • 1)在Unity中修改项目的偏好设置(Build Settings) a. 按下 Ctrl+Shift+B打开Build Settings面板, 点击Player Settings切换到Setting for iOS选项卡,选择Other Settings栏,修改Optimization配置项Script Call Optimization的值为Slow and Safe
  • 2)修改导出的Xcode工程的编译配置,切换到Build Phases选项卡, 在Link Binary With Libraries栏目下添加如下依赖性:
    • libc++.dylib 或 libc++.tdb 用于引入c++标准库
    • libz.dylib 或 libz.tdb 用于对上报的数据进行压缩
    • Security.framework 用于存储keychain
    • SystemConfiguration.framework 用于读取异常发生时的系统信息
    • MetricKit.framework 用于获取apple提供的app诊断信息(弱引用,请选择“optional”)
    • OSLog.framework 用于获取NSLog日志信息(弱引用,请选择“optional”)
    • CFNetwork.framework 用于获取VPN状态

注意:

  • i. 如果项目已经添加过这些依赖项,不用重复添加。
  • ii. 通过XUPorter集成无需在Xcode中添加配置。

1.4 Windows集成配置

项目打包完成后,找到打包文件路径中_Data\Plugins\x86_64下CrashSight64.dll,在同级目录下创建CrashSightConfig64.dat文件(新建文本文档,然后修改后缀即可) CrashSightConfig64.dat文件需设置三个参数:

1)游戏进程exe名称,即GameName。 2)上报地址,即DomainUrl。 3)项目ID,即文件中的AppId。

<CrashSightConfig __version="1">
<GameName>Test-Game.exe</GameName>
<LobbyName></LobbyName>
<IgnoreDllCnt>2</IgnoreDllCnt>
<IgnoreDlls>TenSLX.dll</IgnoreDlls>
<IgnoreDlls>Tensafe.dll</IgnoreDlls>
<AppId>0620edc732</AppId>
<DomainUrl>pc.crashsight.qq.com</DomainUrl>
<LogOutput>0620edc732</LogOutput>
</CrashSightConfig>

其中<LogOutput>行是debug日志开关,添加后可以在CrashSight64.dll同目录下生成CrashSightLog目录,其中存放着CrashSight的运行日志。正式上线前请去除这一行。

1.5 Unity 接入演示

  • 1)双击下载好的插件中的CrashSightPlugin.unitypackage包,在Unity中出现如下界面,导入插件。

  • 2)初始化。
private const string CrashSightAppIDForiOS = "685a68759e";
private const string CrashSightAppIDForAndroid = "e6af377f84";
private const string CrashSightUploadUrliOS = "https://ios.crashsight.qq.com/pb/sync";
private const string CrashSightUploadUrlAndroid = "https://android.crashsight.qq.com/pb/async";
private const string CrashSightAppKeyForWindows = "b10d12a8-5769-4467-98b2-4658b2efd847";

CrashSightAgent.ConfigDebugMode (true);
#if UNITY_IPHONE || UNITY_IOS
CrashSightAgent.ConfigCrashServerUrl(CrashSightUploadUrliOS);
CrashSightAgent.InitWithAppId(CrashSightAppIDForiOS);
#elif UNITY_ANDROID
CrashSightAgent.ConfigCrashServerUrl(CrashSightUploadUrlAndroid);
CrashSightAgent.InitWithAppId(CrashSightAppIDForAndroid);
#elif UNITY_STANDALONE_WIN
CrashSightAgent.InitContext("TestUserId", "1.0.1", CrashSightAppKeyForWindows);
#endif
  • 3)iOS接入与安卓类似,不过需要将项目打包为xcode项目,然后在xcode项目中进行配置。Windows需要修改CrashSightConfig64.dat中的配置信息。

1.6 接入结果测试

CrashSight测试接口

测试Java崩溃(Android)

static void TestJavaCrash();

测试Object-C崩溃(iOS)

static void TestOcCrash();

测试Native崩溃(Android&iOS)

static void TestNativeCrash();

强制Unity崩溃(Windows可用)

UnityEngine.Diagnostics.Utils.ForceCrash(ForcedCrashCategory.AccessViolation);

1.6.1 iOS测试方法

  • a. 开启Debug模式,初始化CrashSight,并给定合适的配置参数
  • b. 联网上报:检查测试设备日志中是否打印“begin to upload <CSAnalyticsLogic” 或者 “cmd: 641”
  • c. 崩溃捕获:检查测试设备日志中是否打印“Handle the crash scene in callback”
  • d. 上报异常:检查测试设备日志中是否打印“begin to upload <CSCrashLogic” 或者 “cmd: 631”

1.6.2 Android测试方法

  • a. 开启Debug模式,初始化CrashSight,并给定合适的配置参数
  • b. 联网上报:检查logcat日志是否打印“[Upload] Run upload task with cmd: 840”
  • c. 崩溃捕获:检查logcat日志是否打印“HandleSignal start”
  • d. 上报异常:检查logcat日志是否打印"[Upload] Run upload task with cmd: 830"

1.6.3 Windows测试方法

  • a.初始化CrashSight后,联网上报是否正常,具体验证方法如下:

    1. 初始化CrashSight;
    2. 5分钟后,在管理端页面的 异常概览 --> 崩溃趋势 --> 联网设备数 中可以看到统计数值大于等于1.
  • b.游戏发生崩溃,是否能正确上报,具体验证方法如下:

    1. 初始化CrashSight;
    2. 在游戏内可以由以下代码触发崩溃。(其他类似的坏内存访问也可以)
    int* a = NULL;
    a[10000] = 5;
  • c.查看CrashSight64/dump目录(旧版本为TQM64/dump)下是否有dmp文件生成。如果没有,说明无法成功捕获崩溃,请联系CrashSight开发.

  • d.查看管理端页面 “崩溃分析”页上,是否有对应时间点的上报。如果3有,4没有,说明没有成功上报。请检查APPID配置(两个配置文件均要正确),以及APP KEY配置,是否对应且与应用设置中一样。如果配置正确,还无法上报,请联系CrashSight开发.

  • e.崩溃上报的版本号,用户名是否与设置一致.

  • f.错误上报的版本号,用户名是否与设置一致.

1.7 上传符号表

以上内容介绍了SDK的接入,崩溃上报和验证,但要在页面上看到可读的还原堆栈,还需要上传对应的符号表,请见符号表上传工具使用说明

2 系统原生层接入Unity引擎方案

由于在C#层初始化、完成信号处理函数注册时机较晚,导致之前的崩溃无法捕获,因此支持提前初始化、完成信号注册。

2.1 下载并导入Unity Plugin到Unity项目工程

在平台成功创建项目后,在侧边栏的“接入指南”中,可以下载到与项目平台和引擎相匹配的SDK。如下图所示:

2.2 SDK初始化

2.2.1 Android提前到Java初始化

修改UnityPlayerActivity.java

导入头文件

import com.uqm.crashsight.core.api.CrashSightPlatform;
import com.uqm.crashsight.core.api.crash.UQMCrash;
import com.uqm.crashsight.core.tools.NDKHelper;
import com.uqm.crashsight.core.tools.UQMLog;
import com.uqm.crashsight.crashreport.CrashReport;
import com.uqm.crashsight.crashreport.CrashSightLog;

onCreate函数调用初始化接口init函数

init("https://android.crashsight.qq.com/pb/async", "39bdeb63a2", true);

init函数实现如下:

public void init(String mCrashUploadServerUrl, String appId, boolean mDebugMode) {
if (mCrashUploadServerUrl != null) {
CrashReport.setServerUrl(mCrashUploadServerUrl);
}
Context context = CrashSightPlatform.getActivity();
if (context != null) {
if (NDKHelper.loadSO()) {
UQMLog.e("CrashSightCore.so is loaded successfully");
} else {
UQMLog.e("CrashSightCore.so is loaded failed");
return;
}
} else {
UQMLog.e("CrashSight platform get activity failed.");
return;
}
// 配置用户策略
CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(context);

// 设置回调(C#层需要调用设置回调函数接口)
strategy.setCrashHandleCallback(new CrashReport.CrashHandleCallback() {
@Override
public synchronized Map<String, String> onCrashHandleStart(int crashType, String errorType, String errorMessage, String errorStack) {
// 获得父类的自定义信息Map
Map<String, String> userData = super.onCrashHandleStart(crashType, errorType, errorMessage, errorStack);
if (userData == null) {
userData = new HashMap<>();
}
// 调用用户设置的回调函数,获取Crash上报的额外信息
try {
String extraMessage = UQMCrash.attachmentMessageForException(crashType);
if (extraMessage.length() > 0) {
UQMLog.d("CrashSight extra message report ok, message : " + extraMessage);
userData.put("extmsg", extraMessage);
} else {
UQMLog.d("CrashSight extra message is empty");
}
} catch (Exception e) {
UQMLog.e("onCrashHandleStart extra message report error, message : " + e.getMessage());
}
return userData;
}
@Override
public byte[] onCrashHandleStart2GetExtraDatas(int crashType, String errorType, String errorMessage, String errorStack) {
try {
// 调用用户设置的回调函数,获取Crash上报的额外信息
byte[] extraBinaryMessage = UQMCrash.attachmentForException(crashType);
if (extraBinaryMessage != null && extraBinaryMessage.length > 0) {
UQMLog.d("CrashSight extraBinaryMessage data report ok");
return extraBinaryMessage;
} else {
UQMLog.d("CrashSight extraBinaryMessage data is empty");
return null;
}
} catch (Exception e) {
UQMLog.e("onCrashHandleStart2GetExtraData exception, message : " + e.getMessage());
return null;
}
}
});

// 初始化 CS
CrashReport.initCrashReport(context, appId, mDebugMode, strategy);
}

2.2.2 iOS提前到Objective-C初始化

修改UnityAppController.mm

导入头文件

#import <CrashSight/CrashSight.h>
#import <CrashSight/CrashSightConfig.h>
#import <CrashSightCore/CrashSightCore.h>

实现协议

@interface UnityAppController()<CrashSightDelegate>
@end
// 定义最大回调消息长度(目前仅支持128KB)
#define UQM_CRASHSIGHT_MAX_LEN_EXCEPTION_ATTACH_MESSAGE (1024 * 128)
// 使用命名空间
USING_NS_UQM

实现协议中的回调接口

/**
* 异常回调函数
*
* @param exception 异常信息
* @return 需要追加的信息
*/
- (NSString *)attachmentForException:(NSException *)exception callbackType:(CSCallbackType)callbackType{
UQM_LOG_DEBUG("attachmentForException invoked");
// 通过同步的方法调用获取游戏设置的追加信息
UQMInnerCrashRet ret;
ret.methodNameID = kUQMMethodNameCrashExtraMessage;
// 分配即将存储数据的空间
ret.data = UQM_SAFE_MALLOC(UQM_CRASHSIGHT_MAX_LEN_EXCEPTION_ATTACH_MESSAGE, char);
// 设置最大的长度
ret.maxDataLen = UQM_CRASHSIGHT_MAX_LEN_EXCEPTION_ATTACH_MESSAGE;
std::memset(ret.data, 0, UQM_CRASHSIGHT_MAX_LEN_EXCEPTION_ATTACH_MESSAGE);
// 设置崩溃类型
ret.crashType = (int) callbackType;
// 该方法为同步方法,调用用户设定的回调函数,并获用户追加的信息,即 ret.data
UQMInnerObserverHolder<UQMInnerCrashRet>::CommitToTaskQueueBackRet(ret, kUQMMethodNameCrashExtraMessage, "");
if (strlen(ret.data) == 0) {
return nil;
}
UQM_LOG_DEBUG("attachmentForException message : %s", ret.data);
return [NSString stringWithUTF8String:ret.data];
}

didFinishLaunchingWithOptions初始化

// 初始化CrashSight
// 获取 CrashSight 配置并进行初始化
CrashSightConfig * config = [[CrashSightConfig alloc] init];
config.unexpectedTerminatingDetectionEnable = YES;
config.debugMode = true;
config.reportLogLevel = CrashSightLogLevelVerbose;
config.crashServerUrl = @"https://ios.crashsight.qq.com/pb/sync";

config.delegate = self;

[CrashSight startWithAppId:@"1f29ad1a5a" config:config];

UQM_LOG_DEBUG("CrashSight appid :%s , version :%s","1f29ad1a5a", [CrashSight sdkVersion].UTF8String);

2.3 安卓重注册

由于Unity 5以后的兼容性问题,在原生层进行初始化后,安卓需要在C#进行一次重注册,iOS暂时无需操作。 重注册函数: CrashSightAgent.ReRegistAllMonitors(); 在C#层脚本的尽可能早的位置执行该函数即可。

2.4 上报Unity Log Error(可选)

如果项目想将Unity Log Error作为错误上报到CrashSight,可以通过调用CrashSightAgent.EnableExceptionHandler();开启该功能。需要注意的是,开启该功能后请尽量控制项目中Unity Log Error的触发频率。

2.5 发生崩溃/错误时的回调。(可选)

如果项目想在发生崩溃/错误时,在上报信息中加入一些内容,可以通过处理回调加入相关内容。 需要注意的是:

    1. 回调中的处理请尽可能保证线程安全,防止二次崩溃的发生。发生二次崩溃后,当前崩溃无法在本次完成上报,条件允许的情况下,下次启动会进行上报,但是不会包含回调内容。
    1. 回调的信息请遵守合规要求。

3 C#接口说明(Android&iOS)

3.1 初始化

public static void InitWithAppId (string appId)

说明: 执行初始化工作。 在尽可能早的位置进行初始化以开启崩溃捕获和上报功能。

参数类型说明
appIdstring已注册项目的APP ID

3.2 Debug开关

public static void ConfigDebugMode (bool enable)

说明: 是否开启debug模式,默认为关。开启后会打印一定量的日志,但是可以方便测试期间的问题定位。

备注:需要在InitWithAppId接口之前调用。

参数类型说明
enablebooldebug使能开关

3.3 上报域名设置

`public static void ConfigCrashServerUrl (string crashServerUrl)`

说明: 设置上报域名。

备注:需要在InitWithAppId接口之前调用。

国内公有环境域名如下:

安卓: https://android.crashsight.qq.com/pb/async

iOS: https://ios.crashsight.qq.com/pb/sync

直接接入CrashSight域名与MSDK转接不同,请务必重新依照上述域名配置。其他环境域名请咨询接入接口人。

参数类型说明
crashServerUrlstring要上报的域名

3.4 设置日志上报级别

public static void ConfigCrashReporter(int type, int logLevel)

说明:设置日志上报级别

备注:需要在InitWithAppId接口之前调用。

参数类型说明
typeint忽略,默认写0即可
logLevelintOff=0,Error=1,Warn=2,Info=3,Debug=4

3.5 设置设备ID

public static void SetDeviceId(string deviceId)

说明:从4.2.9版本开始,CrashSight Android不再获取AndroidId,默认采用uuid作为设备ID

备注:需要在InitWithAppId接口之前调用。

参数类型说明
deviceIdstring设备ID

3.6 设置手机型号

public static void SetDeviceModel(string deviceModel)

说明:设置手机型号

备注:需要在InitWithAppId接口之前调用。

参数类型说明
deviceModelstring手机型号

3.7 C#异常使能开关

public static void EnableExceptionHandler ()

说明: 开启上报C#异常、LogError日志。如果没有在C#调用'InitWithAppId(string)'接口初始化,可以单独调用此接口。

3.8 主动上报C#异常

public static void ReportException (System.Exception e, string message)

说明: 主动上报C#异常

参数类型说明
eSystem.ExceptionC#异常
messagestring异常信息

3.9 主动上报C#错误

public static void ReportException(int type, string exceptionName, string exceptionMsg, string exceptionStack, Dictionary<string, string> extInfo)

说明:主动上报C#错误

参数类型说明
typeint异常类型, C#: 4, js: 5, lua: 6
exceptionNamestring异常名称
exceptionMsgstring异常信息
exceptionStackstring堆栈
extInfoDictionary<string, string>其他信息

页面查看:

extInfo:崩溃详情页->附件下载->extraMessage.txt

public static void ReportException(int type, string exceptionName, string exceptionMsg, string exceptionStack, Dictionary<string, string> extInfo, bool isDumpNativeStack)

说明:主动上报C#错误

参数类型说明
typeint异常类型, C#: 4, js: 5, lua: 6
exceptionNamestring异常名称
exceptionMsgstring异常信息
exceptionStackstring堆栈
extInfoDictionary<string, string>其他信息
isDumpNativeStackbool是否dump当前线程的Native堆栈

页面查看:

extInfo:崩溃详情页->附件下载->extraMessage.txt

Native堆栈:崩溃详情页->附件下载->trace.zip

其它:上报错误耗时

AndroidiOS
附件大小dump堆栈不dump堆栈dump堆栈不dump堆栈
100K[0.207000]s[0.001554]s[0.114835]s[0.001172]s
10K[0.204285]s[0.000223]s[0.107594]s[0.000382]s
1K[0.140075]s[0.000151]s[0.105755]s[0.000365]s

3.10 设置用户ID

public static void SetUserId(string userId)

说明: 设置用户ID,请在初始化之后调用。

参数类型说明
userIdstring用户ID

3.11 标记场景

public static void SetScene(int sceneId)

说明:标记场景

参数类型说明
sceneIdint场景ID

3.12 添加自定义数据

public static void AddSceneData(string key, string value)

说明:设置用户自定义的 Key-Value 数据,将在发送 Crash 时随异常信息一起上报,单个key长度限制100字符,单个value限制1000字符,总长度(所有key+value)限制(Android 64KB,iOS 128KB)。支持在回调中使用。

页面查看:崩溃详情页->附件下载->valueMapOthers.txt

参数类型说明
keystring
valuestring

3.13 设置应用版本

public static void SetAppVersion(string appVersion)

说明: 设置应用版本,必须在初始化之前调用。

参数类型说明
appVersionstring版本号

3.14 添加自定义日志

public static void PrintLog(CSLogSeverity level, string format, params object[] args)

说明:自定义日志,限制30KB。安卓不支持在崩溃回调中写入自定义日志。

参数类型说明
levelCSLogSeverity日志级别
formatstring日志格式
argsparams object[]可变参数

3.15 重新注册

public static void ReRegistAllMonitors()

说明:重新注册信号捕获函数,通常在原生接入时使用

3.16 设置回调

public static void RegisterCrashCallback(CrashSightCallback callback)

说明: 崩溃时调用,返回值随崩溃信息一起上报 自定义CsCrashCallBack类,继承CrashSightCallback,实现OnCrashBaseRetEvent方法

public class CsCrashCallBack: CrashSightCallback  {
// Put you own code to implemente the callback func
public override string OnCrashBaseRetEvent(int methodId)
{
if (methodId == (int)UQMMethodNameID.UQM_CRASH_CALLBACK_EXTRA_MESSAGE)
{
return "this is extra message.";
}
return "";
}
}

Android 回调内容在页面“崩溃详情页->附件下载-extraMessage.txt” iOS 回调内容在页面“崩溃详情页->附件下载-crash_attach.log”

3.17 设置上传日志回调

public static void RegisterCrashLogCallback(CrashSightLogCallback callback);

说明: 崩溃处理后调用,自定义CsCrashLogCallback类,继承CrashSightLogCallback,实现OnSetLogPathEvent、OnLogUploadResultEvent方法

public class CsCrashLogCallBack : CrashSightLogCallback
{
// 返回日志文件的绝对路径
// methodId 方法ID,业务侧忽略
// crashType 崩溃类型,0:java/oc崩溃,2:native崩溃
public override string OnSetLogPathEvent(int methodId, int crashType)
{
return "";
}

// 通知日志文件的上传结果
// methodId 方法ID,业务侧忽略
// result 上传结果 0:成功,其他:失败
public override void OnLogUploadResultEvent(int methodId, int crashType, int result)
{

}
}

Android 回调内容在页面“崩溃详情页->附件下载-客户端上传日志” iOS 回调内容在页面“崩溃详情页->附件下载-客户端上传日志”

3.18 设置上报的Android Locat大小

public static void SetLogcatBufferSize(int size)

说明:设置崩溃和错误时上传的logcat日志大小,仅Android有效。建议设置不超过128KB。默认值为30KB。

参数类型说明
sizeintlogcat日志大小,单位byte

4 C#接口说明(Windows)

4.1 初始化

public static void InitContext(string userId, string version, string key)

说明: 执行初始化工作。 在尽可能早的位置进行初始化以开启崩溃捕获和上报功能。 用户Id和版本号可由用户自行决定,它们会在崩溃上报时一并上报。

参数类型说明
userIdstring用户Id
versionstring版本号
keystring已注册项目的APP key

4.2 主动上报C#错误

public static void ReportException(int type, string name, string message, string stackTrace, string extras, bool quitProgram)

说明:主动上报C#错误

参数类型说明
typeint异常类型, C#: 4, js: 5, lua: 6
namestring异常名称
messagestring异常信息
stackTracestring堆栈
extrasstring其他信息
quitProgrambool退出程序
public static void ReportException(int type, string exceptionName, string exceptionMsg, string exceptionStack, Dictionary<string, string> extInfo)

说明:主动上报C#错误

参数类型说明
typeint异常类型, C#: 4, js: 5, lua: 6
exceptionNamestring异常名称
exceptionMsgstring异常信息
exceptionStackstring堆栈
extInfoDictionary<string, string>其他信息

4.3 添加自定义数据

public static void AddSceneData(string key, string value)

说明:设置用户自定义的 Key-Value 数据,将在发送 Crash 时随异常信息一起上报,单个key长度限制100字符,单个value限制1000字符

页面查看:崩溃详情页->Value Map

参数类型说明
keystring
valuestring

4.4 设置自定义日志路径

public static void SetCustomLogDir(string path)

页面查看:崩溃详情页->附件下载->CustomizedLogFile.zip
需要上传多个日志文件时,请使用“|”分隔路径,一次最多传入3个文件的绝对路径,不支持传入目录。单个文件最大支持20MB,大小超过20MB的文件会截取最后20MB;压缩后最大支持10MB,压缩时会依次放入文件,如果某个文件放入后压缩包大小超过10MB,则会跳过这个文件。

参数类型说明
pathstring日志路径

4.5 设置用户ID

public static void SetUserId(string userId)

说明: 设置用户ID

参数类型说明
userIdstring用户ID

4.6 添加自定义日志

public static void PrintLog(CSLogSeverity level, string format, params object[] args)

说明:自定义日志,限制30KB

参数类型说明
levelCSLogSeverity日志级别
formatstring日志格式
argsparams object[]可变参数

4.7 设置自定义附件路径

public static void SetCustomAttachDir(string path)

页面查看:崩溃详情页->附件下载->CustomizedAttachFile.zip
需要上传多个附件时,请使用“|”分隔路径,一次最多传入3个文件的绝对路径,不支持传入目录。单个文件最大支持20MB,大小超过20MB的文件会自动忽略;压缩后最大支持10MB,压缩时会依次放入文件,如果某个文件放入后压缩包大小超过10MB,则会跳过这个文件。

参数类型说明
pathstring附件路径