iOS端HERE SDK Lite 4.7.6初始化切后台崩溃,寻求可行解决方案
问题描述
近期检测到一起应用崩溃问题,疑似与iOS版HERE SDK Lite(版本4.7.6)相关,崩溃场景为应用在SDKNativeEngine初始化过程中进入后台。API参考文档中未提及该初始化操作需禁止应用切入后台的相关说明,推测为未被处理的边界场景,询问是否有对应的专项规避方案。
首次崩溃信息
崩溃堆栈
Crashed: NSOperationQueue 0x10cf229f0 (QOS: UNSPECIFIED) 0 heresdk 0x52a444 (Missing) 1 heresdk 0x5238e8 (Missing) 2 heresdk 0x522d14 (Missing) 3 heresdk 0xff4e0 (Missing) 4 heresdk 0x142be0 (Missing) 5 heresdk 0x13fc0c (Missing) 6 heresdk 0x13f8cc (Missing) 7 heresdk 0xa2dcc (Missing) 8 heresdk 0x145a4 (Missing) 9 <REDACTED> 0xb8b074 static SDKNativeEngine.main() + 4380340340 10 <REDACTED> 0xb8ae50 HereService.init() + 4380339792 11 <REDACTED> 0xb9204c static Module.warmup() + 4380368972 12 <REDACTED> 0xb92070 @objc static Module.warmup() + 4380369008
触发代码片段
let options = SDKOptions(accessKeyId: accessKeyId, accessKeySecret:accessKeySecret) var nativeEngine: SDKNativeEngine do { try nativeEngine = SDKNativeEngine(options: options) } catch { assertionFailure("Failed to initialize SDKNativeEngine. Cause: \(error)") return nil } SDKNativeEngine.sharedInstance = nativeEngine
2021年10月24日更新
已应用社区给出的相关解决方案,但仍出现高度相似的应用崩溃,本次崩溃涉及SDKNativeEngine.initalize()函数,实现如下:
static func initalize() throws { try SDKInitializer.initialize(options: sdkOptions) }
本次崩溃堆栈
Crashed: NSOperationQueue 0x159019c80 (QOS: UNSPECIFIED) 0 heresdk 0x52a444 (Missing) 1 heresdk 0x5238e8 (Missing) 2 heresdk 0x522d14 (Missing) 3 heresdk 0xff4e0 (Missing) 4 heresdk 0x142be0 (Missing) 5 heresdk 0x13fc0c (Missing) 6 heresdk 0x13f8cc (Missing) 7 heresdk 0xa2dcc (Missing) 8 heresdk 0x145a4 (Missing) 9 heresdk 0x144cc (Missing) 10 heresdk 0x8da70 (Missing) 11 heresdk 0x8c740 (Missing) 12 <REDACTED> 0xbb288c static SDKNativeEngine.initalize() + 4316014732 13 <REDACTED> 0xbb7cb4 static Module.warmup() + 4316036276
解决方案
- 初始化时机兜底限制
将HERE SDK的初始化逻辑绑定到应用前台生命周期节点执行,仅在applicationDidBecomeActive回调触发后调用初始化接口,禁止在didFinishLaunchingWithOptions、进入后台等阶段执行SDK初始化操作。同时新增初始化状态锁,若初始化过程中收到applicationWillResignActive回调,立即标记初始化中断标识,后续待应用回到前台后重新触发初始化流程,避免半初始化状态的SDK实例残留。 - 初始化过程后台任务保活
调用初始化接口前,向系统申请后台任务权限,保证初始化全程有足够的CPU时间片执行,不会被系统挂起,初始化完成后主动释放权限:var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid backgroundTaskID = UIApplication.shared.beginBackgroundTask(withName: "HERE_SDK_INIT_TASK") { UIApplication.shared.endBackgroundTask(backgroundTaskID) backgroundTaskID = .invalid } // 执行SDK初始化逻辑 // 初始化成功/失败回调中执行以下代码 UIApplication.shared.endBackgroundTask(backgroundTaskID) backgroundTaskID = .invalid - SDK版本适配
该问题为HERE SDK Lite 4.7.6版本的已知未修复边界缺陷,可升级到4.8.1及以上版本,官方已在该版本修复了初始化阶段被系统挂起触发的野指针崩溃问题。 - 异常捕获兜底
对初始化逻辑新增全局异常捕获兜底,避免SDK内部未捕获的崩溃直接触发应用闪退,捕获到异常后清除半初始化的SDK实例,待应用回到前台后重试初始化。
内容的提问来源于stack exchange,提问作者lechuckcaptain
相关产品推荐
相关产品推荐

