TestFlight SDK 允许您跟踪测试人员如何测试您的应用程序。默认情况下,我们跟踪简单的使用信息,例如,哪个测试人员在使用您的应用程序,他们的设备型号/操作系统,他们使用应用程序的时间长度,以及任何遇到的崩溃的自动记录。
如果将 SDK 传递给 TestFlight,SDK 可以跟踪更多信息。检查点 API 用于帮助您跟踪测试人员如何使用您的应用程序。想知道哪些用户在您的游戏中过了第 5 关,或者在 Twitter 上发布了他们的高分,或者发现了那个隐藏的功能吗?请参阅下方的 “检查点 API” 看看如何。
SDK 还提供远程日志解决方案。在“远程日志”部分了解更多关于我们日志系统的信息。
TestFlight SDK 需要 iOS 4.3 或更高版本,Apple LLVM 编译器和 libz 库才能运行。
将文件添加到您的项目中:文件 -> 将文件添加到 "
验证是否已将 libTestFlight.a 添加到目标构建阶段的“链接到二进制文件”中,以使用 SDK
将 libz 添加到“链接到二进制文件”构建阶段
获取您的 App 令牌
如果这是一个新应用,并且您之前尚未将其上传到 TestFlight,请首先在这里注册:[https://testflightapp.com/dashboard/applications/create/](https://testflightapp.com/dashboard/applications/create/)。
否则,如果您之前已将应用程序上传到 TestFlight,请转到您的应用程序列表([http://testflightapp.com/dashboard/applications/](http://testflightapp.com/dashboard/applications/)),并从列表中选择您正在使用的应用程序。
在左侧单击“App 令牌”标签。该应用程序的 App 令牌将显示在这里。
在您的应用程序代理中
导入 TestFlight: #import "TestFlight.h"
使用您的 App 令牌启动 TestFlight
在您的 -application:didFinishLaunchingWithOptions:
方法中调用 +[TestFlight takeOff:]
并传入您的 App Token。
-(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// start of your application:didFinishLaunchingWithOptions
[TestFlight takeOff:@"Insert your Application Token here"];
// The rest of your application:didFinishLaunchingWithOptions method
// ...
}
为了向您报告崩溃,我们安装自己的未捕获异常处理器。如果您尚未使用自定义的异常处理器,只需进入下一步。如果您当前使用的是异常处理器或使用其他框架,请转到高级异常处理部分。
将 SDK 集成到应用程序后,您需要将您的构建上传到 TestFlight。您可以在我们的 网站 上上传构建,使用我们的 桌面应用程序,或使用我们的 上传 API。
查看用户使用您的应用频率、使用时长以及使用时间。您可以查看用户所使用的设备类型、操作系统、语言等信息。
会话在应用变得活跃时自动开始,在应用退出活跃状态时结束。结束时不久开始的新会话将延续会话而不是开启一个新会话。
注意:调用 takeOff:
时不会启动会话,takeOff:
会注册回调以在应用活跃时启动会话。
对于 beta 用户,如果他们拥有 TestFlight 账户并且其设备已在 TestFlight 中注册,您可以查看用户信息。
TestFlight SDK 会自动将所有崩溃(beta 和 prod)报告到 TestFlight 的网站,您可以在该网站上查看它们。崩溃报告会在崩溃时发送。TestFlight 还会自动对所有崩溃进行符号化(如果已上传您的 dSYM)。对于 beta 应用,在网站上,您可以查看用户在崩溃前通过哪些检查点以及发送到远程的崩溃前日志。
如果用户正在使用您的应用的 beta 版本并且有安装权限;应用内部会出现弹窗询问他们是否想安装更新。如果他们点击“安装”,则新版本将在应用内部安装。
注意:为了实现这一点,您必须在上传之前增加构建版本。否则,新旧构建将具有相同的版本号,我们无法知道用户是否需要更新或已经使用新版本。
要关闭此功能,请在调用 takeOff:
之前设置此选项。
[TestFlight setOptions:@{ TFOptionDisableInAppUpdates : @YES }];
当测试者在您的应用中执行您关心的事情时,您可以传递一个检查点。例如完成一个关卡、添加待办事项等。检查点进度用于深入了解测试者如何测试您的应用。通过检查点还附加到崩溃中,有助于在创建复现步骤时使用。检查点对所有 beta 构建 visible。
[TestFlight passCheckpoint:@"CHECKPOINT_NAME"];
使用 passCheckpoint:
记录用户在应用程序中执行特定任务的时间。这有助于确保测试者触及了应用程序的所有部分,也可以追踪哪些测试者非常彻底。
检查点用于告知您用户是否访问了您的应用程序中某个位置或完成了某个任务。检查点不应用于调试目的。相反,使用远程日志记录调试信息(更多信息见下文)。
注意:检查点仅在BETA测试阶段进行记录。
在beta版本中,如果您想查看有关用户的额外信息,可以在会话开始前添加自定义环境信息(会话开始于takeOff:
)。要在TestFlight网站上查看这些信息,请注意:您只能查看<强烈的beta用户的此信息。
[TestFlight addCustomEnvironmentInformation:@"info" forKey:@"key"];
您可以根据需要调用此方法多次以添加更多信息。
在beta版本中,如果您收集用户反馈,您可以将其返回给TestFlight,与用户的当前会话关联。
[TestFlight submitFeedback:feedback];
一旦用户在应用程序内提交了反馈,您可以在构建页面上的反馈区域查看该反馈。
远程日志允许您在TestFlight网站上查看应用程序远程打印的日志。您可以查看<强烈的beta会话的日志。
要使用它,只需将所有的NSLog
调用替换为TFLog
调用。一种替换所有NSLog
调用而无需重写的方法是,将以下宏添加到您的.pch
文件中。
#import "TestFlight.h"
#define NSLog TFLog
TFLog
不仅可以在远程记录到TestFlight,还可以像NSLog一样记录到控制台(可在设备日志中查看)和STDERR(在调试期间显示),提供完整的替代。
为了在远程日志中获得更好的信息,例如文件名和行号,可以使用此宏代替
#define NSLog(__FORMAT__, ...) TFLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
这将产生类似以下的输出
-[MyAppDelegate application:didFinishLaunchingWithOptions:] [Line 45] Launched!
注意:日志仅在会话期间记录。
自定义日志
如果您有自己的自定义日志,请在您的自定义日志函数中调用TFLog
。如果您无需使用TFLog
记录到控制台或STDERR,因为您自己处理这些,则可以使用以下调用将其关闭
[TestFlight setOptions:@{ TFOptionLogToConsole : @NO }];
[TestFlight setOptions:@{ TFOptionLogToSTDERR : @NO }];
在传递检查点时,TestFlight会同步记录检查点(更多信息请参阅远程日志)。如果您的应用程序有非常高的性能需求,可以使用TFOptionLogOnCheckpoint
选项关闭记录。
所有记录都是同步进行的。每次SDK记录时,都必须将数据写入文件。这是为了确保崩溃时日志的完整性。如果没有这个,我们无法信任崩溃时间的日志。如果您有一个高性能的应用程序,请通过电子邮件[email protected]获取更多选项。
继续会话:您可以通过更改TFOptionSessionKeepAliveTimeout
选项来调整用户离开发应用程序的时间以及他们回来后仍能继续同一会话的时间。将其更改为0以关闭此功能。
手动会话控制:如果您应用程序是一个在后台持续播放音乐的音乐播放器,一个在后台持续运行导航应用,或任何用户即使在应用未.activity时也被认为是“使用”该应用的场景,您应使用手动会话控制。请仅在您确切了解自己在做什么的情况下使用手动会话控制。有许多陷阱可能导致会话时长和计数不佳。有关更多信息和建议,请参阅TestFlight+ManualSessions.h
。
未捕获的异常表示您的应用程序处于未知状态,您除了尝试优雅退出外,几乎没有别的方法。我们的SDK会尽力在应用程序崩溃时将其收集到的数据传给您,但它被设计得尽可能在尝试发送任何内容之前以尽可能安全的方式保存数据。如果您确实使用了未捕获的异常或信号处理器,请在调用takeOff:
之前安装您的处理器。我们的SDK将在我们的SDK运行期间调用您的处理器。例如:
/*
My Apps Custom uncaught exception catcher, we do special stuff here, and TestFlight takes care of the rest
*/
void HandleExceptions(NSException *exception) {
NSLog(@"This is where we save the application data during a exception");
// Save application data on crash
}
/*
My Apps Custom signal catcher, we do special stuff here, and TestFlight takes care of the rest
*/
void SignalHandler(int sig) {
NSLog(@"This is where we save the application data during a signal");
// Save application data on crash
}
-(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// installs HandleExceptions as the Uncaught Exception Handler
NSSetUncaughtExceptionHandler(&HandleExceptions);
// create the signal action structure
struct sigaction newSignalAction;
// initialize the signal action structure
memset(&newSignalAction, 0, sizeof(newSignalAction));
// set SignalHandler as the handler in the signal action structure
newSignalAction.sa_handler = &SignalHandler;
// set SignalHandler as the handlers for SIGABRT, SIGILL and SIGBUS
sigaction(SIGABRT, &newSignalAction, NULL);
sigaction(SIGILL, &newSignalAction, NULL);
sigaction(SIGBUS, &newSignalAction, NULL);
// Call takeOff after install your own unhandled exception and signal handlers
[TestFlight takeOff:@"Insert your Application Token here"];
// continue with your application initialization
}
如果您应用程序尚未使用异常处理,则无需添加上面的代码。