Agora iOS SDK-多人聊天

在上一篇Agora iOS SDK-開始聊天介紹了如何使用Agora SDK進(jìn)行一對一的聊天,這篇主要介紹下如何使用Agora iOS進(jìn)行多人聊天江掩,需要實現(xiàn)的功能:

  1. 隨著加入人數(shù)的變化,而顯示不同的UI抽兆,主要是分屏
  2. 在多屏顯示的情況下蹭沛,點擊一個小窗排截,會放大顯示該聊天窗
  3. 前篇實現(xiàn)的聊天功能

實現(xiàn)上面所說的功能:分屏,最好的方式是使用瀑布流布局挠蛉,這樣可以滿足分屏的需要祭示。

瀑布流

分屏顯示最好的方式是采用瀑布流,這樣比較方便的能夠適應(yīng)UI的變化谴古。
瀑布流的實現(xiàn)方式比較多质涛,常用的方式是使用UICollectionView實現(xiàn),自定義一個UICollectionViewLayout掰担。UICollectionViewLayout是向UICollectionView提供布局信息汇陆,也包括對于視圖的布局信息。需要重載UICollectionViewLayout的以下方法:

  • collectionViewContentSize 返回內(nèi)容的大小
  • (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 根據(jù)位置反饋cell對應(yīng)的布局屬性
  • (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect 恩敌,Cell的布局方式
  • prepareLayout 初始化方法

具體的實現(xiàn)可以參考https://github.com/LD1314/LDWaterflowLayout瞬测,該demo中也會使用該實現(xiàn)。
有了一個已經(jīng)實現(xiàn)的瀑布流之后,下面就可以實現(xiàn)分屏了月趟。需要引入LDWaterflowLayout灯蝴。

動態(tài)聊天窗

新建一個ViewController類,命名為MutilChatViewController孝宗,用來做分屏顯示的需求穷躁,在Agora SDK中一個遠(yuǎn)程視頻的顯示只和該用戶的uid有關(guān),所以使用的數(shù)據(jù)源只需要簡單定義為包含uid即可因妇,定義為:

public var dataArray:Array<UInt>?=Array<UInt>();

在Agora的委托AgoraRtcEngineDelegate中當(dāng)一個用戶加入聊天之后會觸發(fā)它的一個方法问潭,實現(xiàn)該方法,把用戶的uid加入dataArray中:

func rtcEngine(_ engine: AgoraRtcEngineKit!, didJoinedOfUid uid: UInt, elapsed: Int) {
        if(!(dataArray?.contains(uid))!){
            dataArray?.append(uid)
            collectionView.reloadData()
        }
        
    }

對于瀑布流的實現(xiàn)需要MutilChatViewController繼承:

  • UIViewController
  • UICollectionViewDataSource
  • LDWaterflowLayoutDelegate

其中LDWaterflowLayoutDelegate就是瀑布流的委托婚被,重寫它的兩個方法就可以實現(xiàn)分屏:

  1. columnCount(in waterflowLayout: LDWaterflowLayout!) -> CGFloat
    該方法用來指定一行顯示幾個元素狡忙,這里采用比較簡單的方式當(dāng)只有一個1個用戶的時候就顯示在一行,2個用戶的時候就在一行顯示2個元素...4個用戶的時候就顯示為2行...
  2. waterflowLayout(_ waterflowLayout: LDWaterflowLayout!, heightForItemAt index: UInt, itemWidth: CGFloat) -> CGFloat
    該方法用來設(shè)定每個元素的高度址芯,也是采用比較簡單的方式灾茁,只用1行的時候高度為300,有2行的時候高度為150谷炸,3行的時候高度為100北专。

把分屏的布局寫好之后,就可以在每一個UICollectionViewCell上播放聊天視頻了旬陡。

播放聊天視頻

新建一個類ChatCell它繼承了UICollectionViewCell拓颓,在ChatCell中有兩個組件:videoView: UIView!labelUser: UILabel!,前者用來顯示用戶視頻描孟,后者用來顯示用戶信息驶睦,videoView布局在整個ChatCell上,隨著ChatCell的變化而變化画拾。
要在ChatCell中播放聊天視頻啥繁,必須在ChatCell持有AgoraRtcEngineKit的變量,因此需要ChatCell聲明AgoraRtcEngineKit的變量青抛,并且在實例化ChatCell之后給該變量賦值:

public var agora :AgoraRtcEngineKit!

之前說過播放遠(yuǎn)程用戶的只需要實例化一個AgoraRtcVideoCancas之后再把uid賦值給它就可以了旗闽,而播放本地視頻也是類似的方法,還需要區(qū)分一個用戶是自己還是遠(yuǎn)程用戶蜜另,因此需要傳入當(dāng)前用戶的uid适室,在ChatCell中定義方法用來播放視頻:

 func setUid(uid:UInt,localUid:UInt){
        labelUser.text=String(uid)
        let videoCanvas = AgoraRtcVideoCanvas()
        videoCanvas.uid=uid
        videoCanvas.view=videoView
        videoCanvas.renderMode = .render_Fit
        if(uid != localUid){
            agora.setupRemoteVideo(videoCanvas)
        }else{
            agora.setupLocalVideo(videoCanvas)
        }
    }

這樣在多人聊天的時候就能使用分屏的方式播放用戶聊天視頻了,如果想放大某一個用戶的視頻該怎么辦呢举瑰?

放大顯示

當(dāng)用戶點擊某一個UICollectionViewCell的時候捣辆,希望對應(yīng)的視頻能夠放大顯示。因為一個視頻的播放只能顯示在一個view上面此迅,所以必須在點擊一個UICollectionViewCell的時候把它的播放顯示移除掉汽畴,在放大區(qū)域播放該聊天視頻旧巾,為了預(yù)留足夠空間顯示放大的時候,還需要調(diào)整UICollextionViewCell的高度忍些,給放大顯示預(yù)留出足夠的空間鲁猩。
因此首先我們在MutilChatViewController中新增一個顯示放大區(qū)域的view:

@IBOutlet weak var remoteView: UIView!

在放大視頻的時候,不知道用戶是需要放大自己的視頻罢坝,還是放大遠(yuǎn)程用戶的視頻廓握,因此首先要記錄下用戶自己的uid,在點擊的時候拿到用戶的uid嘁酿,再判斷是顯示本地視頻還是遠(yuǎn)程用戶的視頻隙券,放大視頻方法:

 func setupVideo(uid:UInt){
        if(self.remoteView.isHidden){
            self.remoteView.isHidden=false
        }
        let videoCanvas=AgoraRtcVideoCanvas()
        videoCanvas.uid=uid
        videoCanvas.view=remoteView
        videoCanvas.renderMode = .render_Fit
        if(uid==localUid){
            agoraKit.setupLocalVideo(videoCanvas)
        }else{
            agoraKit.setupRemoteVideo(videoCanvas)
        }
    }

當(dāng)用戶觸發(fā)點擊事件的時候使用變量isSelect記錄用戶的點擊行為,如果用戶有點擊行為的時候闹司,在判斷Cell高度的時候就返回和Cell寬度一樣的值(這里只是在demo的情況做的考慮娱仔,如果實際使用中還要根據(jù)Cell的個數(shù)進(jìn)行顯示高度的考慮),判斷高度方法:

func waterflowLayout(_ waterflowLayout: LDWaterflowLayout!, heightForItemAt index: UInt, itemWidth: CGFloat) -> CGFloat {
        let count:Int=(dataArray?.count)!
        if(self.isSelect!){
            return itemWidth
        }
        ....
    }

這樣就可以在用戶點擊某一個Cell的時候進(jìn)行放大顯示的處理,在上一篇文章中游桩,介紹了使用reportAudioVolumeIndicationOfSpeakers監(jiān)聽是誰在說話拟枚,如果真實的項目中,在每一個Cell中可以做一個小廣播众弓,在某一個用戶說話的時候,可以通過小廣播的變化進(jìn)行標(biāo)識隔箍。
這里使用Agora SDK做了一個簡短的demo谓娃,后續(xù)的還會繼續(xù)完善,利用Agora SDK模仿Housparty的功能實現(xiàn)比較簡單蜒滩,先要產(chǎn)品化還有很多的東西要做滨达,在這里先做一個簡單的總結(jié)吧!

Agora SDK使用總結(jié)

Agora提供了高質(zhì)量的視頻通信SDK俯艰,覆蓋了主流的操作系統(tǒng)捡遍,集成效率也比較高,而且還支持多個模式的視頻通話竹握,包括聊天画株,會議,直播等功能啦辐。SDK中API設(shè)計基本能夠滿足大部分的開發(fā)需要谓传,而且隱藏了底層開發(fā),這樣對于應(yīng)用層的開發(fā)者來說十分友好芹关。非常適合有視頻聊天開發(fā)需求的開發(fā)者续挟。在視頻領(lǐng)域創(chuàng)業(yè)大爆發(fā)的今天,建議更多的想要從事該領(lǐng)域的開發(fā)者可以嘗試下侥衬。
在使用Agora iOS SDK的過程中有兩個建議希望廠商可以考慮下:

  1. 支持 Cocoapods诗祸,不支持Cocoapods需要在集成的時候在依賴上面花費時間跑芳,而且以后升級也不是太容易。
  2. 希望可以提供基礎(chǔ)UI的SDK直颅,就像友盟的分享SDK一樣博个,提供一套可用的帶UI的SDK,當(dāng)然還要允許用戶定制际乘,這樣應(yīng)用層的開發(fā)者集成效率會更高坡倔。

參考文檔:https://docs.agora.io/cn/user_guide/API/ios_api.html
demo地址:https://github.com/jjz/agora-swift

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脖含,隨后出現(xiàn)的幾起案子罪塔,更是在濱河造成了極大的恐慌,老刑警劉巖养葵,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件征堪,死亡現(xiàn)場離奇詭異,居然都是意外死亡关拒,警方通過查閱死者的電腦和手機佃蚜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來着绊,“玉大人谐算,你說我怎么就攤上這事」槁叮” “怎么了洲脂?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長剧包。 經(jīng)常有香客問我恐锦,道長,這世上最難降的妖魔是什么疆液? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任一铅,我火速辦了婚禮,結(jié)果婚禮上堕油,老公的妹妹穿的比我還像新娘潘飘。我一直安慰自己,他們只是感情好掉缺,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布福也。 她就那樣靜靜地躺著,像睡著了一般攀圈。 火紅的嫁衣襯著肌膚如雪暴凑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天赘来,我揣著相機與錄音现喳,去河邊找鬼凯傲。 笑死,一個胖子當(dāng)著我的面吹牛嗦篱,可吹牛的內(nèi)容都是我干的冰单。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼灸促,長吁一口氣:“原來是場噩夢啊……” “哼诫欠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浴栽,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤荒叼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后典鸡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體被廓,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年萝玷,在試婚紗的時候發(fā)現(xiàn)自己被綠了嫁乘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡球碉,死狀恐怖蜓斧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情睁冬,我是刑警寧澤法精,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站痴突,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏狼荞。R本人自食惡果不足惜辽装,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望相味。 院中可真熱鬧拾积,春花似錦、人聲如沸丰涉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽一死。三九已至肛度,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間投慈,已是汗流浹背承耿。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工冠骄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人加袋。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓凛辣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親职烧。 傳聞我的和親對象是個殘疾皇子扁誓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件蚀之、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,123評論 4 61
  • Swift版本點擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,421評論 7 249
  • 不知為何,明明想和你說話壹堰。 卻騙你說拭卿,風(fēng)雨正好,應(yīng)該寫些詩句贱纠。 不必嘲諷我峻厚,你可以笑出聲來。 我也當(dāng)是天籟谆焊。 不必...
    一曲離歌誰斷弦閱讀 719評論 0 0
  • 人生首位影響到你的一定是父母惠桃,因為一生出來見到的第一人便是父母。我想生我時父親應(yīng)該是在的吧辖试! 三歲的記憶是屋后種了...
    若艾閱讀 235評論 0 0
  • 今日反思: 1.連鎖反應(yīng)太可怕辜王,以后做一件事要先想想可能會發(fā)生的后果。記住一點罐孝,不是不做呐馆,只是注意方法,也不要被別...
    minozyu閱讀 149評論 0 0