今天接到一個監(jiān)聽狀態(tài)的需求,當使用 App 時若電話介入需要對當前狀態(tài)進行監(jiān)聽操作(注:并非通話內容),根據(jù)不同的狀態(tài)實行相關的需求操作,廢話不多說步驟如下.
首先,常規(guī)操作先引用對應的頭文件,來為后續(xù)功能鋪路.
#import <CoreTelephony/CTCallCenter.h>
#import <CoreTelephony/CTCall.h>
其次,需要設置一個全局的屬性,若在 viewDidLoad 方法中創(chuàng)建該屬性的話, viewDidLoad 調用結束該創(chuàng)建的屬性就會被銷毀掉,則后續(xù)方法步驟都將失效,從而無法檢測到來點狀態(tài).
/** 呼叫中心*/
@property (nonatomic, strong) CTCallCenter *callCenter;
再其次,便是具體監(jiān)聽邏輯,code 如下.
#pragma mark - ************************************************ (監(jiān)聽電話相關)
/**
?監(jiān)聽電話介入
?*/
- (void)monitorTelephoneCall {
? ? kWeakSelf(self);
? ? // MsgAppStarting
? ? // MsgAppReactivate
? ? _callCenter = [[CTCallCenter alloc] init];
? ? _callCenter.callEventHandler = ^(CTCall * call) {
? ? ? ? if ([call.callState isEqualToString:CTCallStateDisconnected]) {// Call has been disconnected
? ? ? ? ? ? NSLog(@"電話 --- 斷開連接");
? ? ? ? }
? ? ? ? else if ([call.callState isEqualToString:CTCallStateConnected]) {// Call has just been connected
? ? ? ? ? ? NSLog(@"電話 --- 接通");
? ? ? ? ? ? // 通知 H5 當前截屏操作
? ? ? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{
? ? ? ? ? ? ? ? // do somethings
? ? ? ? ? ? });
? ? ? ? }
? ? ? ? else if ([call.callState isEqualToString:CTCallStateIncoming]) {// Call is incoming
? ? ? ? ? ? NSLog(@"電話 --- 待接通");
? ? ? ? }
? ? ? ? else if ([call.callState isEqualToString:CTCallStateDialing]) {// Call is Dialing
? ? ? ? ? ? NSLog(@"電話 --- 撥號中");
? ? ? ? ? ? // 通知 H5 當前截屏操作
? ? ? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{
? ? ? ? ? ? ? ? // do somethings
? ? ? ? ? ? });
? ? ? ? }
? ? ? ? else {// Nothing is done"
? ? ? ? ? ? NSLog(@"電話 --- 無操作");
? ? ? ? }
? ? };
}
注:若需要對 UI 方面進行調試,需要提前進行主線程的調度,不然會造成 crash.
此次分享到此結束,希望內容能對大家實際有所幫助,有什么不足之處歡迎指點共同進步!