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

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

关心约翰

这是我上面评论的延伸。

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

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

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

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

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

callEventHandler已被弃用,从iOS 10开始。

iOS 10现在使用一个新的框架来完成你想要做的事情CallKit 。 这是Apple的新框架,应该可以处理所有电话中断。 要检测传入和传出呼叫,请使用CXCallObserver 。 此类使用协议CXCallObserverDelegate通知已注册的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") } } }