最近在做音視頻通話,其中有一個(gè)需求是當(dāng)用戶接聽(tīng)電話時(shí)退回到主界面,遇到了一下問(wèn)題,跟大家分享一下。
CoreTelephony/CTCallCenter框架定義了在app運(yùn)行時(shí)監(jiān)聽(tīng)來(lái)電的block,用來(lái)處理app在來(lái)電時(shí)的各種情況。
首先在需要監(jiān)聽(tīng)來(lái)電的控制器的.m中引入頭文件import <CoreTelephony/CTCallCenter.h>, import <CoreTelephony/CTCall.h>,定義屬性,必須在屬性中聲明,要不不會(huì)回調(diào)block
*注:這里沒(méi)有測(cè)試,自己代碼就是這么寫(xiě)的,參考別人的文章-
@interface ViewController ()
@property(nonatomic, strong) CTCallCenter *callCenter; //必須在這里聲明,要不不會(huì)回調(diào)block
@end
具體的代碼如下所示,代碼寫(xiě)在viewDidLoad中
- (void)receiveCall {
self.callCenter = [[CTCallCenter alloc] init];
self.callCenter.callEventHandler = ^(CTCall * call) {
if([call.callState isEqualToString:CTCallStateDisconnected]) {
NSLog(@"Call has been disconnected");//電話被掛斷(我們用的這個(gè))
} else if([call.callState isEqualToString:CTCallStateConnected]) {
NSLog(@"Call has been connected");//電話被接聽(tīng)
} else if([call.callState isEqualToString:CTCallStateIncoming]) {
NSLog(@"Call is incoming");//來(lái)電話了
} else if([call.callState isEqualToString:CTCallStateDialing]) {
NSLog(@"Call is Dialing");//撥號(hào)
} else {
NSLog(@"Nothing is done");
}
};
}
總結(jié)下自己實(shí)現(xiàn)功能時(shí)遇到的坑,因?yàn)槲叶鄠€(gè)界面要監(jiān)聽(tīng)電話的接入,剛開(kāi)始遇到了來(lái)電話時(shí)崩潰的情況,解決方法是每次在界面push或是dismiss時(shí)把self.callCenter置為nil。
附加容易被忽略的一個(gè)點(diǎn):self.callCenter.currentCalls去判斷當(dāng)前是否有電話