美文网首页OC开发iOS
iOS电话监听 CoreTelephony框架的简单使用

iOS电话监听 CoreTelephony框架的简单使用

作者: Benjamin1994 | 来源:发表于2017-02-03 16:38 被阅读602次

    公司的一个电话APP上的需求,用户在拨打和挂断电话的时候要和服务器做交互。拿到需求的时候第一想法是不可能(因为iOS系统的尿性)。后来就找到这个框架。这个框架在以前是私有API,后来确认开放了。我们APP已经上线,请放心使用。

    Class

    • CTCall 通话的实体
    • CTCallCenter 通话中心
    • CTCarrier 运营商信息
    • CTCellularData 蜂窝数据
    • CTSubscriber
    • CTSubscriberInfo
    • CTTelephonyNetworkInfo
    • CoreTelephonyDefines

    获取SIM卡的运营商信息

    先导入框架

    import CoreTelephony

    
        fileprivate func getCarrierInfo() {
            
            let info = CTTelephonyNetworkInfo()
            let carrier = info.subscriberCellularProvider
            
            // 输出运营商信息 包括运营商名称 MCC MNC CountryCode 是否允许VOIP
            print("Carrier: \(carrier!)")
            
            // 输出数据业务信息
            print("Radio Access Technology: \(info.currentRadioAccessTechnology!)")
            
        }
    

    控制台打印

    Carrier: CTCarrier (0x137d584b0) {
        Carrier name: [中国联通]
        Mobile Country Code: [460]
        Mobile Network Code:[01]
        ISO Country Code:[cn]
        Allows VOIP? [YES]
    }
    
    Radio Access Technology: CTRadioAccessTechnologyLTE
    

    这里能获取的运营商信息也非常有限,只能获取到 运营商名称MCCMNCCountry Code是否支持VOIP当前网络的制示(LTE)这几个,无法获取本机的SIM卡的电话号码。

    监听通话状态

    
        fileprivate var callCenter: CTCallCenter = CTCallCenter()
        fileprivate func observeCallState() {
            
            callCenter.callEventHandler = { call in
                switch call.callState {
                case CTCallStateDialing:
                    print("拨打电话,CallId: \(call.callID)")
                case CTCallStateIncoming:
                    print("来电未接起,CallId: \(call.callID)")
                case CTCallStateConnected:
                    print("电话接通,CallId: \(call.callID)")
                case CTCallStateDisconnected:
                    print("电话挂断,CallId: \(call.callID)")
                default:
                    break
                }
            }
            
        }
    

    代码都十分简单,初始化完毕后就可以监听通话啦。

    注意APP是不能后台监听通话时间的,使用的只有以下两种情况:

    1. 应用处于前台,接到来电。(这时应用会进入挂起状态,可以做应用挂起的处理,不过AppDelegateapplicationWillResignActive也会调用,在这里处理的话有点多此一举。暂时没有想到这种情况的应用场景。)
    2. 在应用内部调用系统Phone拨打的电话。例如用UIApplication.shared.openURL(URL(string: "tel:135xxxxxxxx")!) 这种情况监听得到拨打接通挂断所有情况。不过要注意用户如果打很久的电话,应用可能进入后台,进入可能不会执行这个闭包,具体要看APP对后台模式的支持。

    因为涉及到用户隐私,这个框架开放的功能真是很少。

    相关文章

      网友评论

      • 竹屋听雨:大哥 这个框架能搞基站信息吗
        Benjamin1994:这里能获取的运营商信息也非常有限,只能获取到 运营商名称、MCC、MNC、Country Code、是否支持VOIP、当前网络的制示(LTE)这几个
      • 谢谢生活:callCenter 按照你写的代码来,可是我开启程序,然后给手机打电话,block里面没有回调啊
        谢谢生活:@Benjamin1994 我靠 烦了一个低级错误 封装好了的 结果没有搞成成员变量,伤不起啊
        Benjamin1994:@谢谢生活 你试试把callcenter的block放在程序加载的方法里面,我记得好像某些系统版本需要这么做。
        Benjamin1994:@谢谢生活 你持有callcenter对象了吗?

      本文标题:iOS电话监听 CoreTelephony框架的简单使用

      本文链接:https://www.haomeiwen.com/subject/hupdittx.html