iOS電話監(jiān)聽 CoreTelephony框架的簡(jiǎn)單使用

公司的一個(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ù)
  • CTSubscriber
  • CTSubscriberInfo
  • CTTelephonyNetworkInfo
  • CoreTelephonyDefines

獲取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í)間的,使用的只有以下兩種情況:

  1. 應(yīng)用處于前臺(tái),接到來電。(這時(shí)應(yīng)用會(huì)進(jìn)入掛起狀態(tài),可以做應(yīng)用掛起的處理,不過AppDelegateapplicationWillResignActive也會(huì)調(diào)用,在這里處理的話有點(diǎn)多此一舉。暫時(shí)沒有想到這種情況的應(yīng)用場(chǎng)景。)
  2. 在應(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è)框架開放的功能真是很少。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容