iOS 監(jiān)聽電話接聽

電話狀態(tài)監(jiān)聽

//
//  HanCallPhoneState.m
//  HYOnlineMedia
//
//  Created by han on 2022/4/25.
//

#import "HanCallPhoneState.h"

#import <CallKit/CXCallObserver.h>
#import <CallKit/CXCall.h>

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


@interface HanCallPhoneState ()<CXCallObserverDelegate>
@property (nonatomic, strong) CXCallObserver *callObserver;
@property (nonatomic, strong) CTCallCenter *callCenter;
@end

@implementation HanCallPhoneState

static dispatch_once_t once;
static id instance;
+ (HanCallPhoneState *)shareInstance{
    
    dispatch_once(&once, ^{
        instance = [[self alloc] init];
    });
    return instance;
    
}
- (void)clearShareInstance{
    instance = nil;
    once = 0l;
}
-(instancetype)init{
    if (self = [super init]) {
        [self setCallObseaver];
    }
    return self;
}

-(void)setCallObseaver{
    
    if (@available(iOS 10.0, *)) {
        self.callObserver = [CXCallObserver new];
        [self.callObserver setDelegate:self queue:dispatch_get_main_queue()];
    } else {
        // Fallback on earlier versions
        
        self.callCenter = [CTCallCenter new];
        
        self.callCenter.callEventHandler = ^(CTCall *call) {
            dispatch_async(dispatch_get_main_queue(), ^{
                if ([call.callState isEqualToString:CTCallStateDialing]) {//主動撥打電話
                    [self phoneState:0];
                } else if ([call.callState isEqualToString:CTCallStateConnected]) {//電話接通
                    [self phoneState:1];
                } else if ([call.callState isEqualToString:CTCallStateDisconnected]) {//電話掛斷
                    [self phoneState:2];
                } else if ([call.callState isEqualToString:CTCallStateIncoming]) {//電話被叫
                    [self phoneState:3];
                } else {//電話其他狀態(tài)
                    [self phoneState:-1];
                }
            });
        };
    }
    
}

//MARK: CXCallObserverDelegate
- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call  API_AVAILABLE(ios(10.0)){
    
//    NSLog(@"outgoing :%d  onHold :%d   hasConnected :%d   hasEnded :%d",call.outgoing,call.onHold,call.hasConnected,call.hasEnded);
    NSInteger outgoing = call.outgoing;
    NSInteger onHold = call.onHold;
    NSInteger hasConnected = call.hasConnected;
    NSInteger hasEnded = call.hasEnded;
    
    /*
     撥打:  outgoing :1  onHold :0   hasConnected :0   hasEnded :0
     拒絕:  outgoing :0  onHold :0   hasConnected :0   hasEnded :1
     鏈接:  outgoing :1  onHold :0   hasConnected :1   hasEnded :0
     掛斷:  outgoing :1  onHold :0   hasConnected :0   hasEnded :1
     對方未接聽時掛斷:  outgoing :1  onHold :0   hasConnected :0   hasEnded :1
     
     新來電話:    outgoing :0  onHold :0   hasConnected :0   hasEnded :0
     保留并接聽:  outgoing :1  onHold :1   hasConnected :1   hasEnded :0
     另一個掛掉:  outgoing :0  onHold :0   hasConnected :1   hasEnded :0
     保持鏈接:    outgoing :1  onHold :0   hasConnected :1   hasEnded :1
     對方掛掉:    outgoing :0  onHold :0   hasConnected :1   hasEnded :1
     */
    
    if (outgoing && hasEnded == 0 && onHold==0 && hasConnected ==0) {
        NSLog(@"---- 電話主動撥打電話");
        [self phoneState:0];
    }else if (outgoing && onHold == 0 && hasConnected && hasEnded == 0){
        NSLog(@"---- 電話接通");
        [self phoneState:1];
    }else if (outgoing && onHold ==0 && hasConnected == 0 && hasEnded){
        NSLog(@"---- 電話掛斷");
        [self phoneState:2];
    }else if (hasConnected == 0 && outgoing == 0 && onHold == 0 && hasEnded == 0){
        NSLog(@"---- 電話被叫");
        [self phoneState:3];
    }else {
        NSLog(@"---- 電話其他狀態(tài)");
        [self phoneState:-1];
    }
    
}

-(void)phoneState:(NSInteger)state{
    
    NSString *message = @"";

    if (state == 0) {
        message = @"主動撥打電話";
    }else if (state == 1) {
        message = @"電話接通";
    }else if (state == 2) {
        message = @"電話掛斷";
    }else if (state == 3) {
        message = @"電話被叫";
    }else{
        message = @"電話其他狀態(tài)";
    }
    if (self.delegate && [self.delegate respondsToSelector:@selector(HanCallPhoneState:state:)]) {
        [self.delegate HanCallPhoneState:self state:state];
    }
    
}


@end

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容