公司的一個(gè)電話APP上的需求,用戶在撥打和掛斷電話的時(shí)候要和服務(wù)器做交互。拿到需求的時(shí)候第一想法是不可能(因?yàn)閕OS系統(tǒng)的尿性)。后來就找到這個(gè)框架。這個(gè)框架在以前是私有API,后來確認(rèn)開放了。我們APP已經(jīng)上線,請(qǐng)放心使用。
Class
-
CTCall通話的實(shí)體 -
CTCallCenter通話中心 -
CTCarrier運(yùn)營(yíng)商信息 -
CTCellularData蜂窩數(shù)據(jù) CTSubscriberCTSubscriberInfoCTTelephonyNetworkInfoCoreTelephonyDefines
獲取SIM卡的運(yùn)營(yíng)商信息
先導(dǎo)入框架
import CoreTelephony
fileprivate func getCarrierInfo() {
let info = CTTelephonyNetworkInfo()
let carrier = info.subscriberCellularProvider
// 輸出運(yùn)營(yíng)商信息 包括運(yùn)營(yíng)商名稱 MCC MNC CountryCode 是否允許VOIP
print("Carrier: \(carrier!)")
// 輸出數(shù)據(jù)業(yè)務(wù)信息
print("Radio Access Technology: \(info.currentRadioAccessTechnology!)")
}
控制臺(tái)打印
Carrier: CTCarrier (0x137d584b0) {
Carrier name: [中國(guó)聯(lián)通]
Mobile Country Code: [460]
Mobile Network Code:[01]
ISO Country Code:[cn]
Allows VOIP? [YES]
}
Radio Access Technology: CTRadioAccessTechnologyLTE
這里能獲取的運(yùn)營(yíng)商信息也非常有限,只能獲取到 運(yùn)營(yíng)商名稱、MCC、MNC、Country Code、是否支持VOIP、當(dāng)前網(wǎng)絡(luò)的制示(LTE)這幾個(gè),無法獲取本機(jī)的SIM卡的電話號(hào)碼。
監(jiān)聽通話狀態(tài)
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
}
}
}
代碼都十分簡(jiǎn)單,初始化完畢后就可以監(jiān)聽通話啦。
注意APP是不能后臺(tái)監(jiān)聽通話時(shí)間的,使用的只有以下兩種情況:
- 應(yīng)用處于前臺(tái),接到來電。(這時(shí)應(yīng)用會(huì)進(jìn)入掛起狀態(tài),可以做應(yīng)用掛起的處理,不過
AppDelegate的applicationWillResignActive也會(huì)調(diào)用,在這里處理的話有點(diǎn)多此一舉。暫時(shí)沒有想到這種情況的應(yīng)用場(chǎng)景。) - 在應(yīng)用內(nèi)部調(diào)用系統(tǒng)Phone撥打的電話。例如用
UIApplication.shared.openURL(URL(string: "tel:135xxxxxxxx")!)這種情況監(jiān)聽得到撥打、接通、掛斷所有情況。不過要注意用戶如果打很久的電話,應(yīng)用可能進(jìn)入后臺(tái),進(jìn)入可能不會(huì)執(zhí)行這個(gè)閉包,具體要看APP對(duì)后臺(tái)模式的支持。
因?yàn)樯婕暗接脩綦[私,這個(gè)框架開放的功能真是很少。