适用于 iOS 的 Bugfender SDK Docs

Bugfender 是一种云服务,用于收集移动应用程序日志。开发人员可以对每个设备以编程方式和手动控制日志发送。日志可在 Bugfender 仪表板上查看。您需要一个帐户。

支持的 iOS 版本

安装 SDK

首先,您需要将框架添加到您的项目中。

使用 Swift Package Manager

  1. 在 Xcode 中,转到目标的 General 选项卡,然后单击图标以添加新库

  2. 在弹出窗口中,选择 Add Other,然后选择 Add Package Dependency...

  3. 将 Bugfender iOS 仓库的 GitHub URL https://github.com/bugfender/BugfenderSDK-iOS 粘贴到文本字段中,然后单击 Next

  4. 保持第一个选项选中状态,然后单击 Next

  5. Xcode 将下载 Bugfender 文件,然后您将看到以下菜单。确保已选择 BugfenderSDK,然后单击 Finish

  6. 同时导入 SystemConfiguration.frameworkSecurity.frameworkCoreServices.frameworkCoreGraphics.frameworklibc++.tbd

使用 CocoaPods

  1. 如果还没有 Podfile,请创建一个:pod init
  2. 将 Bugfender 添加到您的 Podfile
    pod 'BugfenderSDK', '~> 2.0'
    
  3. 保存文件并运行:pod install。这将为您的应用创建一个 .xcworkspace 文件。在您的应用程序的所有未来开发中使用此文件。

注意:我们建议使用 SwiftPM 而不是 CocoaPods,因为 CocoaPods 处于维护模式

使用 Carthage

  1. 更新到至少 Carthage 0.38.0
  2. 添加到您的 Cartfile
    github "bugfender/BugfenderSDK-iOS" ~>2.0
    
  3. 保存文件并运行 carthage update --use-xcframeworks
  4. Carthage/Build/BugfenderSDK.xcframework 导入到您的 Linked Frameworks and Libraries(或将文件拖放到您的项目中)。
  5. 确保选择“Embed framework”选项(或在 input.xcfilelist 中列出该框架)。
  6. 同时导入 SystemConfiguration.frameworkSecurity.frameworkCoreServices.frameworkCoreGraphics.frameworklibc++.tbd

注意:我们建议使用 SwiftPM 而不是 Carthage。

手动

如果您更喜欢手动安装 SDK,可以使用相应版本中提供的 xcframework。

  1. 转到您的 Project > Your Target > General > Frameworks, Libraries, and Embedded Content,然后将 BugfenderSDK.xcframework 拖到那里。
  2. 确保选择“Embed framework”选项
  3. 确保您也拥有 SystemConfiguration.frameworkSecurity.frameworkCoreServices.frameworkCoreGraphics.frameworklibc++.tbd

使用 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.enableNSLogLogging() // optional, capture logs printed to console automatically
Bugfender.enableUIEventLogging() // optional, log user interactions automatically
Bugfender.enableCrashReporting() // optional, log crashes automatically
bfprint("Hello world!") // use bfprint() as you would use print()

然后,您可以像通常使用 NSLogprint 一样使用 BFLog

您可能还想通过使用以下辅助函数来指定日志级别

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 enableNSLogLogging]; // optional, capture logs printed to console automatically
    [Bugfender enableUIEventLogging]; // optional, log user interactions automatically
    [Bugfender enableCrashReporting]; // optional, log crashes automatically
    BFLog("Hello world!") // use BFLog as you would use NSLog
    ...
}

您可以像通常使用 NSLog 一样使用 BFLog

您可能还想通过使用以下宏来指定日志级别

高级功能

发送问题

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”或阅读文档

使用 SwiftUI

这是一个在 SwiftUI 中使用 BFUserFeedbackNavigationController 的示例

struct SwiftUIView: View {
    @State private var showFeedbackScreen = false

    var body: some View {
        VStack {
            Text("Hello World!")
            Button("Show Feedback screen") {
                showFeedbackScreen = true
            }
        }.sheet(isPresented: $showFeedbackScreen) {
            FeedbackView() { sent, feedbackUrl in
                if sent == true,
                    let url = feedbackUrl{
                    BFLog("Sent feedback to URL: \(url.absoluteString)")
                } else {
                    BFLog("User rejected to send feedback")
                }
            }
        }.navigationBarTitle(Text("Swift UI Test"))
    }
}

struct SwiftUIView_Previews: PreviewProvider {
    static var previews: some View {
        SwiftUIView()
    }
}

struct FeedbackView: UIViewControllerRepresentable {
    typealias UIViewControllerType = BFUserFeedbackNavigationController

    let completion: (_ feedbackSent: Bool, _ feedbackUrl: URL?) -> Void

    func makeUIViewController(context: Context) -> BFUserFeedbackNavigationController {
        BFUserFeedbackNavigationController.userFeedbackViewController(
            withTitle: "This title",
            hint: "This hint",
            subjectPlaceholder: "This subject",
            messagePlaceholder: "This message",
            sendButtonTitle: "Send",
            cancelButtonTitle: "Cancel") { sent, feedbackUrl in
                completion(sent, feedbackUrl)
            }
    }

    func updateUIViewController(_ uiViewController: BFUserFeedbackNavigationController, context: Context) {}
}

使用自定义 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 将其添加到您的项目时选中“embed framework”选项。
此外,不再需要 Bugfender.swift 辅助类,可以安全地删除它,但是,Swift 必须在您的项目中可用。如果您手动安装 Bugfender 或使用 Carthage,请确保Build Settings -> Always Embed Swift Standard Libraries设置为YES

符号化崩溃报告

Bugfender 提供了一个脚本,用于将 dSYM 包上传到 Bugfender

获取脚本

如果您使用的是 Cocoapods 或 Swift Package Manager,则会分发该脚本。

如果您使用的是任何其他安装方法,您可以下载脚本并将其复制到项目中的某个位置。

设置 Xcode 以自动上传 dSYM 包

使用以下说明来配置您的项目。