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,本文发布在戴超的技术博客,转载请注明出处

Loading Disqus comments...
Table of Contents