您的位置:首页 > 业界新闻

快速利用第三方平台SDK,实现点对点语音通话

2016-01-20 17:16 676 查看
最近公司的一个APP项目需要一个加一个互联网点对点语音功能,网上找了Linphone 研究了一个月发现这些开源库很强大也很优秀,支持平台广泛 windows, mac,ios,android,linux,但是代码量和结构实在庞大,坑爹的项目经理要求一个月把这个功能做出来,所以我暂时放弃考虑Linphone。况且我只需要语音通话功能,改一个Linphone 代价太大了。。。。废话少说入正题。 
准备工作分为三步:        
1.先去云之讯官网注册账号,并下载SDK,网址http://www.ucpaas.com/
2.登录云之讯官网后可以找到Account Sid 和AuthToken(在登录时使用)
3.注册账号成功后,云之讯提供了6个子账号用于体验,登录云之讯官网后,在应用管理—测试Demo—Demo应用信息下就找到了。
接下来我们看看如何调用云之讯SDK 1.然后将官网下载的 SDK导入刚才新建的工程(一个静态库,三个头文件),如图:
2.在项目工程中添加依赖的库文件,如图:
代码实现步骤 关键代码一:初始化 SDKPs:首先要导入sdk的头文件#import UCSService.h#import UCSEvent.h#import UCSCommonClass.hPs:初始化对象要保存好,后续的调用功能都是使用该对象去调用,不用每次调用功能都要创建一个对象。 初始化SDK的代码{//初始化UCS SDK,并传入代理实现的类实例UCSService* ucsService = [[UCSService alloc] initWithDelegate:self];//另一种初始化方式UCSService* ucsService = [[UCSService alloc] init];[ucsService setDelegate:self];}关键代码二:账号连接云平台Ps:将准备工作中2、3获取的账号填充到下面这个接口中,调用接口的对象是咱们上面初始化获得的对象,并且在初始化一段时间后调用,如果初始化就立即调用链接会导致崩溃,原因不明。[ucsCallService connect:accountSid withAccountToken:accountToken withClientNumber:clientNumber withClientPwd:clientPwd]关键代码三:发起语音通话 PS:发起通话一定要在云平台连接成功后。callType: 0(代表语音通话)calledNumber:7604100XXXXXXX(准备工作中4、获取的免费体验账号)-(void)startCall{//拨打语音通话(对方Client账号)[ucsCallService dial:callType andCalled:calledNumber];}到这里也许会有人问发起呼叫时我如何知道对方的呼叫状态比如:对方来电、对方挂断、呼叫对方失败、对方振铃 等状态。别急,关键代码五就回答这个问题。关键代码四:回调处理当我们初始化、链接云平台、发起呼叫成功后都会有回调,4000回调的保存在UCSEvent.h文件中,我们可以根据响应的情况实现回调接口。 代码编写完成后,编译错误,运行崩溃,如图:我仔细查看了一遍代码,并没有问题。这个问题我排查的好久。最后我重新阅读官方的开发指南并且仔细和官方下载的Demo工程比对了一下,发现我漏了两个配置(都怪我一开始没有仔细看官方开发指南。): 第一个是Required Background modes ,如图:这项配置的目的是苹果从iOS4开始,苹果增加了特性,很好的支持了语音通话功能,如果不配置这个选项的话,应用进入后台,就有可能接收不到来电了哟。 第二个是 Other Linker flags 中添加–ObjC,如图:这项配置作用是为了支持OC的类别特性。 加了这两项配置后,XCode编译,运行,登录无崩溃,点击语音通话呼叫按钮,成功。如图:
使用感受:
1、刚开始集成完sdk肯定是要测试一番的啦,在测试远距离通话过程中,由于我们跑得比较远,难免公司的wifi覆盖不到,这个时候肯定是要切换到手机网络的,我们本以为通话会断开,没想到,通话还可以继续,但是当我们把手机切换到飞行模式的时候,通话又立马断开了,我猜测,sdk内部应该是存在重连的,即使切换了网络,只要网络连接上了,通话还是可以继续的。
2、在我们产品上线后,收到不少用户反馈,当app被关闭了之后就会收不到电话了(有时候手机内存使用过多,会被系统回收app内存),当时还纳闷,app都关了,收不到来电不很正常嘛,简直就是无理取闹,但是项目经理对这个功能催得又急,不得已,又是一轮查找资料,发现,原来sdk还提供了一个推送续活的接口,完美解决了这个问题,就是通过推送消息,将来电信息推送过来,查看推送消息即可激活app接听电话。
3、由于本人工作的原因,偶尔会出差到外地,在拨打直拨或者语音通话的时候都是用自己的产品(账号里面都是免费分钟数,嘻嘻),这样可以节省不少话费。之前想自己搞一下语音通话这一块,了解了不少知识,知道语音通话这个是需要服务器中转的,如果你所在地的网络基站离服务器基站太远的话,有可能会有杂音和丢包等问题,但是在使用云之讯sdk,我发现,即使在不同的地方,语音质量依旧那么好。针对这个问题,我还特地抓包研究了好久,结果发现,切换不同的网络后,sdk的通话udp发包都会发到不同的ip地址上,我想,估计云之讯布置了不止一个服务器基站来做通话中转,而且还可以根据网络情况提供最优的服务器。那这样的话,在不同地方,语音通话不受影响也就可以说得通了。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息