最近在做音视频通话,其中有一个需求是当用户接听电话时退回到主界面,遇到了一下问题,跟大家分享一下。
CoreTelephony/CTCallCenter框架定义了在app运行时监听来电的block,用来处理app在来电时的各种情况。
首先在需要监听来电的控制器的.m
中引入头文件import <CoreTelephony/CTCallCenter.h>
, import <CoreTelephony/CTCall.h>
,定义属性,必须在属性中声明,要不不会回调block
*注:这里没有测试,自己代码就是这么写的,参考别人的文章-
@interface ViewController ()
@property(nonatomic, strong) CTCallCenter *callCenter; //必须在这里声明,要不不会回调block
@end
具体的代码如下所示,代码写在viewDidLoad中
- (void)receiveCall {
self.callCenter = [[CTCallCenter alloc] init];
self.callCenter.callEventHandler = ^(CTCall * call) {
if([call.callState isEqualToString:CTCallStateDisconnected]) {
NSLog(@"Call has been disconnected");//电话被挂断(我们用的这个)
} else if([call.callState isEqualToString:CTCallStateConnected]) {
NSLog(@"Call has been connected");//电话被接听
} else if([call.callState isEqualToString:CTCallStateIncoming]) {
NSLog(@"Call is incoming");//来电话了
} else if([call.callState isEqualToString:CTCallStateDialing]) {
NSLog(@"Call is Dialing");//拨号
} else {
NSLog(@"Nothing is done");
}
};
}
总结下自己实现功能时遇到的坑,因为我多个界面要监听电话的接入,刚开始遇到了来电话时崩溃的情况,解决方法是每次在界面push或是dismiss时把self.callCenter置为nil。
附加容易被忽略的一个点:self.callCenter.currentCalls去判断当前是否有电话
网友评论