iOS 监听电话接听

2022-04-25  本文已影响0人  _Waiting_

电话状态监听

//
//  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 {//电话其他状态
                    [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(@"---- 电话其他状态");
        [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 = @"电话其他状态";
    }
    if (self.delegate && [self.delegate respondsToSelector:@selector(HanCallPhoneState:state:)]) {
        [self.delegate HanCallPhoneState:self state:state];
    }
    
}


@end

上一篇下一篇

猜你喜欢

热点阅读