☰
HockeySDK-iOS 5.1.2 集成实战:崩溃上报、用户指标与版本更新全配置指南
2026/10/15 15:29:37 网站建设 项目流程
  • 开发工具

【免费下载链接】Dash-iOS

Dash for iOS was discontinued. Please check out Dash for macOS instead.

项目地址:https://gitcode.com/gh_mirrors/da/Dash-iOS
点击查看免费下载

本文以 Dash-iOS 仓库中实际使用的 HockeySDK-iOS(版本 5.1.2)官方 README 为骨架,完整讲解该 SDK 的二进制与 CocoaPods/Carthage 集成方式、崩溃上报(BITCrashManager)、用户指标(BITMetricsManager)、应用内更新(BITUpdateManager)、App Store 更新通知(BITStoreUpdateManager)与反馈(BITFeedbackManager)等全部模块的配置与调优。读者读完本文,可以独立完成 HockeySDK 在 iOS 应用中的接入、按需裁剪功能集,并结合仓库源码理解每个配置项的真实行为与默认值。

一、SDK 概览与版本说明

HockeySDK-iOS 是 HockeyApp 官方提供的 iOS 端 SDK,通过 BITHockeyManager 单例统一管理全部子模块。本仓库内置的是5.1.2版本,其embeddedframework结构与官方二进制发行包一致,位于 Pods/HockeySDK/HockeySDK-iOS 目录。

支持的功能

  1. 崩溃上报(Crash Reporting):App 崩溃时,以与 Apple Crash Reporter 相同格式的崩溃日志写入设备存储;用户下次启动 App 时被询问是否上报到 HockeyApp。对 Beta 版和 App Store 上线版(live)均生效。
  2. 用户指标(User Metrics):统计日活/月活用户、崩溃影响用户、会话数,并支持Custom Events(自定义事件),可在 HockeyApp 门户查看聚合结果。
  3. Ad-Hoc / Enterprise 应用内更新:自动检查新版本,弹出警告视图展示发布说明、版本历史并立即触发安装。
  4. App Store 更新通知:检测到 App Store 新版本时提示用户打开 App Store 更新(默认关闭)。
  5. 反馈(Feedback):在应用内收集用户反馈并与用户直接沟通(4.1.1 起从默认版本移除,需使用全功能版)。
  6. 认证(Authenticate):识别并认证 Ad-Hoc / Enterprise 构建的用户身份。

环境要求

  • 已存在 Xcode 项目,且使用Xcode 8 或更高版本打开。
  • SDK 支持iOS 8.0 及以上系统。

需要说明:本仓库当前使用的 Pods 集成方式声明在 Podfile(见下文“Dash-iOS 中的实际集成”),锁定版本 5.1.2 可参见 Podfile.lock。

二、重要前提:Feedback 与 iOS 10 的兼容性

从4.1.1 及以后版本开始,HockeySDK 的默认版本中移除了 Feedback 功能。原因在于 iOS 10 要求开发者在使用相册(Photos)框架时必须在Info.plist中声明用途字符串,否则提交审核会被拒绝;而 HockeyApp 的 Feedback 功能依赖 Photos 框架,导致即使不使用反馈功能的开发者也被迫添加该声明。

因此:

  • 不使用 Feedback:直接升级到 4.1.1 或更新版本即可,无需任何额外声明。
  • 使用 Feedback:必须集成全功能版 SDK,并向Info.plist添加NSPhotoLibraryUsageDescription(详见“反馈模块”一节)。
  • 旧版本用户:必须手动添加NSPhotoLibraryUsageDescription,否则用户点击"attach image"按钮,或开启了BITFeedbackObservationModeOnScreenshot(截图观察模式)时,App 会在运行时崩溃;即便不崩溃,上传时也可能被 App Store 拒绝。

三、快速开始:二进制集成

官方推荐将二进制框架直接拖入 Xcode 项目,步骤如下。

3.1 获取 App Identifier

在 HockeyApp 后台创建应用后,会得到一个 HockeyApp 专属的App Identifier,用于初始化 SDK。

3.2 下载并解压 SDK

从 HockeyApp 官网下载最新版HockeySDK-iOS的 zip 压缩包,解压后会得到HockeySDK-iOS文件夹(官方建议不要使用第三方解压工具)。压缩包内提供四种形态:

形态目录说明
默认 SDK(无反馈)HockeySDK.embeddedframework推荐默认选择
全功能 SDK(含反馈)HockeySDKAllFeatures/HockeySDK.embeddedframework需要 Feedback 时使用
仅崩溃上报HockeySDKCrashOnly/HockeySDK.framework只包含崩溃上报
仅崩溃上报(扩展专用)HockeySDKCrashOnlyExtension/HockeySDK.framework扩展(Extension)必须使用

本仓库内置的就是默认形态HockeySDK.embeddedframework(含HockeySDK.framework与HockeySDKResources.bundle),路径见 Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework。

3.3 拷贝到项目目录

在项目根目录下创建Vendor子目录(第三方库惯例存放处),将解压后的HockeySDK-iOS文件夹整体移入。

3.4 在 Xcode 中添加 SDK

  1. 确认Project Navigator可见(⌘+1)。
  2. 将HockeySDK.embeddedframework从 Finder 拖入 Xcode 的Vendorgroup。
  3. 在弹出的覆盖层中选择Create groups,勾选目标 target,点击Finish。

注意:使用二进制集成时,务必确保HockeySDK.embeddedframework内的HockeySDKResources.bundle已被加入应用(它包含各语言的翻译字符串与 UI 素材,详见 HockeySDKResources.bundle 下的多语言HockeySDK.strings)。

3.5 修改启动代码

Objective-C:打开AppDelegate.m,在 import 区添加@import HockeySDK;,然后在application:didFinishLaunchingWithOptions:中:

[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"APP_IDENTIFIER"]; // 需要的话在此追加其他配置 [[BITHockeyManager sharedHockeyManager] startManager]; [[BITHockeyManager sharedHockeyManager].authenticator authenticateInstallation]; // 仅崩溃上报构建中此行无效

Swift:打开AppDelegate.swift,添加import HockeySDK,在didFinishLaunchingWithOptions中:

BITHockeyManager.shared().configure(withIdentifier: "APP_IDENTIFIER") BITHockeyManager.shared().start() BITHockeyManager.shared().authenticator.authenticateInstallation() // 仅崩溃上报构建中此行无效

启动性能设计:SDK 将所有可延迟的工作尽量推迟,同时确保启动阶段发生的崩溃也能被捕获;各模块以延迟数秒的方式执行其余代码。这样applicationDidFinishLaunching能尽快处理完成,SDK 不会阻塞启动序列,从而避免被 iOS watchdog 进程杀掉。相关说明同样记录在 BITHockeyManager.h 的类注释中。

四、高级集成方式

4.1 手动链接系统框架

对于不支持 clang modules 的旧项目,或关闭了Enable Modules (C and Objective-C)与Link Frameworks Automatically的项目,需要在 target 的Build Phases → Link Binary With Libraries中手动添加框架:

  • 默认 SDK:CoreText、CoreGraphics、Foundation、MobileCoreServices、QuartzCore、QuickLook、Security、SystemConfiguration、UIKit、libc++、libz
  • 全功能 SDK(含反馈):在上面的基础上额外添加Photos(即CoreText、CoreGraphics、Foundation、MobileCoreServices、QuartzCore、QuickLook、Photos、Security、SystemConfiguration、UIKit、libc++、libz)
  • 仅崩溃上报:Foundation、Security、SystemConfiguration、UIKit、libc++
  • 仅崩溃上报(扩展):Foundation、Security、SystemConfiguration、libc++

不使用 clang modules 时,无法使用@import HockeySDK;语法,必须改用#import <HockeySDK/HockeySDK.h>。

4.2 CocoaPods

在Podfile中声明:

platform :ios, '8.0' pod "HockeySDK"
4.2.1 二进制发行选项
  • 默认配置(除 Feedback 外全部功能):
platform :ios, '8.0' pod "HockeySDK"
  • 全功能(含 Feedback):
pod "HockeySDK", :subspecs => ['AllFeaturesLib']
  • 仅崩溃上报:
pod "HockeySDK", :subspecs => ['CrashOnlyLib']
  • 仅崩溃上报(扩展专用):
pod "HockeySDK", :subspecs => ['CrashOnlyExtensionsLib']
4.2.2 源码集成选项

如果希望自行修改或裁剪功能集,可以以源码方式集成:

pod "HockeySDK-Source"

4.3 Carthage

在Cartfile中添加:

github "bitstadium/HockeySDK-iOS"

默认构建的是全功能 SDK,因此必须添加NSPhotoLibraryUsageDescription并阅读反馈模块说明。如需其他形态,指定 Release configuration 构建:

  • 无 Feedback 版本:carthage build --platform iOS --configuration ReleaseDefault HockeySDK-iOS
  • 仅崩溃上报:carthage build --platform iOS --configuration ReleaseCrashOnly HockeySDK-iOS
  • 仅崩溃上报扩展:carthage build --platform iOS --configuration ReleaseCrashOnlyExtension HockeySDK-iOS

4.4 功能裁剪的底层机制

CocoaPods 各 subspec 的本质是编译期功能开关。仓库中的 HockeySDKFeatureConfig.h 定义了 6 个宏:

宏默认值含义
HOCKEYSDK_FEATURE_CRASH_REPORTER1崩溃上报
HOCKEYSDK_FEATURE_FEEDBACK0用户反馈(默认关闭)
HOCKEYSDK_FEATURE_STORE_UPDATES1App Store 更新通知
HOCKEYSDK_FEATURE_AUTHENTICATOR1安装认证
HOCKEYSDK_FEATURE_UPDATES1Beta/Enterprise 应用内更新
HOCKEYSDK_FEATURE_METRICS1用户指标收集

BITHockeyManager的所有模块属性(crashManager、updateManager、storeUpdateManager、feedbackManager、authenticator、metricsManager)均以这些宏条件编译,见 BITHockeyManager.h。这解释了为什么“仅崩溃上报”构建里authenticator调用是无效的。

五、iOS 扩展与 WatchKit 集成

5.1 iOS Extensions

  1. 若 App 与扩展共用同一个APP_IDENTIFIER,扩展的版本号(CFBundleShortVersionString)与构建号(CFBundleVersion)必须与主 App 一致。
  2. 扩展没有applicationDidFinishLaunching:等价物,且viewDidLoad可能多次执行,必须保证 SDK 只初始化一次:

Objective-C

static BOOL didSetupHockeySDK = NO; @interface TodayViewController () <NCWidgetProviding> @end @implementation TodayViewController + (void)viewDidLoad { [super viewDidLoad]; if (!didSetupHockeySDK) { [[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"APP_IDENTIFIER"]; [[BITHockeyManager sharedHockeyManager] startManager]; didSetupHockeySDK = YES; } }

Swift

class TodayViewController: UIViewController, NCWidgetProviding { static var didSetupHockeySDK = false; override func viewDidLoad() { super.viewDidLoad() if !TodayViewController.didSetupHockeySDK { BITHockeyManager.shared().configure(withIdentifier: "APP_IDENTIFIER") BITHockeyManager.shared().start() TodayViewController.didSetupHockeySDK = true } } }
  1. 二进制发行包HockeySDKCrashOnly/HockeySDKCrashOnlyExtension目录提供仅崩溃上报(且自动发送)的专用构建,扩展应使用该形态。

5.2 WatchKit 1 Extensions

WatchKit 扩展使用WKInterfaceController而非UIViewController,生命周期不同。建议用辅助类保证 SDK 只实例化一次:

Objective-C

#import "BITWatchSDKSetup.h" @import HockeySDK static BOOL hockeySDKIsSetup = NO; @implementation BITWatchSDKSetup + (void)setupHockeySDKIfNeeded { if (!hockeySDKIsSetup) { [[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"APP_IDENTIFIER"]; [[BITHockeyManager sharedHockeyManager] startManager]; hockeySDKIsSetup = YES; } } @end

Swift

import HockeySDK class BITWatchSDKSetup { static var hockeySDKIsSetup = false; static func setupHockeySDKIfNeeded() { if !BITWatchSDKSetup.hockeySDKIsSetup { BITHockeyManager.shared().configure(withIdentifier: "APP_IDENTIFIER") BITHockeyManager.shared().start() BITWatchSDKSetup.hockeySDKIsSetup = true; } } }

然后在每个需要用到 HockeySDK 的WKInterfaceController中调用[BITWatchSDKSetup setupHockeySDKIfNeeded](Swift 为BITWatchSDKSetup.setupHockeySDKIfNeeded()),放在awakeWithContext:/awake(withContext:)中即可。

六、崩溃上报深度配置

崩溃上报默认开启,崩溃日志会在 App 下次启动时立即发送。底层基于 PLCrashReporter。

6.1 禁用崩溃上报

Objective-C

[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"APP_IDENTIFIER"]; [[BITHockeyManager sharedHockeyManager] setDisableCrashManager: YES]; // 关闭崩溃上报 [[BITHockeyManager sharedHockeyManager] startManager];

Swift

BITHockeyManager.shared().configure(withIdentifier: "APP_IDENTIFIER") BITHockeyManager.shared().isCrashManagerDisabled = true BITHockeyManager.shared().start()

从源码看,disableCrashManager的语义是“即使 Crash Manager 实例仍会初始化,但 signal 与 uncaught exception handler不会注册”(见 BITHockeyManager.h)。

6.2 自动发送崩溃报告

崩溃报告在下次启动时发送。crashManagerStatus取值由枚举BITCrashManagerStatus定义(见 BITCrashManager.h):

值枚举行为
0BITCrashManagerStatusDisabled崩溃上报禁用
1BITCrashManagerStatusAlwaysAsk每次发送前询问用户(默认)
2BITCrashManagerStatusAutoSend无需交互自动发送

Objective-C

[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"APP_IDENTIFIER"]; [[BITHockeyManager sharedHockeyManager].crashManager setCrashManagerStatus: BITCrashManagerStatusAutoSend]; [[BITHockeyManager sharedHockeyManager] startManager];

Swift

BITHockeyManager.shared().configure(withIdentifier: "APP_IDENTIFIER") BITHockeyManager.shared().crashManager.crashManagerStatus = BITCrashManagerStatus.autoSend BITHockeyManager.shared().start()

为什么崩溃发生时不当场发送?任何 Objective-C 代码都不是 async-safe 的,崩溃现场发送既不安全,还可能造成设备死锁等更严重问题;绝大多数用户会再次启动 App(多数人不知道发生了什么),因此启动时能收集到绝大多数报告。启动时发送采用异步(非阻塞)方式,避免网络差/连接慢时启动过久被 iOS watchdog 杀掉。

6.3 Mach 异常处理

默认使用安全且成熟的进程内 BSD Signals 捕获崩溃。enableMachExceptionHandler可切换为 Mach 异常服务器捕获致命信号。官方强烈建议不要在发布版启用 Mach 异常处理:

  • Mach 异常处理器在进程内执行,调试器尝试挂起所有活动线程时会受干扰;
  • 调试器附着时不应使用 Mach 处理;SDK 检测到调试器启动时不会启用异常捕获,但运行期再附着调试器可能引发问题。

Objective-C

[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"APP_IDENTIFIER"]; [[BITHockeyManager sharedHockeyManager].crashManager setEnableMachExceptionHandler: YES]; [[BITHockeyManager sharedHockeyManager] startManager];

Swift

BITHockeyManager.shared().configure(withIdentifier: "APP_IDENTIFIER") BITHockeyManager.shared().crashManager.isMachExceptionHandlerEnabled = true BITHockeyManager.shared().start()

6.4 为崩溃报告附加额外数据

BITHockeyManagerDelegate提供三类用户元数据回调(均为可选实现):

数据Objective-CSwift
UserID- (NSString *)userIDForHockeyManager:componentManager:optional public func userID(for hockeyManager: BITHockeyManager!, componentManager: BITHockeyBaseManager!) -> String!
UserName- (NSString *)userNameForHockeyManager:componentManager:optional public func userName(for hockeyManager: BITHockeyManager!, componentManager: BITHockeyBaseManager!) -> String!
UserEmail- (NSString *)userEmailForHockeyManager:componentManager:optional public func userEmail(for hockeyManager: BITHockeyManager!, componentManager: BITHockeyBaseManager!) -> String!

回调可以按组件区分返回值,例如只给崩溃模块返回 ID:

- (NSString *)userIDForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager { if (componentManager == hockeyManager.crashManager) { return UserIDForCrashReports; } return nil; }

BITCrashManagerDelegate(已自动包含在BITHockeyManagerDelegate中,见 BITHockeyManagerDelegate.h)还支持崩溃专属数据:

  1. 文本附加:- (NSString *)applicationLogForCrashManager:(Swift:optional public func applicationLog(for crashManager: BITCrashManager!) -> String!),典型用法是把 CocoaLumberjack 等日志框架的最后一段日志拼进崩溃报告。
  2. 二进制附件:- (BITHockeyAttachment *)attachmentForCrashManager:(Swift:optional public func attachment(for crashManager: BITCrashManager!) -> BITHockeyAttachment!),用[[BITHockeyAttachment alloc] initWithFilename:@"myfile.data" ...]构造,建议限制附件大小以避免用户流量开销。

声明并设置 delegate:

Objective-C

@interface YourAppDelegate () <BITHockeyManagerDelegate> {} @end
[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"APP_IDENTIFIER"]; [[BITHockeyManager sharedHockeyManager] setDelegate: self]; [[BITHockeyManager sharedHockeyManager] startManager];

Swift

class YourAppDelegate: BITHockeyManagerDelegate { }
BITHockeyManager.shared().configure(withIdentifier: "APP_IDENTIFIER") BITHockeyManager.shared().delegate = self BITHockeyManager.shared().start()

6.5 其他有用的崩溃配置

从 BITCrashManager.h 还可以发现:

  • enableOnDeviceSymbolication:默认NO,设备端符号化每个崩溃会耗时数秒且可能无法取到全部符号,仅在需要分析未发布 OS 版本上的崩溃时开启。
  • enableAppNotTerminatingCleanlyDetection:默认NO,实验性启发式检测(主线程长时间阻塞、启动超时、内存过大被杀死等非正常终止),可能产生误报;此类报告不含崩溃现场栈。
  • crashManagerStatus当前值以键BITCrashManagerStatus持久化在 User Defaults;若要实现用户设置开关,需同步维护该键值。
  • setCrashCallbacks:可注入崩溃信号处理阶段回调,但回调必须 async-safe,严禁在其中使用 Objective-C runtime。

七、用户指标(User Metrics)

HockeyApp 自动提供会话、用户、参与度等指标。

7.1 自动收集的行为定义

  • Sessions(会话):App 冷启动(启动前不在内存中)或从后台恢复活跃超过 20 秒时,记为一次新会话。
  • Users(用户):SDK 匿名生成随机 UUID 并安全存入 iOS keychain,用于追踪用户;iOS 10 起该匿名 ID在卸载重装后不再保留。
  • Custom Events(自定义事件):4.1.0 及以后版本支持在 App 内追踪自定义事件并在门户查看聚合。
  • 批量与离线行为:SDK 每批最多缓存 50 个事件,或等待 15 秒即持久化并发送,取先到者(会话场景下每批可能只有 1 个事件;若同时发自定义事件,则每批 = 1 个会话事件 + 至多 49 个自定义事件)。离线时最多缓存 300 个事件,超出后开始丢弃新事件。

如需随时关闭匿名用户与会话统计:

Objective-C

[BITHockeyManager sharedHockeyManager].disableMetricsManager = YES;

Swift

BITHockeyManager.shared().isMetricsManagerDisabled = true

7.2 自定义事件(Custom Events)

追踪事件前先想清楚想回答的问题(业务、性能/质量或用户体验维度),事件命名要有意义(门户中按名称搜索),且不得收集个人信息。

Objective-C

BITMetricsManager *metricsManager = [BITHockeyManager sharedHockeyManager].metricsManager; [metricsManager trackEventWithName:eventName]

Swift

let metricsManager = BITHockeyManager.shared().metricsManager metricsManager.trackEvent(withName: eventName)

限制:

  • 事件名仅接受字符[a-zA-Z0-9_. -],其他字符的事件不会出现在门户。
  • 每个 App 每周最多 300 个唯一事件名。
  • 事件发生次数无上限。

7.3 为自定义事件附加属性与测量值

可给事件附加 properties(字符串)与 measurements(数值)。注意:二者当前不会显示在 HockeyApp 看板,需将 App 关联到 Application Insights 才能查询。API 定义见 BITMetricsManager.h。

Objective-C

BITMetricsManager *metricsManager = [BITHockeyManager sharedHockeyManager].metricsManager; NSDictionary *myProperties = @{@"Property 1" : @"Something", @"Property 2" : @"Other thing", @"Property 3" : @"Totally different thing"}; NSDictionary *myMeasurements = @{@"Measurement 1" : @1, @"Measurement 2" : @2.34, @"Measurement 3" : @2000000}; [metricsManager trackEventWithName:eventName properties:myProperties measurements:myMeasurements]

Swift

let myProperties = ["Property 1": "Something", "Property 2": "Other thing", "Property 3" : "Totally different thing."] let myMeasurements = ["Measurement 1": 1, "Measurement 2": 2.3, "Measurement 3" : 30000] let metricsManager = BITHockeyManager.shared().metricsManager metricsManager.trackEvent(withName: eventName, properties: myProperties, measurements: myMeasurements)

八、反馈模块(Feedback)

自 4.1.1 起 Feedback 不在默认 SDK 中,需集成全功能版:

  • 二进制:使用HockeySDKAllFeatures/HockeySDK.embeddedframework;
  • CocoaPods:pod "HockeySDK", :subspecs => ['AllFeaturesLib']。

BITFeedbackManager让用户直接在 App 内与你沟通(单线程讨论),只有当你把对应 view controller 集成进 App 时才生效。切勿自行创建实例,一律通过单例获取:

Objective-C

[BITHockeyManager sharedHockeyManager].feedbackManager

Swift

BITHockeyManager.shared().feedbackManager

8.1 必须添加 NSPhotoLibraryUsageDescription

iOS 10 起,使用涉及隐私的系统框架前必须提供用途描述字符串。为允许用户给反馈附加照片,请在Info.plist中添加:

<key>NSPhotoLibraryUsageDescription</key> <string>用于在反馈中附加照片</string>

建议按 [Apple 文档] 的做法对InfoPlist.strings做本地化。若缺少该值,SDK 将禁用反馈中附加照片,并禁用截图新建反馈条目的能力。

九、App Store 更新通知(Store Updates)

该模块处理 App 已上架 App Store 后的更新提醒:检测到更新时弹出警告,询问用户更新或忽略;选择更新则打开 App Store 中该 App 的页面。默认关闭,启用方式:

Objective-C

[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"APP_IDENTIFIER"]; [[BITHockeyManager sharedHockeyManager] setEnableStoreUpdateManager: YES]; [[BITHockeyManager sharedHockeyManager] startManager];

Swift

BITHockeyManager.shared().configure(withIdentifier: "APP_IDENTIFIER") BITHockeyManager.shared().isStoreUpdateManagerEnabled = true BITHockeyManager.shared().start()

注意:该模块在非 App Store 构建/环境下不会做任何检查。对应属性在 BITHockeyManager.h 中默认为NO。

十、应用内更新(Beta & Enterprise)

BITUpdateManager面向 Ad-Hoc / Enterprise 构建:以 App Store 风格 UI 展示版本更新与信息,收集使用信息,并为 Ad-Hoc 构建提供额外授权选项。模块在 App Store 构建下默认自动禁用。

手动禁用:

Objective-C

[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"APP_IDENTIFIER"]; [[BITHockeyManager sharedHockeyManager] setDisableUpdateManager: YES]; // 关闭自动更新 [[BITHockeyManager sharedHockeyManager] startManager];

Swift

BITHockeyManager.shared().configure(withIdentifier: "APP_IDENTIFIER") BITHockeyManager.shared().isUpdateManagerDisabled = true BITHockeyManager.shared().start()

两个关键约束(见 BITUpdateManager.h):

  • SDK 依赖CFBundleVersion只增不减来判断新版本,切勿重置构建号。
  • 需要 Beta 分析、版本限制到指定用户、或想知道谁在测试你的 App 时,应配套 Authenticator 认证流程。
  • 其他可选属性:checkForUpdateOnLaunch(启动时检查)、checkForUpdate(手动触发检查)、alwaysShowUpdateReminder、showDirectInstallOption、expiryDate(过期时间)与disableUpdateCheckOptionWhenExpired。

十一、调试与验证

11.1 开启 SDK 调试日志

在startManager之前设置:

[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"APP_IDENTIFIER"]; [BITHockeyManager sharedHockeyManager].logLevel = BITLogLevelDebug; [[BITHockeyManager sharedHockeyManager] startManager];

BITLogLevel定义在 HockeySDKEnums.h:

值枚举说明
0BITLogLevelNone关闭日志
1BITLogLevelError仅错误
2BITLogLevelWarning错误 + 警告
3BITLogLevelDebug调试信息
4BITLogLevelVerbose非常啰嗦

另外可调用[[BITHockeyManager sharedHockeyManager] testIdentifier](Swift:BITHockeyManager.shared().testIdentifier())向服务器 ping 一次,用于验证初始化代码能否连通服务器;App Store 环境下该调用被忽略。setLogHandler:还能把 SDK 日志重定向到 NSLogger、CocoaLumberjack 等自定义日志框架。

11.2 运行环境判断

BITHockeyManager.appEnvironment(枚举见 HockeySDKEnums.h)返回BITEnvironmentAppStore(0)、BITEnvironmentTestFlight(1)或BITEnvironmentOther(99,含 Ad-Hoc / Enterprise 等)。可据此只在特定环境启用调试 UI 等能力。

11.3 区分 Beta 与 Live App Identifier

configureWithBetaIdentifier:liveIdentifier:delegate:可同时配置两个 App ID:SDK 自动检测是否运行于 App Store,App Store 使用 liveIdentifier,其余使用 betaIdentifier。建议 Beta 与 Live 分别建 HockeyApp 应用条目,因为 Beta 版本多、Live 崩溃报告多,混在一起不利于分析;Live 版甚至可以不传 IPA,只上传 dSYM 即可支撑崩溃上报。

十二、常见问题排查

Linker warnings(链接警告)

确认 4.1 节列出的系统框架与库均已链接到目标。

iTunes Connect 拒绝

检查Build Phases → Copy Bundle Resources(或构建后的.app包)中不得包含:

  • HockeySDK.framework(除非你自己构建了动态框架版本);
  • de.bitstadium.HockeySDK-iOS-5.1.2.docset。

功能表现不符合预期

在startManager前加[BITHockeyManager sharedHockeyManager].logLevel = BITLogLevelDebug;,控制台会输出模块初始化、网络请求收发等详细信息。

"Missing HockeySDKResources.bundle" 或文案错误

  1. 用 Finder 检查.app包内是否存在HockeySDKResources.bundle;
  2. 缺失则确认它出现在 target 的Copy Bundle Resources构建步骤中,必要时手动添加;
  3. 清理后重新构建。

十三、Dash-iOS 中的实际集成案例

本仓库的 Dash 应用在App Store target(Dash App Store)中通过 CocoaPods 集成 HockeySDK,Podfile 片段:

target "Dash App Store" do pod 'HockeySDK' end

锁定的 5.1.2 版本与默认子库见 Podfile.lock。真实初始化代码位于 DHAppDelegate.m:

#ifdef APP_STORE #ifndef DEBUG [[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"40091a11e4b749fcb7808992057b165a"]; [[BITHockeyManager sharedHockeyManager].crashManager setCrashManagerStatus:BITCrashManagerStatusAutoSend]; [[BITHockeyManager sharedHockeyManager] startManager]; [[BITHockeyManager sharedHockeyManager].authenticator authenticateInstallation]; #endif #endif

这是一个非常贴合 README 推荐实践的示例:

  • 用APP_STORE编译宏(在 project.pbxproj 中通过GCC_PREPROCESSOR_DEFINITIONS定义APP_STORE=1)把 SDK 代码限定在发布渠道构建;
  • 用DEBUG宏排除 Debug 构建,避免开发调试时产生噪音;
  • 崩溃上报设为BITCrashManagerStatusAutoSend,免去用户确认弹窗,适合已上架渠道;
  • 最后调用authenticateInstallation完成安装认证。

需要说明的是,HockeyApp 服务已于 2019 年并入 Visual Studio App Center 生态,本文描述的 SDK 属于该产品历史版本;Dash for iOS 官方也已停止更新,读者可参考此仓库作为旧版 SDK 集成范本,并结合当时服务端文档理解数据流转。

十四、文档、开发环境与贡献

完整 API 文档以 HockeySDK 5.1.2 官方发布为准;本仓库内置头文件即可作为离线参考,重点包括:

  • BITHockeyManager.h:总入口、初始化、模块属性、环境判断、日志、元数据;
  • BITCrashManager.h:崩溃模块全部配置;
  • BITMetricsManager.h:事件追踪 API;
  • BITUpdateManager.h 与 BITStoreUpdateManager.h:更新相关配置;
  • BITAuthenticator.h:认证方式枚举(BITAuthenticatorIdentificationTypeAnonymous、HockeyAppEmail、HockeyAppUser、Device、WebAuth)。

开发环境方面,官方建议使用最新 macOS 与 App Store 版 Xcode,并准备 Jazzy(文档生成)、CocoaPods 与 Carthage(集成测试)。若要向 SDK 仓库贡献代码,需先签署贡献者许可协议(CLA),并遵守项目采用的行为准则。

至此,从二进制拖拽到 CocoaPods/Carthage,从崩溃上报到用户指标与更新通知,HockeySDK-iOS 5.1.2 的完整集成与配置路径已全部覆盖——对照本仓库的源码与真实集成代码,即可在自己的项目中按需落地。

  • 开发工具

【免费下载链接】Dash-iOS

Dash for iOS was discontinued. Please check out Dash for macOS instead.

项目地址:https://gitcode.com/gh_mirrors/da/Dash-iOS
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询