OC开发iOS

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

2017-02-03  本文已影响602人  Benjamin1994

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

Class

获取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对后台模式的支持。

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

上一篇下一篇

猜你喜欢

热点阅读