- 开发工具
【免费下载链接】Dash-iOS
Dash for iOS was discontinued. Please check out Dash for macOS instead.
本文以 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 目录。
支持的功能
- 崩溃上报(Crash Reporting):App 崩溃时,以与 Apple Crash Reporter 相同格式的崩溃日志写入设备存储;用户下次启动 App 时被询问是否上报到 HockeyApp。对 Beta 版和 App Store 上线版(live)均生效。
- 用户指标(User Metrics):统计日活/月活用户、崩溃影响用户、会话数,并支持Custom Events(自定义事件),可在 HockeyApp 门户查看聚合结果。
- Ad-Hoc / Enterprise 应用内更新:自动检查新版本,弹出警告视图展示发布说明、版本历史并立即触发安装。
- App Store 更新通知:检测到 App Store 新版本时提示用户打开 App Store 更新(默认关闭)。
- 反馈(Feedback):在应用内收集用户反馈并与用户直接沟通(4.1.1 起从默认版本移除,需使用全功能版)。
- 认证(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
- 确认
Project Navigator可见(⌘+1)。 - 将
HockeySDK.embeddedframework从 Finder 拖入 Xcode 的Vendorgroup。 - 在弹出的覆盖层中选择
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_REPORTER | 1 | 崩溃上报 |
HOCKEYSDK_FEATURE_FEEDBACK | 0 | 用户反馈(默认关闭) |
HOCKEYSDK_FEATURE_STORE_UPDATES | 1 | App Store 更新通知 |
HOCKEYSDK_FEATURE_AUTHENTICATOR | 1 | 安装认证 |
HOCKEYSDK_FEATURE_UPDATES | 1 | Beta/Enterprise 应用内更新 |
HOCKEYSDK_FEATURE_METRICS | 1 | 用户指标收集 |
BITHockeyManager的所有模块属性(crashManager、updateManager、storeUpdateManager、feedbackManager、authenticator、metricsManager)均以这些宏条件编译,见 BITHockeyManager.h。这解释了为什么“仅崩溃上报”构建里authenticator调用是无效的。
五、iOS 扩展与 WatchKit 集成
5.1 iOS Extensions
- 若 App 与扩展共用同一个
APP_IDENTIFIER,扩展的版本号(CFBundleShortVersionString)与构建号(CFBundleVersion)必须与主 App 一致。 - 扩展没有
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 } } }- 二进制发行包
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; } } @endSwift
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):
| 值 | 枚举 | 行为 |
|---|---|---|
| 0 | BITCrashManagerStatusDisabled | 崩溃上报禁用 |
| 1 | BITCrashManagerStatusAlwaysAsk | 每次发送前询问用户(默认) |
| 2 | BITCrashManagerStatusAutoSend | 无需交互自动发送 |
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-C | Swift |
|---|---|---|
| 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)还支持崩溃专属数据:
- 文本附加:
- (NSString *)applicationLogForCrashManager:(Swift:optional public func applicationLog(for crashManager: BITCrashManager!) -> String!),典型用法是把 CocoaLumberjack 等日志框架的最后一段日志拼进崩溃报告。 - 二进制附件:
- (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 = true7.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].feedbackManagerSwift
BITHockeyManager.shared().feedbackManager8.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:
| 值 | 枚举 | 说明 |
|---|---|---|
| 0 | BITLogLevelNone | 关闭日志 |
| 1 | BITLogLevelError | 仅错误 |
| 2 | BITLogLevelWarning | 错误 + 警告 |
| 3 | BITLogLevelDebug | 调试信息 |
| 4 | BITLogLevelVerbose | 非常啰嗦 |
另外可调用[[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" 或文案错误
- 用 Finder 检查
.app包内是否存在HockeySDKResources.bundle; - 缺失则确认它出现在 target 的
Copy Bundle Resources构建步骤中,必要时手动添加; - 清理后重新构建。
十三、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.
相关推荐
从崩溃到上架:Tauri iOS版本号规范完全指南
从崩溃到上架:Tauri iOS版本号规范完全指南 还在为iOS版本号配置错误导致App Store拒审而烦恼?本文将系统解析Tauri框架下iOS版本号的规范
桌面应用跨平台移动开发MagicalDanmaku 崩溃报告集成指南:Breakpad 架构、Minidump 全流程与 QBreakpad 实战
MagicalDanmaku 崩溃报告集成指南:Breakpad 架构、Minidump 全流程与 QBreakpad 实战 本指南以仓库内 Google Br
直播Gunnery与CI/CD集成:实现自动化部署流水线的完整教程 🚀
Gunnery与CI/CD集成:实现自动化部署流水线的完整教程 🚀 Gunnery是一款强大的分布式任务执行工具,专为现代化CI/CD流水线设计。通过Gunn
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考