CallKit 這個(gè)開發(fā)框架,能夠讓語音或視訊電話的開發(fā)者將 UI 界面整合在 iPhone 原生的電話 App 中.
CallKit 也拓展了在 iOS 8 就出現(xiàn)的 App Extensions 功能,可以讓用戶在接收來電時(shí),在原生電話 App 中就透過第三方 App 辨識騷擾電話
創(chuàng)建一個(gè)callkit項(xiàng)目
1.首先要求iOS10以上的系統(tǒng)才可以使用CallKit功能?
?正常創(chuàng)建一個(gè)項(xiàng)目

2.添加一個(gè)target

3.選擇Call Directory Extension

4.完成后項(xiàng)目中會多出一個(gè)文件夾

5.CallDirectoryHandler文件里已經(jīng)寫好了示例代碼,但是這里的手機(jī)號碼沒有寫+86等國際區(qū)號

6.在這里將手機(jī)號碼和標(biāo)簽正確加入數(shù)組就即可,要注意手機(jī)號要加86,號碼要增序排列,號碼不能有重復(fù)。添加完成號碼標(biāo)記已經(jīng)可以實(shí)現(xiàn)了,進(jìn)入設(shè)置-電話-來電阻止與身份識別,打開我們app的開關(guān)就會執(zhí)行
- (void)beginRequestWithExtensionContext:(CXCallDirectoryExtensionContext *)context;方法
7.但是由于我們獲取數(shù)據(jù)是在主工程里,而在我們Extension里無法與主工程數(shù)據(jù)互通,所以要用到App Group

點(diǎn)擊添加,創(chuàng)建一個(gè)Group,要注意主工程和Extension中都要給group打上勾
8.蘋果還提供了一個(gè)更新方法,調(diào)用這個(gè)方法就相當(dāng)于重新打開一次打開來電阻止與身份識別里的開關(guān)

9.判斷是否已開啟權(quán)限的方法

使用中遇到的一些問題
1.調(diào)試?
先在手機(jī)上運(yùn)行app,再選擇Extension運(yùn)行

選擇自己的app - run 然后就可以調(diào)試Extension了

2.導(dǎo)入成功,但接到電話沒有標(biāo)記
1)可能是沒有在號碼前加86?例如18100000000寫入應(yīng)該是8618100000000
2)在自己通訊錄中存儲過這個(gè)號碼,系統(tǒng)會優(yōu)先提示通訊錄中名字
3.遇到的一些報(bào)錯(cuò)?
Error Domain=com.apple.CallKit.error.calldirectorymanager Code=1 ;CXErrorCodeCallDirectoryManagerErrorNoExtensionFound 該錯(cuò)誤可能出現(xiàn)的原因是identifier ? 設(shè)置的不對 注意不要使用app groups 使用的是Call Directory Extension 的identifier
Error Domain=com.apple.CallKit.error.calldirectorymanager Code=2 ;CXErrorCodeCallDirectoryManagerErrorLoadingInterrupted加載時(shí)被中斷有可能是因?yàn)閍ddAllIdentificationPhoneNumbersToContext中數(shù)據(jù)處理出錯(cuò),打斷點(diǎn)調(diào)試一下
Error Domain=com.apple.CallKit.error.calldirectorymanager?Code=3;CXErrorCodeCallDirectoryManagerErrorEntriesOutOfOrder可能是因?yàn)榧虞d數(shù)據(jù)格式錯(cuò)誤比如號碼中帶有符號,號碼沒有增序排列
Error Domain=com.apple.CallKit.error.calldirectorymanager?Code=4;CXErrorCodeCallDirectoryManagerErrorDuplicateEntries可能是的數(shù)據(jù)有重復(fù)
Error Domain=com.apple.CallKit.error.calldirectorymanagerCode=6;CXErrorCodeCallDirectoryManagerErrorExtensionDisabled 權(quán)限未打開