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

eimysty 发布于 2016/01/21 16:14
阅读 2K+
收藏 2
最近公司的一个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.在项目工程中添加依赖的库文件,如图:
 


代码实现步骤

关键代码一:初始化 SDK

Ps:首先要导入sdk的头文件

#import UCSService.h
#import UCSEvent.h
#import UCSCommonClass.h
Ps:初始化对象要保存好,后续的调用功能都是使用该对象去调用,不用每次调用功能都要创建一个对象。

初始化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];
}
看到这里也许会有人问发起呼叫时我如何知道对方的呼叫状态比如:对方来电、对方挂断、呼叫对方失败、 对方振铃 等状态。别急,关键代码五就回答这个问题

关键代码四:回调处理

当我们初始化、链接云平台、发起呼叫成功后都会有回调,回调的保存在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地址上,我想,估计云之讯布置了不止一个服务器基站来做通话中转,而且还可以根据网络情况提供最优的服务器。那这样的话,在不同地方,语音通话不受影响也就可以说得通了。




加载中
返回顶部
顶部