Bugfender 是一个收集移动应用程序日志的云服务。开发者可以程序化地以及手动地为每台设备控制日志发送。日志可在 Bugfender 控制台 中找到。您需要一个账户。
支持的 iOS 版本
- BugfenderSDK 1.12 可用于 iOS 11.0 及以上版本。
- 如需要支持 iOS 10,您可以使用 BugfenderSDK 1.10.6。
- 如需要支持 iOS 8,您可以使用 BugfenderSDK 1.8。
安装 SDK
首先,您需要将框架添加到您的项目中。
使用 CocoaPods
- 如果没有,创建一个 Podfile:
pod init
- 将 Bugfender 添加到 Podfile 中
pod 'BugfenderSDK', '~> 1.12'
- 保存文件并运行:
pod install
。这将为您的应用创建一个.xcworkspace
文件。请使用此文件进行所有未来的应用开发。
使用 Swift 包管理器
- 将 Bugfender iOS 存储库的 GitHub URL(
https://github.com/bugfender/BugfenderSDK-iOS
)粘贴到文本字段,然后按下一个
- 保留第一个选项,然后按
下一个
- Xcode 将下载 Bugfender 文件,并将显示以下菜单。确保选择 BugfenderSDK 并按完成
- 还需要导入《系统配置框架》、《安全性框架》、《核心服务框架》、《核心图形框架》和《libc++.tbd》。
在 Xcode12 中存在一个已知问题,即当调试物理设备时无法启动应用程序。在本文档编写时,该问题尚未在 Xcode12.3 测试版中修复。该问题不应影响发布或模拟器版本。但如果您收到《未找到代码签名》或《未找到有效的配置文件》提示,我们建议使用PSPDFKit 团队提出的解决方案。
使用 Carthage
- 至少更新到 Carthage 0.38.0
- 将其添加到 Cartfile 中
github "bugfender/BugfenderSDK-iOS" ~>1.12
- 保存文件并运行
carthage update --use-xcframeworks
- 将
Carthage/Build/BugfenderSDK.xcframework
导入到您的链接框架和库
(或拖放到项目中)。 - 请确保选择“嵌入框架”选项(或将框架列入
input.xcfilelist
列表中)。 - 还需要导入《系统配置框架》、《安全性框架》、《核心服务框架》、《核心图形框架》和《libc++.tbd》。
用户手册
如果您更喜欢手动安装SDK,您可以使用提供的 xcframework,请在对应的 版本 中使用。
- 转到您的 项目 > 您的目标 > 通用 > 框架、库和嵌入式内容,并将
BugfenderSDK.xcframework
拖到那里。 - 确保选择“嵌入框架”选项。
- 请确保您还有
SystemConfiguration.framework
、Security.framework
、CoreServices.framework
、CoreGraphics.framework
和libc++.tbd
。
对崩溃报告进行符号化
Bugfender提供了一个可以将dSYM捆绑包上传到Bugfender的脚本。
获取脚本
如果您使用CocoaPods,从版本1.10.4开始,脚本已与Pod一起分发。
如果您使用任何其他安装方法,您可以从 此处 下载脚本,并将其复制到项目中的一部分位置。
设置Xcode以自动上传dSYM捆绑包
为此,我们需要在构建阶段创建一个新的运行脚本来执行以下步骤
- 转到您的应用程序设置。
- 从左侧的《目标》列表中选择您的主要目标。
- 转到《构建阶段》标签。
- 在加号
+
下打开菜单,并选择《新建运行脚本阶段》。 - 在《运行脚本》的shell部分下添加脚本调用。
- 如果您正在使用CocoaPods
${PODS_ROOT}/BugfenderSDK/upload-symbols.sh <bugfender_symbolication_token>
- 如果您手动复制了脚本
<path_to_the_script>/upload-symbols.sh <bugfender_symbolication_token>
- 如果您正在使用CocoaPods
- 可以从Bugfender仪表板中获得《bugfender符号化令牌》并需要将其指定为脚本的第一个参数或将
BUGFENDER_SYMBOLICATION_TOKEN
环境变量。 - 完成!
使用Bugfender
一旦在项目中有了这个框架,使用它就像使用BFLog()
代替NSLog()
或使用bfprint()
代替print()
一样简单。
Swift
如果您的应用程序使用SwiftUI且没有AppDelegate,您可能需要创建一个,如下所示
@main
struct YourAppNameApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
// your Bugfender init code here
return true
}
}
在您的AppDelegate类中
@_exported import BugfenderSDK
并将以下内容添加到application(_:didFinishLaunchingWithOptions:)
Bugfender.activateLogger("YOUR_APP_KEY")
Bugfender.enableUIEventLogging() // optional, log user interactions automatically
Bugfender.enableCrashReporting() // optional, log crashes automatically
bfprint("Hello world!") // use bfprint() as you would use print()
然后您可以使用BFLog
就像您通常使用NSLog
或print
一样。
您还可以使用以下辅助函数来指定日志级别
Bugfender.print(...)
:默认日志。Bugfender.warning(...)
:警告日志。Bugfender.error(...)
:错误日志。
Objective-C
通过将以下行添加到.pch
文件来使Bugfender在项目中可用
#import <BugfenderSDK/BugfenderSDK.h>
从Bugfender控制台获取API密钥。在您的AppDelegate
中,在应用程序启动时调用activateLogger,如下所示
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
// Activate the remote logger with an App Key.
[Bugfender activateLogger:@"YOUR_APP_KEY"];
[Bugfender enableUIEventLogging]; // optional, log user interactions automatically
[Bugfender enableCrashReporting]; // optional, log crashes automatically
BFLog("Hello world!") // use BFLog as you would use NSLog
...
}
然后您可以使用BFLog
正如您通常使用NSLog
一样。
您还可以使用以下宏来指定日志级别
BFLog(...)
:默认日志。BFLogWarn(...)
:警告日志。BFLogErr(...)
:错误日志。
高级功能
发送问题
Bugfender 允许您将问题发送到服务器。问题与会话类似,但它们显示在“问题”部分,并且您可以从应用中随时发送问题,即使设备在系统中未启用。问题非常有用,可以帮助您跟踪在代码中检测到的关键错误。
发送问题的函数如下:
Bugfender.sendIssueReturningUrl(withTitle: "Issue title", text: "Description of the issue")
请注意,text
在服务器上支持 Markdown 语法。您可以为文本添加一些样式。
Bugfender.sendIssueReturningUrl(withTitle: "App Error", text: "We have found an **Error**, we need to check it")
发送问题返回指向 Bugfender 控制面板中问题的 URL。您可以使用该 URL 来创建自动化。
让您的应用决定何时发送日志
在某些特殊情况下,您可能希望在 Bugfender 控制台中设备启用状态为未启用时发送日志,例如在自定义异常处理程序中。使用 forceSendOnce
强制发送日志一次,使用 setForceEnabled:
强制它在一段时间内发送。
设备关联数据
您可以将信息关联到设备,就像字典一样。
Bugfender.setDeviceString("value", forKey: "key")
更多信息请参考我们的博客文章关联设备信息。
日志缓冲区大小
Bugfender 在设备中保留最多 5 MB 的日志数据。这样 Bugfender 可以离线工作,您可以在启用设备时获取一些过去的日志数据。您可以使用 setMaximumLocalStorageSize
修改此限制。
// Setting maximum cache size to 1 Mb
Bugfender.setMaximumLocalStorageSize(1024*1024)
获取设备链接
有时您想将 Bugfender 与第三方工具集成。为此,SDK 提供了一个方法,返回当前设备的 URL。您可以将它发送到第三方工具,并从其他工具轻松导航回设备的日志。
Bugfender.deviceIdentifierUrl();
获取会话链接
有时您想将 Bugfender 与第三方工具集成。为此,SDK 提供了一个方法,返回会话的 URL。您可以将它发送到第三方工具,以从其他工具轻松导航到当前会话的日志。
Bugfender.sessionIdentifierUrl();
收集用户反馈
从最终用户那里获取反馈是应用开发者最重要的任务之一。良好的用户反馈可以帮助您检测应用中的错误,并帮助您更好地了解您的产品。
从版本1.6开始,Bugfender提供了一项新功能,可以轻松收集最终用户的反馈。集成过程仅需两分钟和几行代码。您可以认为用户反馈是问题的一种特殊类型,每当您的用户提交反馈时,您就会在Bugfender中收到一个新的问题。
实现Bugfender用户反馈的最简单方法是使用可定制的用户反馈视图控制器。它提供了一个方便的视图控制器,包含两个文本字段,一个用于主题,另一个用于反馈,更大。两个文本字段都会自动增长。
使用默认UI
使用Bugfender提供的便捷UI,只需创建一个新的视图控制器并将其以模态方式呈现。您只需要调用以下方法,并使用您的UI的标题和占位符来完成所需的参数。
// Instantiate new User Feedback
let nvc = Bugfender.userFeedbackViewController(withTitle: "Navigation bar title",
hint: "Give some instructions to your users",
subjectPlaceholder: "Placeholder for subject textfield",
messagePlaceholder: "Placeholder for message textfield",
sendButtonTitle: "Send",
cancelButtonTitle: "Cancel") { (feedbackSent, url) in
if (feedbackSent) {
// Say thanks!
// url is a direct link to the dashboard
// Use it to create automations or send it to your server
} else {
// User decided to not send feedback
}
}
// Present modally
self.present(nvc, animated: true, completion: nil)
此外,如果需要更多自定义,您可以在呈现之前配置视图控制器。
请注意,BFUserFeedbackNavigationController是导航控制器的子类。您需要通过公开属性feedbackViewController来访问视图控制器。
// Access the root view controller.
let feedbackViewController: BFUserFeedbackViewController = nvc.feedbackViewController
// Change the background colors
feedbackViewController.mainBackgroundColor = UIColor.lightGray
feedbackViewController.secondaryBackgroundColor = UIColor.white
// Change the font of the hint text
feedbackViewController.hintFont = UIFont(name: "Avenir", size: 14)!
有关可自定义属性的完整列表,您可以检查"BFUserFeedbackViewController.h"或阅读文档。
使用自定义UI
如果您需要比BFUserFeedbackViewController提供的更多自定义,您可以自己实现UI。您需要做到的是以您希望的方式收集用户反馈,并使用sendUserFeedback
将其发送到Bugfender。
let feedbackUrl = Bugfender.sendUserFeedbackReturningUrl(withSubject: "Title of the feedback", message: "message of the feedback")
返回的URL是Bugfender仪表板的直接链接。您可以使用它来创建自动化或将其保留在您的服务器上。
从1.8之前的BugfenderSDK更新以及仅为ObjC项目的更新
现在BugfenderSDK是一个动态框架,您需要手动将其添加到项目时选中“嵌入框架”选项,或使用Carthage。
此外,不再需要 Bugfender.swift 辅助类,可以安全地删除它。但必须确保你的项目中可以使用 Swift。如果你是手动安装 Bugfender 或使用 Carthage,请确保在 构建设置 -> 始终嵌入 Swift 标准库中设置为 是。