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

时间:2016-03-15 15:04:49

标签: ios swift phone-call core-telephony

我想尝试在我的应用中检测来电。我从头开始创建一个新的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,我还需要做些什么吗?

此致 约翰

2 个答案:

答案 0 :(得分:19)

从iOS 10开始,

callEventHandler已被弃用。

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")
        }
    }
}

答案 1 :(得分:4)

这是我上述评论的延伸。

  

尝试将callCenter设为视图控制器的属性,而不仅仅是viewDidLoad中的变量。

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

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

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

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