我想尝试检测我的应用程序中的传入电话。我从头开始创建了一个新的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)

    }

我也没有[弱自我]尝试过,因为我是新手,并不知道这意味着什么。

当我通过手机上的XCode运行我的新小应用程序时,接到调用,断开连接或其他任何事情都不会发生。没错,曾经如此。为了使用CoreTelephony框架和CTCallCenter,我是否还需要做更多的事情?

问候
约翰

最佳答案

这是我上面评论的扩展。



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

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

通过将callCenter添加为 View Controller 的属性,它将CTCallCenter实例的生命周期与 View Controller 的生命周期联系在一起。因此,仅当从内存中清除 View Controller 时,才会从内存中清除CTCallCenter

有关更多详细信息,请阅读Automatic Reference Counting in Swift

10-08 07:00