APP内通话录音的探索
APP内通话录音的探索
前言
今天公司需要调研下,app内部进行拨号通话录音的功能是怎么实现的。花了半天的时间,还尝试使用了CoreTelephony.framework,得到的结论是:
- iOS 系统自带的通话是没有录音的功能的
- CoreTelephony可以实现的功能有:获取到运营商的信息、系统通话的状态(呼叫中、通话中、通话结束)
- 存在通话录音的APP,如阿里通等;都是网络电话二次开发,不是基于系统的通话
网上存在一种解决方法,使用CoreTelephony框架的callEventHandler属性,当呼叫进入时拦截,然后使用AVAudioRecorder来录制人的声音。存在缺点,在通话时,callEventHandler的回调只有在我们的应用程序处于前台的情况下才会起作用。本想着在这不完美的情况下实现这个功能,但是测试发现,系统通话时,AVAudioRecorder根本无法录制。
下面我把调研过程中,CoreTelephony和AVAudioRecorder的使用整理一下。
- 使用 CoreTelephony 框架获取当前网络运营商、监听系统打电话事件与状态获取
var callCenter: CTCallCenter
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
callCenter = CTCallCenter()
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
/**
注意:
不要使用模拟器调试
使用SIM卡的真机调试
*/
func getCarrierInfo() {
let info: CTTelephonyNetworkInfo = CTTelephonyNetworkInfo()
print(info)
let carrier: CTCarrier = info.subscriberCellularProvider!
print(carrier)
print(info.currentRadioAccessTechnology!)
print(carrier.carrierName!)
print(carrier.mobileCountryCode!)
print(carrier.mobileNetworkCode!)
}
/**
注意:
使用SIM卡的真机调试
另一台手机呼叫此设备时,能看到打印的信息
*/
func setupCallEventHandler() {
callCenter.callEventHandler = { call in
if call.callState == CTCallStateDialing {
print("正在播出电话")
} else if call.callState == CTCallStateIncoming {
print("来电话了")
} else if call.callState == CTCallStateConnected {
print("电话通了")
} else if call.callState == CTCallStateDisconnected {
print("电话挂断了")
} else {
print("什么也没做")
}
}
}
源码见:
AVAudioRecorder录音与播放
我已经把录音的功能封装起来了,放在了github上了,分为Objective-C和Swift两个版本。
2017-09-22
今天又谈起了通话录音的话题,借鉴应用’阿里通’,说明网络电话录音的方案是可行的。准备考虑自己搭建网络通话,但是成本比较高。顺着这个想下去,存不存在第三方SDK可以实现网络通话呢?存不存在同时支持录音的网络通话SDK呢?最后发现还真是存在的。
最后
如果对大家有帮助,请github上follow和star,本文发布在戴超的技术博客,转载请注明出处