iOS 17中CLBackgroundActivitySession崩溃:苹果WWDC指引存误导
iOS 17中CLBackgroundActivitySession崩溃问题及WWDC指引误导分析
问题概述
在iOS 17开发中遇到CLBackgroundActivitySession相关崩溃问题,该问题疑似由WWDC 2023视频中的误导性指引导致。
崩溃基本信息
- 崩溃发生线程:
com.apple.corelocation.shared调度队列线程 - 已准备可复现崩溃的示例代码及完整崩溃日志
简化复现步骤
- 打开示例应用
- 归档并导出(操作路径:Distribute App -> Custom -> 选择Release Testing/Enterprise/Debugging任一选项 -> Export)
- 打开应用,点击
enableBackgroundLocation,在系统权限弹窗中选择「使用App期间允许」 - 点击
disableBackgroundLocation - 返回iOS主屏幕,等待10秒
- 重新打开应用,崩溃触发
崩溃原因与WWDC指引冲突
WWDC 2023《Discover Streamlined Location Updates》视频中的原文指引(翻译后):
在开始位置更新前,你需要实例化一个
CLBackgroundActivitySession对象来启动新会话。注意,我们将会话赋值给self.backgroundActivity属性而非局部变量——这一点很关键,因为如果使用局部变量,当它超出作用域时,所持对象会被释放,导致会话失效,可能中断App的位置访问权限。当需要结束会话时,你可以发送invalidate消息,或者让对象自行销毁。
但实际测试发现:将CLBackgroundActivitySession对象设为nil(即让对象销毁)并未正确结束会话,反而引发崩溃。甚至最小化实现也会触发崩溃,例如在viewDidLoad中执行以下代码:
let session = CLBackgroundActivitySession() print("session \(session)")
后续进展
已向苹果官方提交该问题寻求解决方案,同时将问题分享给开发者社区。此误导性指引已影响应用发布进度,恳请苹果官方尽快确认问题并作出澄清。
内容的提问来源于stack exchange,提问作者Steve Ham
相关产品推荐
相关产品推荐

