1.先前準(zhǔn)備
1).http://netease.im/im-sdk-demo附上sdk下載鏈接
2).導(dǎo)入sdk 建議手動(dòng)導(dǎo)入 并添加相應(yīng)的依賴庫(kù)文檔都有

2.寫(xiě)代碼
1).在網(wǎng)易云信登錄獲取到信息AppDelegate導(dǎo)入#import<NIMSDK/NIMSDK.h>
NSString *appKey = @"30**************6e";
NSString *cerName = @"https://*********api";
[[NIMSDK sharedSDK] registerWithAppID:appKey cerName:cerName];
并獲取到云信id這是必須的,先根據(jù)用戶ID獲取到token,獲取后調(diào)取方法[[[NIMSDK sharedSDK]loginManager] login:用戶ID token:在后臺(tái)綁定的登錄token completion:^(NSError * _Nullable error) {
if (error) {
NSLog(@"登錄失敗%ld", error.code);
} else {
NSLog(@"登錄成功%d", 200);
}
}]
2).實(shí)現(xiàn)該功能頁(yè)面導(dǎo)入#import<NIMSDK/NIMSDK.h>
2.0).創(chuàng)建一個(gè)會(huì)議NIMNetCallMeeting *_currentMeeting;
2.1).判斷是否是主持人或者用戶實(shí)現(xiàn)不同的方法

2.2)主持人創(chuàng)建會(huì)議-(void)createVideoAndAudio
{
NIMNetCallMeeting *meeting = [[NIMNetCallMeeting alloc] init];
meeting.name = 聊天室ID;
[self joinNetCallWithRMeeting:meeting];
}
- (void)joinNetCallWithRMeeting:(NIMNetCallMeeting *)rMeeting
{
if ([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)]) {
[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
if (granted) {
NIMNetCallOption *callOption =[[NIMNetCallOption alloc]init];
// 發(fā)送視頻質(zhì)量(SDK會(huì)處理 有可能無(wú)效)
//? ? ? ? ? ? ? ? callOption.preferredVideoQuality =NIMNetCallVideoQualityDefault;
// 禁止剪裁
//? ? ? ? ? ? ? ? callOption.disableVideoCropping =NO;
// 自動(dòng)旋轉(zhuǎn)遠(yuǎn)端畫(huà)面
callOption.autoRotateRemoteVideo =YES;
// 期望的視頻編碼器
callOption.preferredVideoEncoder =NIMNetCallVideoCodecDefault;
// 期望的視頻解碼器
callOption.preferredVideoDecoder =NIMNetCallVideoCodecDefault;
// 是否使用后置攝像頭
//? ? ? ? ? ? ? ? callOption.startWithBackCamera =NO;
// 啟用互動(dòng)直播
callOption.enableBypassStreaming =YES;
// 互動(dòng)直播推流地址
callOption.bypassStreamingUrl = self.url;
// 是否在服務(wù)器錄制音頻
callOption.serverRecordAudio =YES;
callOption.autoDeactivateAudioSession = NO;
// 是否在服務(wù)器錄制視頻
callOption.serverRecordVideo =YES;
// 加入會(huì)議的類(lèi)型->音頻/視頻
rMeeting.type = NIMNetCallMediaTypeAudio;
// 是否發(fā)送音視頻數(shù)據(jù)
rMeeting.actor = YES;
// 網(wǎng)路電話配置
rMeeting.option = callOption;
//? ? ? ? ? ? ? ? NSLog(@"錯(cuò)那了%@",rMeeting);
//進(jìn)入房間聊天
[[NIMAVChatSDK sharedSDK].netCallManager joinMeeting:rMeeting completion:^(NIMNetCallMeeting * _Nonnull meeting, NSError * _Nonnull error) {
if (!error) {
[[FbwHttpClient shareInstance]startRequestMethod:POST parameters:@{@"userId":用戶ID,@"chatRoomId":聊天室ID} url:UrL_JoinChatRoom success:^(id responseObject) {
if ([[responseObject objectForKey:@"errcode"]integerValue] != 0) {
[SVProgressHUD showErrorWithStatus:[responseObject objectForKey:@"msg"]];
}else{
}
} failure:^(NSError *error) {
}];
NSLog(@"進(jìn)入成功");
//默認(rèn)關(guān)閉所有人視頻
[[NIMAVChatSDK sharedSDK].netCallManager setCameraDisable:YES];
[[NIMAVChatSDK sharedSDK].netCallManager setMute:YES];
} else {
NSLog(@"進(jìn)入失敗");
[self reserveMeetingWithRoomId:self.LiaoTianSId];
}
}];
}else{
[self canRecord];
}
}];
}
}
- (void)reserveMeetingWithRoomId:(NSString *)roomId{
NIMNetCallMeeting *meeting = [[NIMNetCallMeeting alloc] init];
meeting.name = roomId;
meeting.type = NIMNetCallMediaTypeAudio;
meeting.actor = NO;
[[NIMAVChatSDK sharedSDK].netCallManager reserveMeeting:meeting completion:^(NIMNetCallMeeting * _Nonnull meeting, NSError * _Nonnull error) {
if (!error) {
NSLog(@"預(yù)定成功 ,進(jìn)入房間");
[self joinNetCallWithRMeeting:meeting];
} else {
if (error.code == 417) {
[self joinNetCallWithRMeeting:meeting];
NSLog(@"meeting exists, %@",meeting);
error = nil;
} else {
NSLog(@"預(yù)定房間失敗");
}
}
}];
}
2.3)用戶加入會(huì)議
-(void)AddMeeting
{
NIMNetCallMeeting *meeting = [[NIMNetCallMeeting alloc] init];
meeting.name = 聊天室ID;
meeting.type = NIMNetCallMediaTypeAudio;
meeting.actor = NO;
[[FbwHttpClient shareInstance]startRequestMethod:POST parameters:@{@"userId":用戶ID,@"chatRoomId":聊天室ID} url:UrL_JoinChatRoom success:^(id responseObject) {
if ([[responseObject objectForKey:@"errcode"]integerValue] != 0) {
[SVProgressHUD showErrorWithStatus:[responseObject objectForKey:@"msg"]];
}else{
//進(jìn)入房間聊天
[[NIMAVChatSDK sharedSDK].netCallManager joinMeeting:meeting completion:^(NIMNetCallMeeting * _Nonnull meeting, NSError * _Nonnull error) {
if (!error) {
NSLog(@"進(jìn)入成功");
[[NIMAVChatSDK sharedSDK].netCallManager setMute:YES];
[[NIMAVChatSDK sharedSDK].netCallManager setSpeaker:YES];//看需求是否開(kāi)啟擴(kuò)音器
}else{
}
}];
}
} failure:^(NSError *error) {
}];
}
2.4)離開(kāi)聊天室(踢出也如此)
[self quitConversationViewAndClear];
//? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [self createOutRoom];
NIMNetCallMeeting *meeting = [[NIMNetCallMeeting alloc] init];
meeting.name = self.LiaoTianSId;
[[NIMAVChatSDK sharedSDK].netCallManager leaveMeeting:meeting];
2.5).主持人可以讓用戶上麥也可以讓用戶下麥以及旁聽(tīng)一看便知,很簡(jiǎn)單

2.6)到這里差不多也結(jié)束了,有幾個(gè)注意的地方是你要區(qū)分主持人和用戶,一抱麥用戶即可說(shuō)話,一下麥及不可,主持人一直可以,我們的需求你們可以看下圖,我們聊天室用的融云,互動(dòng)直播用的網(wǎng)易,當(dāng)房間還有用戶存在時(shí),主持人退出聊天室還在,在麥用戶還可以說(shuō)話,當(dāng)只有主持人一人時(shí),退出聊天室,即關(guān)閉.

2.7)排版可能有點(diǎn)亂,看官們將就著看,做下來(lái)一開(kāi)始確實(shí)有點(diǎn)麻煩,還好有位朋友指點(diǎn)就順利多了,現(xiàn)在想想還挺簡(jiǎn)單的哈哈,互相學(xué)習(xí),不斷進(jìn)步.