如何为 CallKit 来电 UI 设置超时

我正在我的应用中开发视频通话功能,并使用 CallKit 作为来电界面。我发现了一个边缘情况,如:

  • 用户A:呼叫用户B
  • 用户 B:
    • 应用处于终止状态。并为用户 B 显示 CallKit 传入 UI。
    • 用户 B 没有注意到(因为静音模式)并让传入的 UI 继续显示
    • 用户 A 没有结束通话;或者由于某些原因,用户 A 失去了互联网或退出了应用程序(因此我的服务器不会通过 VoIP 通知发送取消命令),因此用户 B 无法结束传入的 UI,直到用户 B 触摸取消或应答

那么有没有办法为 CallKit 的传入 UI 设置超时?例如:如果我将超时设置为 60 秒,那么传入的 UI 只会在 60 秒后显示自动关闭。

这是我显示传入 UI 的代码:

let update = CXCallUpdate()
update.localizedCallerName = callerName
update.remoteHandle = CXHandle(type: .phoneNumber,value: myID)
update.hasVideo = true
        
self.provider.reportNewIncomingCall(with: uuid,update: update) { [weak self] error in
    guard let self = self else { return }
    if error == nil {
        // Store my calls
        let call = Call(uuid: uuid,handle: handle)
        self.callKitManager.add(call: call)
    }
}

任何帮助将不胜感激。谢谢。

mfkkyv123 回答:如何为 CallKit 来电 UI 设置超时

无法使用 CallKit API 设置超时。你只需要自己实现它。

在您处理所有调用逻辑的类中,您应该添加如下内容:

private func startRingingTimer(for call: Call)
{
    let vTimer = Timer(
        timeInterval: 60,repeats: false,block: { [weak self] _ in
            self?.ringingDidTimeout(for: call)
        })
    vTimer.tolerance = 0.5
    RunLoop.current.add(vTimer,forMode: .common)
    ringingTimer = vTimer
}

private func ringingDidTimeout(for call: Call)
{
    ...
    self.provider.reportCall(with: call.uuid,endedAt: nil,reason: .unanswered)
    ...
}

那么您应该在成功报告新来电后立即拨打startRingingTimer(for: call);当然,如果用户接听电话,您必须使计时器无效。

本文链接:https://www.f2er.com/84813.html

大家都在问