iOS10,對于voip 應(yīng)用的app來了一個(gè)強(qiáng)有力的功能,系統(tǒng)級通話界面的支持。
參考之:【Dev Club 分享第十一期】QQ電話適配iOS10 Callkit框架分享 http://dev.qq.com/topic/58009392302e4725036142fc
上面的分享已經(jīng)對CallKit的主要流程做了比較詳細(xì)的說明,這邊就不重復(fù)了。主要說下幾點(diǎn)我在實(shí)際過程中遇到的比較重要的地方。
1.CXProviderConfiguration 配置項(xiàng):
如果需要實(shí)現(xiàn)類似whatsApp 長按系統(tǒng)聯(lián)系人中的呼叫或視頻 彈出app內(nèi)撥打該號(hào)碼的功能。如下圖所示:

那你可能需要實(shí)現(xiàn)它的屬性supportedHandleTypes 可支持的事件類型,且這個(gè)功能只有在這個(gè)方法調(diào)用到之后,才會(huì)注冊到系統(tǒng),所以要注意調(diào)用這句話的時(shí)機(jī)!
typedef NS_ENUM(NSInteger, CXHandleType) {
CXHandleTypeGeneric = 1,
CXHandleTypePhoneNumber = 2,
CXHandleTypeEmailAddress = 3,
} API_AVAILABLE(ios(10.0));
maximumCallGroups 不能設(shè)置為0 否則在主動(dòng)撥打時(shí)會(huì)報(bào)錯(cuò)errorCode 7
CXErrorCodeRequestTransactionErrorMaximumCallGroupsReached
2.CXHandle call的事件:它的value 如果是電話號(hào)碼,呼入和呼出時(shí),value最好與通訊錄中的號(hào)碼格式保持一致(有無+區(qū)號(hào)),簡單的說就是取系統(tǒng)的手機(jī)號(hào)碼。
CXHandle *handle = [[CXHandle alloc] initWithType:(CXHandleType)person.personHandle.type value:self.currentPhoneNumber];
3.利用CXCallObserverDelegate的返回,可以比較清楚的知道這個(gè)call的流程走向。
看一下demo中.h的方法 能知道大概的思路和使用了吧:
/*** 接收方 展示電話呼入等待接收界面 ****/
- (void)showCallInComingWithName:(NSString *)userName andPhoneNumber:(NSString *)phoneNumber isVideoCall:(BOOL)isVideo;
/**** 撥打方 呼出電話 ****/
- (void)starCallWithUserActivity:(NSUserActivity *)userActivity;
/******* Action **********/
//撥打方 開始連接
- (void)startedConnectingOutgoingCall;
//撥打方 通話連接成功 顯示通話時(shí)間
- (void)connectedOutgoingCall;
//撥打方 結(jié)束通話調(diào)用
- (void)endCallAction;
//接聽方 結(jié)束電話
- (void)finshCallWithReason:(CXCallEndedReason)reason;
/****** commom *****/
//禁音通話
- (void)muteCurrentCall:(BOOL)isMute;
//保留通話
- (void)heldCurrentCall:(BOOL)onHold;
//設(shè)置雙音頻功能
- (void)playDTMFCurrentCall:(CXPlayDTMFCallActionType)playType andDigits:(NSString *)digits;
//設(shè)置群組通話
- (void)setGroupCurrentCallWithGroupUUID:(NSUUID *)groupUUID;```
其他的就不多說了,主要查看系統(tǒng)api方法
因?yàn)樵陂_發(fā)時(shí)沒有找到OC的demo,下面提供自己針對上面流程寫的一個(gè)簡單demo //https://github.com/weskhen/CallKitManager
有不正確的地方,希望看到的大神幫忙指點(diǎn)下。
補(bǔ)充: 對鎖屏下接聽,不進(jìn)入app里面,如何讓系統(tǒng)界面顯示為 揚(yáng)聲器打開狀態(tài),這個(gè)目前嘗試多變,都沒有找到方法。在CallKit API中沒有看到對揚(yáng)聲器狀態(tài)的控制,imo這個(gè)視頻功能 沒有用系統(tǒng)界面的,不知道是不是也沒有找到這個(gè)方法,還是其他原因。如果有誰知道的麻煩指點(diǎn)一下,謝謝!
---------
PS: 鎖屏下 點(diǎn)擊進(jìn)入app 獲取揚(yáng)聲器狀態(tài) 展示最新UI 函數(shù)方法比較簡單
- (BOOL)currentOutputIsInSpeaker
{
NSArray* output = [[AVAudioSession sharedInstance] currentRoute].outputs;
if (output.count >0) {
NSString *newOutput = [[output objectAtIndex:0] portType];
if ([newOutput isEqualToString:AVAudioSessionPortBuiltInSpeaker]) {
return YES;
}
}
return NO;
}