1. 程式人生 > >電話狀態監聽

電話狀態監聽

今天接到一個監聽狀態的需求,當使用 App 時若電話介入需要對當前狀態進行監聽操作(注:並非通話內容),根據不同的狀態實行相關的需求操作,廢話不多說步驟如下.

首先,常規操作先引用對應的標頭檔案,來為後續功能鋪路.

#import <CoreTelephony/CTCallCenter.h>
#import <CoreTelephony/CTCall.h>

其次,需要設定一個全域性的屬性,若在 viewDidLoad 方法中建立該屬性的話, viewDidLoad 呼叫結束該建立的屬性就會被銷燬掉,則後續方法步驟都將失效,從而無法檢測到來點狀態.

/** 呼叫中心*/
@property (nonatomic, strong) CTCallCenter *callCenter;

再其次,便是具體監聽邏輯,code 如下.

#pragma mark - ************************************************ (監聽電話相關)
/**
 監聽電話介入
 */
- (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.

此次分享到此結束,希望內容能對大家實際有所幫助,有什麼不足之處歡迎指點共同進步!