使用iOS核心电话框架进行呼叫录音

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用iOS核心电话框架进行呼叫录音相关的知识,希望对你有一定的参考价值。

我正在制作紧急应用程序。在紧急情况下,用户可以点击通话按钮。我已经使用核心电话来获取呼叫事件,如apple和AVFoundation框架所述,用于记录呼叫音频。这是我的代码:

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setupCallRecorder()
    }

func callConnected() {
        print("callConnected")
        self.audioRecorder?.record()
    }
    func callDisconnected() {
        print("callDisconnected")
        self.audioRecorder?.stop()
    }
    func setupCallRecorder() {

        let audiosession:AVAudioSession = AVAudioSession.sharedInstance()

        //ask for permission
        if (audioSession.respondsToSelector("requestRecordPermission:")) {
            AVAudioSession.sharedInstance().requestRecordPermission({(granted: Bool)-> Void in
                if granted {
                    print("granted")

                    //set category and activate recorder session
                    try! audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
                    try! audioSession.setActive(true)

                    //get documnets directory
                    let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
                    let soundFilePath = NSString(format: "%@/sound.caf", documentsDirectory)
                    let soundFileURL = NSURL.fileURLWithPath(soundFilePath as String)

                    //create AnyObject of settings
                    let settings: [String : AnyObject] = [
                        AVFormatIDKey:Int(kAudioFormatAppleIMA4), //Int required in Swift2
                        AVSampleRateKey:44100.0,
                        AVNumberOfChannelsKey:2,
                        AVEncoderBitRateKey:12800,
                        AVLinearPCMBitDepthKey:16,
                        AVEncoderAudioQualityKey:AVAudioQuality.Max.rawValue
                    ]

                    //record
                    try! self.audioRecorder = AVAudioRecorder(URL: soundFileURL, settings: settings)

                } else{
                    print("not granted")
                }
            })
        }

        let callCenter = CTCallCenter();
        callCenter.callEventHandler = { (call:CTCall!) in

            switch call.callState {
            case CTCallStateConnected:
                print("CTCallStateConnected")
                self.callConnected()
            case CTCallStateDisconnected:
                print("CTCallStateDisconnected")
                self.callDisconnected()
            default:
                //Not concerned with CTCallStateDialing or CTCallStateIncoming
                break
            }
        }
    }

但是当从应用程序启动调用(iOS默认调用功能)时,我的应用程序转到后台并且不调用调用事件处理程序块。我已经读过某个地方,只有当你的应用程序处于前台时才会调用/录音,所以我也试过在启动呼叫后将我的应用程序带到前台,但即使这样它也无法正常工作。现在我有以下问题/疑虑:

  1. 这是苹果不允许我们做的事情吗?
  2. 应用只能记录VOIP / SIP呼叫而不是默认呼叫?
  3. 这可以在不使用任何服务器技巧的情况下在iOS中记录呼叫吗?

注意:此应用不适用于越狱设备,我希望我的应用在应用商店上传。

答案
  1. 这是许多国家不允许的。 Apple根本不允许它,甚至没有任何私有API来做到这一点
  2. 应用程序可以记录他们想要的所有内容,因为他们会通知用户。蜂窝网络是完全不同的东西
  3. 不会。即使有越狱,您也必须将代码注入iOS音频堆栈的较低级别部分,并使用通过系统的原始音频流。

因此,你无法在App Store中获得类似的东西。

以上是关于使用iOS核心电话框架进行呼叫录音的主要内容,如果未能解决你的问题,请参考以下文章

iOS 实时录音和播放

我可以在后台观察来电和去电吗?

电话录音怎么保存起来

在 Cisco CUCM 的双方电话上启用录制时处理邀请

在电话呼叫 iOS sdk 期间播放音乐文件的问题

呼叫者没有从opentok ios sdk中的接收者获得结束呼叫事件