Swift应用生命周期:监听未接听FaceTime来电的替代方案
问题:FaceTime来电拒接/主动取消时,AudioKit应用无法感知事件导致状态恢复异常
我正在开发一款基于AudioKit的应用,在处理应用生命周期时遇到了以下问题:
当收到FaceTime来电时,我需要更新应用状态,确保通话结束、应用回到前台时能正常恢复音频功能。目前的情况是:
- 来电弹出通知时,应用音频会自动停止,这属于正常行为;
- 如果接听来电,
sceneWillResignActive和sceneDidEnterBackground方法会被触发,我可以在这些方法里做相应的状态处理; - 但如果拒接来电,或者来电者在我接听前主动取消通话,尽管音频已经停止,没有任何SceneDelegate的方法会被调用,导致我无法正确更新应用状态,后续回到前台时音频恢复异常。
我已经通过全新的Swift Storyboard项目复现了这个行为(项目里没有音频逻辑,但可以观察来电触发的代理方法):在真机上运行项目,用另一设备发起FaceTime来电,查看Xcode调试日志,确认拒接来电时确实没有SceneDelegate方法被调用。
我的疑问是:除了SceneDelegate中的生命周期方法外,还有什么方式能让应用感知到这类来电事件?
测试设备:iPhone 14 Pro(iOS 16.3.1)、iPad Pro(第三代,iPadOS 16.3.1),仅针对FaceTime来电场景测试。
复现用SceneDelegate代码
创建新的Swift App Storyboard项目,将SceneDelegate替换为以下代码,运行后观察调试控制台日志:
import UIKit import os class SceneDelegate: UIResponder, UIWindowSceneDelegate { let lifecycle = Logger(subsystem: "com.myComany.lifecycletest", category: "lifecycle") var window: UIWindow? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { lifecycle.log("scene willConnectTo") guard let _ = (scene as? UIWindowScene) else { return } } func sceneDidDisconnect(_ scene: UIScene) { lifecycle.log("sceneDidDisconnect") } func sceneDidBecomeActive(_ scene: UIScene) { lifecycle.log("sceneDidBecomeActive") } func sceneWillResignActive(_ scene: UIScene) { lifecycle.log("sceneWillResignActive") } func sceneWillEnterForeground(_ scene: UIScene) { lifecycle.log("sceneWillEnterForeground") } func sceneDidEnterBackground(_ scene: UIScene) { lifecycle.log("sceneDidEnterBackground") } }
内容的提问来源于stack exchange,提问作者Brian H
相关产品推荐
相关产品推荐

