iOS10 CallKit開發(fā)

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)碼的功能。如下圖所示:


IMG_4118.jpg

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

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

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