获取通话时长

导入头文件

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

在需要的地方调用拨打电话方法,在 openURL的回调里,实例化CXCallObserver并设置代理,同时设置回调的队列

//拨打电话
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"telprompt://10086"] options:@{} completionHandler:^(BOOL success) {
        NSLog(@"%d",success);
        if(!success) return ;
        //设置电话代理
        _callObserver = [[CXCallObserver alloc]init];
        [_callObserver setDelegate:self queue:dispatch_get_main_queue()];
    }];

实现CXCallObserver的代理方法,根据 call 返回的信息 判断电话处于什么状态,根据不同状态搞不同的事情

-(void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call{
    
    NSLog(@"outgoing :%d  onHold :%d   hasConnected :%d   hasEnded :%d",call.outgoing,call.onHold,call.hasConnected,call.hasEnded);
    /** 以下为我手动测试 如有错误欢迎指出
      拨通:  outgoing :1  onHold :0   hasConnected :0   hasEnded :0
      拒绝:  outgoing :1  onHold :0   hasConnected :0   hasEnded :1
      链接:  outgoing :1  onHold :0   hasConnected :1   hasEnded :0
      挂断:  outgoing :1  onHold :0   hasConnected :1   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 (call.outgoing && call.hasConnected && !call.hasEnded) {
          //记录当前时间
        _beforeDate = [NSDate date];
    }
    //挂断
    if (call.outgoing && call.hasConnected && call.hasEnded) {
  //计算通话时长   
    NSDate* dat = [NSDate dateWithTimeInterval:0 sinceDate:_beforeDate];
    NSTimeInterval a=[dat timeIntervalSinceNow];
    NSString *timeString = [NSString stringWithFormat:@"%0.f",fabs(a)];//转为字符型
    NSLog(@"%@秒",timeString); 
    }
}

防止意外,在控制器销毁时 把 delegate 设为 nil

-(void)dealloc{
    [_callObserver setDelegate:nil queue:dispatch_get_main_queue()];
    _callObserver = nil;
}

注意:

如果代理回调没有执行
1.查看是否设置代理
2.需要把callObserver 全局引用,保证不销毁.
3.以上方法为10.0之后 需要判断 版本再10.0之前使用

        //获取通话状态
            _callCenter.callEventHandler =  { (call: CTCall) -> Void in
                if call.callState == CTCallStateDisconnected {
                  print("挂断电话")
                   self.callStateDisconnected()
                }
                if call.callState == CTCallStateConnected {
                    print("电话接通")
                      self.beforeDate = NSDate()
                }
                if call.callState == CTCallStateIncoming {
                    print("通话途中收到别的来电")
                }
                if call.callState == CTCallStateDialing {
                    print("电话播出")
                }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 基础 1. 为什么说Objective-C是一门动态的语言? 2. 讲一下MVC和MVVM,MVP? 3. 为...
    波妞和酱豆子阅读 8,666评论 0 46
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,850评论 19 139
  • 1.自定义控件 a.继承某个控件 b.重写initWithFrame方法可以设置一些它的属性 c.在layouts...
    圍繞的城阅读 8,957评论 2 4
  • 30天写作任务已早结束,但这远不是结束那么简单。30天前,找到了一起热爱写作的同僚并一起努力,30天后,我们...
    刺猬猫阅读 1,535评论 1 0
  • 认识自己,了解自己,然后呢?
    abdec69fff26阅读 1,220评论 0 0

友情链接更多精彩内容