【问题标题】:Need help identifying app state during phone call in iOS 14?在 iOS 14 通话期间需要帮助识别应用程序状态吗?
【发布时间】: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


【解决方案1】:

从 iOS 10 开始,我们的应用使用来自 CXCallObserverDelegatecallObserver:callChanged: 来检测来电或接听电话,例如:

@import CallKit;

@property (nonatomic) CXCallObserver *callObserver;

#pragma mark - Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Register Call Observer to detect incoming calls:
    _callObserver = [[CXCallObserver alloc] init];
    [_callObserver setDelegate:self
                         queue:nil];
}

#pragma mark - CXCallObserverDelegate

- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call {
    // Based on state:
    if (call.hasEnded) {
        NSLog(@"CXCallObserver: Call has ended");
    }
    else if (call.hasConnected) {
        NSLog(@"CXCallObserver: Call has connected");
    }
    else if (!call.isOutgoing && !call.hasConnected && !call.hasEnded) {
        NSLog(@"CXCallObserver: Call is incoming");
    }
    else {
        NSLog(@"CXCallObserver: None of the conditions");
    }
}

由于 iOS 14 上的默认行为是为来电显示横幅,我们确实看到 CXCallObserverDelegate 不再被调用。

当我们将 iOS 应用中的电话设置更改为 全屏 时,它确实再次起作用了。显然,就像在 iOS 13 及之前的版本中一样。

但是,当我们将设置切换回 横幅 时,我们的应用确实在传入横幅调用时调用了 CXCallObserverDelegate 事件。

基于 iOS 14 中 Local Network permission 的众多问题,仅推测这里存在类似的根本原因,即设置仅在用户主动设置后才移交给本机功能,而不是在默认系统设置。

我希望明确更改设置可以解决您的问题,或者我们是偶然的幸运。

注意:观察是在装有 iOS 14.6 的第二代 iPhone SE 上完成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 2019-12-03
    • 2019-08-17
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多