基于环信实现实时视频语音通话功能

该文章是建立在已经用环信SDK实现了聊天功能的基础之上,再去添加新的视频语音通话功能。基于环信实现在线聊天功能

实现前的准备工作

1.先在环信官网下载环信SDK 环信SDK下载 我使用的环信SDK版本为 V3.2.0 2016-10-15

2.除了实现聊天功能需要导入的库之外,还需导入libiconv.dylib库,这是环信实时语音包含的依赖库。

3.除了步骤2需要导入支持环信SDK所需要的库之外,还需导入libbz2.1.0.tbd库,因为视频聊天里面包含ffmpeg第三方,它需要这个依赖库。

4.在工程中添加包含视频语音通话功能的SDK HyphenateFullSDK,如果之前使用的是EaseUI所支持的HyphenateSDK,需要将这个简版的SDK删除干净(最好是在Finder中检查一下)否则会引起重复导入冲突。还需要注意一点的是,需要在Other Linker Flags 中添加-ObjC。具体做法 工程>>TARGETS>>Build Settings>>搜索other>>找到Other Linker Flags 添加-ObjC。

5.在环信的demo里找到Call文件夹,选择导入CallViewController ChatDemoHelper EMCallOptions+NSCoding 并导入plugin文件夹 ChatView包含视频语音通话的一些图标,也需要导入。由于环信的SDK做了国际化,所以还需添加Localizable.strings。

环信demo里找到这些
还有这些
里面包含call的一些图标都需要

关于图标我要提一下,由于我使用的是3.2.0,集成成功之后,我发现它给的界面有些简陋。关键的图标都没有,全都用一块块button代替,毫无美感。所以我检查了一下最新版的SDK,发现他们已经完善了这个缺陷,新加的图标挺好看的,我就扣下来放在这个工程里面用了。

实现原理

集成环信,需要导入EaseUIHyphenateFullSDKemotion。一个是UI界面,一个是环信SDK,最后一个是emotion表情包。

实现的第一步是要从聊天界面,点击“+”出现的MoreView开始。这个MoreView出现在EaseUI中,并且视频跟语音的图标一开始是隐藏的,位置也有所变动。

视频语音图标一开始是没有的

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

MoreView

EaseChatBarMoreView.m 中找到- (void)setupSubviewsForType:(EMChatToolbarType)type{}这个方法,在这个方法中我们就能发现,MoreView里面的几个按钮图标就是在这里创建的,如下图。

红线标注的地方一开始是150,而后修改为80

找到了UI创建的地方,这只是第一步。下面就要根据按钮绑定的方法,一步步往下深究。
首先根据_videoCallButton找到绑定的方法takeVideoCallAction,发现它通过代理实现的另一个方法moreViewVideoCallAction:,按住command键单击方法继续跟踪。我们发现在EaseUIEaseMessageViewController.m中,该方法实现了,并且发了一个通知,如下图。

视频通话相关方法

很明显,这就是视频通话的通知,并且我们通过相同的方法不难发现,语音通话的通知跟这个是一样的。我们找到关键字KNOTIFICATION_CALL在环信demo中搜一下,就知道哪个地方接收了通知。

语音、视频通话的通知关键字一样

很明显,ChatDemoHelper就是我们要关注的地方,然后直接到了这里。

接收语音、视频通话的通知

细心的你肯定发现了图上面我注释的那些,ChatDemoHelper.m里面有好多方法我是不需要的,所有我都注释了。现在我讲讲多余的代码是哪些?需要的又是哪些?

图上方我注释的代码分别是:

[[RedPacketUserConfig sharedConfig] beginObserveMessage];//红包相关

[[EMClient sharedClient] addDelegate:self delegateQueue:nil];//添加回调代理

[[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];//聊天模块代理

好友,聊天,回调相关代理,我在自定义聊天功能中用到过,这里只是需要添加视频相关的代理,所以有关于这些的代理和下面所出现的方法我都注释了,只保留语音视频相关代码。注释的代码太多,不易贴出,只要注意把上面我指出的那几类注释就好,所有涉及call的代码都保留。

[[EMClient sharedClient].callManager addDelegate:self delegateQueue:nil];//实时通讯相关代理

还有ChatDemoHelper.hChatDemoHelper.m需要导入和注释的头文件。

ChatDemoHelper.h

ChatDemoHelper.m

对照着看,有几个类不需要,有几个是重新导入的。在ChatDemoHelper.m中需要注意的是

- (void)makeCallWithUsername:(NSString *)aUsername
                        type:(EMCallType)aType{}//发起视频

- (void)callDidReceive:(EMCallSession *)aSession{}//接收视频

这两个方法中的mainVC是找不到的,所有我要找到当前视图控制器,并让它作为父视图,模态弹出CallViewController,如下图所示。

找到当前视图控制器

修改的差不多了,我们就在MainViewController.mviewDidLoad中初始化ChatDemoHelper贴上代码[ChatDemoHelper shareHelper];(在程序进入的第一个视图控制器中初始化)
然后运行代码,调试一波,发现功能是能实现了,但是UI界面有点丑,并且没有来电铃声(虽然铃声相关的代码有)。然后我找到CallViewController .m修改了一波UI,并且自己在网上down了一段苹果来电铃声,并加了上去,差不多满足了需求。需要注意的是,铃声的播放要放在CallViewController.mviewDidAppear:(BOOL)animated中。

呼叫界面
视频通话界面

细节优化

1.程序在后台,添加推送消息并铃声提醒。具体操作如下:
ChatDemoHelper.m中找到- (void)callDidReceive:(EMCallSession *)aSession{}这个方法,并在这个方法里设置本地推送。

// 接收到视频 在方法开始的地方设置本地推送相关代码,原有代码不变。
- (void)callDidReceive:(EMCallSession *)aSession
{
    // 程序在后台
    if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) {
      
        UILocalNotification *notify = [[UILocalNotification alloc]init];
        NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
        notify.fireDate = fireDate;
        
        //时区
        notify.timeZone = [NSTimeZone defaultTimeZone];
        //通知内容
        // 将环信ID通过本地数据库匹配,找到真实的名字
        SaveMingYiModel *mingYiModel = [HaoYouDao selectedFromPeopleTableWithMDsfz:aSession.remoteName];
        
        
        NSString *stype =nil;
        if (aSession.type == EMCallTypeVoice) {
            
            stype = @"实时语音";
        }
        else if (aSession.type == EMCallTypeVideo){
           
            stype = @"视频通话";
        }
        NSString *notifyStr = [NSString stringWithFormat:@"%@向您发起%@",mingYiModel.docName,stype];
        
        notify.alertBody = notifyStr;
        
        // 如果你想震动的提示播放音乐的话就在下面填入你的音乐文件
        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后,需要添加这个注册,才能得到授权
        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(), ^{
             // 执行通知注册
            [[UIApplication sharedApplication] scheduleLocalNotification:notify];
        });
      
    }

//==========后台持续震动和播放铃声的方法============
void soundCompleteCallback(SystemSoundID sound,void * clientData) {
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);  //震动
    AudioServicesPlaySystemSound(sound);
}
//结束铃声
-(void)stopAlertSoundWithSoundID:(SystemSoundID)sound {
    AudioServicesDisposeSystemSoundID(kSystemSoundID_Vibrate);
}
//============end=================

然后在合适的地方结束震动和提醒铃声。比如在视频结束、接听、拒接、中断等方法中加上结束的代码。(代码中很容易找到相关方法)

//调用结束震动和提醒铃声的方法
 AudioServicesRemoveSystemSoundCompletion(kSystemSoundID_Vibrate);
   [self stopAlertSoundWithSoundID:sound];

代码实现的差不多了,效果图如下:

后台震动铃声提醒,并发送通知

**基于环信实现在线聊天功能 **

转载请注明出处

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容