【发布时间】:2020-12-17 09:40:38
【问题描述】:
我有一个执行特定任务的应用程序。
在执行此任务时,该应用还会监听用户何时接到电话。
如果用户接到电话,则需要中断此任务。
在 iOS 13 上,我们在来电时监听 willResignActiveNotification,在通话结束时监听 didBecomeActiveNotification(当用户在通话前打开应用时)。
在 iOS 14 上,如果通话设置设置为 全屏,这也有效。 但是,当此设置更改为横幅时,这些通知将永远不会触发。
当设置设为横幅时,我无法识别应用状态。我的猜测是它仍然处于活动状态。
问题在于,虽然没有调用通知,但当用户开启横幅设置时,UI 会被中断,就像应用被置于后台一样。
注意
我也符合CXCallObserverDelegate,实现callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall)方法,知道用户什么时候接到电话,什么时候结束。
因此,一个解决方案是在调用结束并触发此方法时恢复任务。
但我想了解这种情况下的应用生命周期,这对我来说没有意义。
代码示例
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(appDidEnterBackground(_:)), name: UIApplication.didEnterBackgroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(appWillEnterForeground(_:)), name: UIApplication.willEnterForegroundNotification, object: nil)
timer.resume()
updateUI()
}
override func viewWillDisappear(_ animated: Bool) {
timer.invalidate()
pauseUI()
NotificationCenter.default.removeObserver(self, name: UIApplication.didEnterBackgroundNotification, object: nil)
NotificationCenter.default.removeObserver(self, name: UIApplication.willEnterForegroundNotification, object: nil)
super.viewWillDisappear(animated)
}
@objc private func appDidEnterBackground(_ notification: Notification) {
timer.invalidate()
pauseUI()
}
@objc private func appWillEnterForeground(_ notification: Notification) {
timer.resume()
updateUI()
}
【问题讨论】:
-
你在使用 voip 通知吗?
-
不,我只是遵守 CXCallObserverDelegate,这反过来会触发
callChanged方法并提供有关呼叫状态的信息。
标签: ios notifications ios14 callkit