使用CTCallCenter(Swift)检测iOS上的电话

Joh*_*röm 7 phone-call ios core-telephony swift

我想尝试在我的应用中检测来电.我从头开始创建一个新的Swift项目,只是为了尝试一些代码.我唯一做的就是在每个新项目创建的ViewController中导入CoreTelephony,我还将viewDidLoad()更改为:

    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let callCenter = CTCallCenter()
    NSLog("start")

    callCenter.callEventHandler = {[weak self] (call: CTCall) -> () in

        self?.label.text = call.callState
        NSLog("Call state")
        NSLog(call.callState)

    }
Run Code Online (Sandbox Code Playgroud)

我也尝试过没有[弱自我],因为我是新手,并且不确定它需要什么.

当我通过手机上的XCode运行我的新小应用程序时,收到呼叫,断开连接或其他任何事情都没有任何反应.什么都没有错误.为了使用CoreTelephony框架和CTCallCenter,我还需要做些什么吗?

关心约翰

Bra*_*n A 20

callEventHandler 从iOS 10开始已被弃用.

iOS 10现在使用一个新的框架来完成你想要做的事情CallKit.这是Apple的新框架,可以处理所有电话中断.要检测拨入和拨出电话,请使用CXCallObserver.此类使用协议CXCallObserverDelegate通知已注册的代理调用更改.我发现它AppDelegate作为代表设置得很好.

// AppDelegate
var callObserver: CXCallObserver!

// in applicationDidFinishLaunching...
callObserver = CXCallObserver()
callObserver.setDelegate(self, queue: nil) // nil queue means main thread

extension AppDelegate: CXCallObserverDelegate {
    func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
        if call.hasEnded == true {
            print("Disconnected")
        }
        if call.isOutgoing == true && call.hasConnected == false {
            print("Dialing")
        }
        if call.isOutgoing == false && call.hasConnected == false && call.hasEnded == false {
            print("Incoming")
        }

        if call.hasConnected == true && call.hasEnded == false {
            print("Connected")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这种方法在前台工作。有什么办法让它在后台工作吗?我没有找到解决方案,因为没有适当的后台模式功能,也没有匹配的扩展。 (2认同)
  • 请注意:如果您想在中国推出,您的应用可能会被 Apple 拒绝。引用:“指南 5.0 - 法律最近,中国工业和信息化部 (MIIT) 要求在中国 App Store 上的所有应用程序中停用 CallKit 功能。” (2认同)

Cra*_*ens 5

这是我上面评论的扩展。

尝试callCenter为您的视图控制器设置一个属性,而不仅仅是在中创建一个变量viewDidLoad

在方法中定义变量时,该变量及其值仅存在于该方法中。该方法完成运行后,将清除有价值的值及其值,以便它们不会继续使用内存(除非在其他地方使用了该值)。

在您的情况下,您可以定义callCenter并为其分配新CTCallCenter实例。但是在末尾viewDidLoadCTCallCenter实例不再使用,因此可以从内存中清除该实例。由于它不再存在,因此无法处理通话事件。

通过添加callCenter作为视图控制器的属性,它将CTCallCenter实例的寿命与视图控制器的寿命联系起来。因此,CTCallCenter仅当从内存中清除视图控制器时,才会从内存中清除。

有关更多详细信息,请阅读Swift中的自动引用计数