公司的一个电话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
这里能获取的运营商信息也非常有限,只能获取到 运营商名称、MCC、MNC、Country 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是不能后台监听通话时间的,使用的只有以下两种情况:
- 应用处于前台,接到来电。(这时应用会进入挂起状态,可以做应用挂起的处理,不过
AppDelegate
的applicationWillResignActive
也会调用,在这里处理的话有点多此一举。暂时没有想到这种情况的应用场景。) - 在应用内部调用系统Phone拨打的电话。例如用
UIApplication.shared.openURL(URL(string: "tel:135xxxxxxxx")!)
这种情况监听得到拨打、接通、挂断所有情况。不过要注意用户如果打很久的电话,应用可能进入后台,进入可能不会执行这个闭包,具体要看APP对后台模式的支持。
因为涉及到用户隐私,这个框架开放的功能真是很少。