基于環(huán)信實(shí)現(xiàn)實(shí)時(shí)視頻語(yǔ)音通話功能

該文章是建立在已經(jīng)用環(huán)信SDK實(shí)現(xiàn)了聊天功能的基礎(chǔ)之上,再去添加新的視頻語(yǔ)音通話功能科吭。基于環(huán)信實(shí)現(xiàn)在線聊天功能

實(shí)現(xiàn)前的準(zhǔn)備工作

1.先在環(huán)信官網(wǎng)下載環(huán)信SDK 環(huán)信SDK下載 我使用的環(huán)信SDK版本為 V3.2.0 2016-10-15

2.除了實(shí)現(xiàn)聊天功能需要導(dǎo)入的庫(kù)之外蜒灰,還需導(dǎo)入libiconv.dylib庫(kù)圾亏,這是環(huán)信實(shí)時(shí)語(yǔ)音包含的依賴庫(kù)。

3.除了步驟2需要導(dǎo)入支持環(huán)信SDK所需要的庫(kù)之外祭饭,還需導(dǎo)入libbz2.1.0.tbd庫(kù)瓮床,因?yàn)橐曨l聊天里面包含ffmpeg第三方盹舞,它需要這個(gè)依賴庫(kù)。

4.在工程中添加包含視頻語(yǔ)音通話功能的SDK HyphenateFullSDK隘庄,如果之前使用的是EaseUI所支持的HyphenateSDK踢步,需要將這個(gè)簡(jiǎn)版的SDK刪除干凈(最好是在Finder中檢查一下)否則會(huì)引起重復(fù)導(dǎo)入沖突。還需要注意一點(diǎn)的是丑掺,需要在Other Linker Flags 中添加-ObjC获印。具體做法 工程>>TARGETS>>Build Settings>>搜索other>>找到Other Linker Flags 添加-ObjC。

5.在環(huán)信的demo里找到Call文件夾,選擇導(dǎo)入CallViewController ChatDemoHelper EMCallOptions+NSCoding 并導(dǎo)入plugin文件夾 ChatView包含視頻語(yǔ)音通話的一些圖標(biāo),也需要導(dǎo)入街州。由于環(huán)信的SDK做了國(guó)際化,所以還需添加Localizable.strings兼丰。

環(huán)信demo里找到這些
還有這些
里面包含call的一些圖標(biāo)都需要

關(guān)于圖標(biāo)我要提一下,由于我使用的是3.2.0唆缴,集成成功之后鳍征,我發(fā)現(xiàn)它給的界面有些簡(jiǎn)陋。關(guān)鍵的圖標(biāo)都沒(méi)有面徽,全都用一塊塊button代替艳丛,毫無(wú)美感。所以我檢查了一下最新版的SDK斗忌,發(fā)現(xiàn)他們已經(jīng)完善了這個(gè)缺陷质礼,新加的圖標(biāo)挺好看的旺聚,我就扣下來(lái)放在這個(gè)工程里面用了织阳。

實(shí)現(xiàn)原理

集成環(huán)信,需要導(dǎo)入EaseUI砰粹、HyphenateFullSDK唧躲、emotion。一個(gè)是UI界面碱璃,一個(gè)是環(huán)信SDK弄痹,最后一個(gè)是emotion表情包。

實(shí)現(xiàn)的第一步是要從聊天界面嵌器,點(diǎn)擊“+”出現(xiàn)的MoreView開(kāi)始肛真。這個(gè)MoreView出現(xiàn)在EaseUI中,并且視頻跟語(yǔ)音的圖標(biāo)一開(kāi)始是隱藏的爽航,位置也有所變動(dòng)蚓让。

視頻語(yǔ)音圖標(biāo)一開(kāi)始是沒(méi)有的

下面就是去找到代碼所在地乾忱,并研究一波。

MoreView

EaseChatBarMoreView.m 中找到- (void)setupSubviewsForType:(EMChatToolbarType)type{}這個(gè)方法历极,在這個(gè)方法中我們就能發(fā)現(xiàn)窄瘟,MoreView里面的幾個(gè)按鈕圖標(biāo)就是在這里創(chuàng)建的,如下圖趟卸。

紅線標(biāo)注的地方一開(kāi)始是150蹄葱,而后修改為80

找到了UI創(chuàng)建的地方,這只是第一步锄列。下面就要根據(jù)按鈕綁定的方法图云,一步步往下深究。
首先根據(jù)_videoCallButton找到綁定的方法takeVideoCallAction右蕊,發(fā)現(xiàn)它通過(guò)代理實(shí)現(xiàn)的另一個(gè)方法moreViewVideoCallAction:,按住command鍵單擊方法繼續(xù)跟蹤琼稻。我們發(fā)現(xiàn)在EaseUIEaseMessageViewController.m中,該方法實(shí)現(xiàn)了饶囚,并且發(fā)了一個(gè)通知帕翻,如下圖。

視頻通話相關(guān)方法

很明顯萝风,這就是視頻通話的通知嘀掸,并且我們通過(guò)相同的方法不難發(fā)現(xiàn),語(yǔ)音通話的通知跟這個(gè)是一樣的规惰。我們找到關(guān)鍵字KNOTIFICATION_CALL在環(huán)信demo中搜一下睬塌,就知道哪個(gè)地方接收了通知。

語(yǔ)音歇万、視頻通話的通知關(guān)鍵字一樣

很明顯揩晴,ChatDemoHelper就是我們要關(guān)注的地方,然后直接到了這里贪磺。

接收語(yǔ)音硫兰、視頻通話的通知

細(xì)心的你肯定發(fā)現(xiàn)了圖上面我注釋的那些,ChatDemoHelper.m里面有好多方法我是不需要的寒锚,所有我都注釋了〗儆常現(xiàn)在我講講多余的代碼是哪些?需要的又是哪些刹前?

圖上方我注釋的代碼分別是:

[[RedPacketUserConfig sharedConfig] beginObserveMessage];//紅包相關(guān)

[[EMClient sharedClient] addDelegate:self delegateQueue:nil];//添加回調(diào)代理

[[EMClient sharedClient].groupManager addDelegate:self delegateQueue:nil];//群組模塊代理

[[EMClient sharedClient].contactManager addDelegate:self delegateQueue:nil];//好友模塊代理
   
[[EMClient sharedClient].roomManager addDelegate:self delegateQueue:nil];//聊天室模塊代理
   
[[EMClient sharedClient].chatManager addDelegate:self delegateQueue:nil];//聊天模塊代理

好友泳赋,聊天,回調(diào)相關(guān)代理喇喉,我在自定義聊天功能中用到過(guò)祖今,這里只是需要添加視頻相關(guān)的代理,所以有關(guān)于這些的代理和下面所出現(xiàn)的方法我都注釋了,只保留語(yǔ)音視頻相關(guān)代碼千诬。注釋的代碼太多撒踪,不易貼出,只要注意把上面我指出的那幾類注釋就好大渤,所有涉及call的代碼都保留制妄。

[[EMClient sharedClient].callManager addDelegate:self delegateQueue:nil];//實(shí)時(shí)通訊相關(guān)代理

還有ChatDemoHelper.hChatDemoHelper.m需要導(dǎo)入和注釋的頭文件泵三。

ChatDemoHelper.h

ChatDemoHelper.m

對(duì)照著看耕捞,有幾個(gè)類不需要,有幾個(gè)是重新導(dǎo)入的烫幕。在ChatDemoHelper.m中需要注意的是

- (void)makeCallWithUsername:(NSString *)aUsername
                        type:(EMCallType)aType{}//發(fā)起視頻

- (void)callDidReceive:(EMCallSession *)aSession{}//接收視頻

這兩個(gè)方法中的mainVC是找不到的俺抽,所有我要找到當(dāng)前視圖控制器,并讓它作為父視圖较曼,模態(tài)彈出CallViewController磷斧,如下圖所示。

找到當(dāng)前視圖控制器

修改的差不多了捷犹,我們就在MainViewController.mviewDidLoad中初始化ChatDemoHelper貼上代碼[ChatDemoHelper shareHelper];(在程序進(jìn)入的第一個(gè)視圖控制器中初始化)
然后運(yùn)行代碼弛饭,調(diào)試一波,發(fā)現(xiàn)功能是能實(shí)現(xiàn)了萍歉,但是UI界面有點(diǎn)丑侣颂,并且沒(méi)有來(lái)電鈴聲(雖然鈴聲相關(guān)的代碼有)。然后我找到CallViewController .m修改了一波UI枪孩,并且自己在網(wǎng)上down了一段蘋果來(lái)電鈴聲憔晒,并加了上去,差不多滿足了需求蔑舞。需要注意的是拒担,鈴聲的播放要放在CallViewController.mviewDidAppear:(BOOL)animated中。

呼叫界面
視頻通話界面

細(xì)節(jié)優(yōu)化

1.程序在后臺(tái)攻询,添加推送消息并鈴聲提醒从撼。具體操作如下:
ChatDemoHelper.m中找到- (void)callDidReceive:(EMCallSession *)aSession{}這個(gè)方法,并在這個(gè)方法里設(shè)置本地推送蜕窿。

// 接收到視頻 在方法開(kāi)始的地方設(shè)置本地推送相關(guān)代碼谋逻,原有代碼不變呆馁。
- (void)callDidReceive:(EMCallSession *)aSession
{
    // 程序在后臺(tái)
    if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) {
      
        UILocalNotification *notify = [[UILocalNotification alloc]init];
        NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
        notify.fireDate = fireDate;
        
        //時(shí)區(qū)
        notify.timeZone = [NSTimeZone defaultTimeZone];
        //通知內(nèi)容
        // 將環(huán)信ID通過(guò)本地?cái)?shù)據(jù)庫(kù)匹配桐经,找到真實(shí)的名字
        SaveMingYiModel *mingYiModel = [HaoYouDao selectedFromPeopleTableWithMDsfz:aSession.remoteName];
        
        
        NSString *stype =nil;
        if (aSession.type == EMCallTypeVoice) {
            
            stype = @"實(shí)時(shí)語(yǔ)音";
        }
        else if (aSession.type == EMCallTypeVideo){
           
            stype = @"視頻通話";
        }
        NSString *notifyStr = [NSString stringWithFormat:@"%@向您發(fā)起%@",mingYiModel.docName,stype];
        
        notify.alertBody = notifyStr;
        
        // 如果你想震動(dòng)的提示播放音樂(lè)的話就在下面填入你的音樂(lè)文件
        NSString *path = [[NSBundle mainBundle] pathForResource:@"callRing" ofType:@"mp3"];
        AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path], &sound);
        AudioServicesAddSystemSoundCompletion(kSystemSoundID_Vibrate, NULL, NULL, soundCompleteCallback, NULL);
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
        AudioServicesPlaySystemSound(sound);
        
        // ios8后,需要添加這個(gè)注冊(cè),才能得到授權(quán)
        if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
            UIUserNotificationType type =  UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
            
            UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type
                                                                                     categories:nil];
            [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        }
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
             // 執(zhí)行通知注冊(cè)
            [[UIApplication sharedApplication] scheduleLocalNotification:notify];
        });
      
    }

//==========后臺(tái)持續(xù)震動(dòng)和播放鈴聲的方法============
void soundCompleteCallback(SystemSoundID sound,void * clientData) {
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);  //震動(dòng)
    AudioServicesPlaySystemSound(sound);
}
//結(jié)束鈴聲
-(void)stopAlertSoundWithSoundID:(SystemSoundID)sound {
    AudioServicesDisposeSystemSoundID(kSystemSoundID_Vibrate);
}
//============end=================

然后在合適的地方結(jié)束震動(dòng)和提醒鈴聲浙滤。比如在視頻結(jié)束阴挣、接聽(tīng)、拒接纺腊、中斷等方法中加上結(jié)束的代碼畔咧。(代碼中很容易找到相關(guān)方法)

//調(diào)用結(jié)束震動(dòng)和提醒鈴聲的方法
 AudioServicesRemoveSystemSoundCompletion(kSystemSoundID_Vibrate);
   [self stopAlertSoundWithSoundID:sound];

代碼實(shí)現(xiàn)的差不多了茎芭,效果圖如下:

后臺(tái)震動(dòng)鈴聲提醒,并發(fā)送通知

**基于環(huán)信實(shí)現(xiàn)在線聊天功能 **

轉(zhuǎn)載請(qǐng)注明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末誓沸,一起剝皮案震驚了整個(gè)濱河市梅桩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拜隧,老刑警劉巖宿百,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異洪添,居然都是意外死亡垦页,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門干奢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)痊焊,“玉大人,你說(shuō)我怎么就攤上這事忿峻”∩叮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵逛尚,是天一觀的道長(zhǎng)罪佳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)黑低,這世上最難降的妖魔是什么赘艳? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮克握,結(jié)果婚禮上蕾管,老公的妹妹穿的比我還像新娘。我一直安慰自己菩暗,他們只是感情好掰曾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著停团,像睡著了一般旷坦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上佑稠,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天秒梅,我揣著相機(jī)與錄音,去河邊找鬼舌胶。 笑死捆蜀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辆它,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼誊薄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了锰茉?” 一聲冷哼從身側(cè)響起呢蔫,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎飒筑,沒(méi)想到半個(gè)月后咐刨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扬霜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年定鸟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片著瓶。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡联予,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出材原,到底是詐尸還是另有隱情沸久,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布余蟹,位于F島的核電站卷胯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏威酒。R本人自食惡果不足惜窑睁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望葵孤。 院中可真熱鬧担钮,春花似錦、人聲如沸尤仍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宰啦。三九已至苏遥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赡模,已是汗流浹背田炭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纺裁,地道東北人诫肠。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像欺缘,于是被迫代替她去往敵國(guó)和親栋豫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容