Как реализовать запись телефонного разговора в iOS-приложении?

Ответ

Технически возможно, но с юридическими и платформенными ограничениями.

Реализация (AVFoundation):

import AVFoundation

// 1. Настройка аудиосессии
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(.playAndRecord, mode: .voiceChat)
try audioSession.setActive(true)

// 2. Создание записи
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let recordingURL = documentsURL.appendingPathComponent("call_recording.m4a")

let recorder = try AVAudioRecorder(url: recordingURL, settings: [
    AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
    AVSampleRateKey: 44100,
    AVNumberOfChannelsKey: 2,
    AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
])

// 3. Запуск записи
recorder.record()

Критические ограничения:

  1. Правовые требования:

    • США: Федеральный закон требует одностороннего согласия (18 U.S.C. § 2511)
    • ЕС/РФ: Требуется двустороннее согласие всех участников
    • App Store Guidelines 5.1.1: Приложение должно явно запрашивать согласие и информировать о записи
  2. Технические ограничения iOS:

    • Нельзя записывать системный аудиопоток вызова через CallKit
    • Запись возможна только через микрофон устройства во время разговора
    • Качество записи зависит от режима аудиосессии

Рекомендации:

  • Используйте AVAudioSession.Mode.voiceChat для лучшего качества
  • Всегда сохраняйте записи в Documents/ с шифрованием
  • Добавьте звуковой сигнал о записи в соответствии с местным законодательством
  • Включите описание практики записи в Privacy Policy приложения

Ответ 18+ 🔞

Да ты посмотри, что за дичь! Технически-то записать звонок на iOS — да запросто, хули там. Берёшь этот AVFoundation, и вперёд. Но тут, сука, начинается настоящий цирк с юридическими обезьянами и платформенными цепями!

Смотри, вот тебе кусок кода, он рабочий, блядь:

import AVFoundation

// 1. Настройка аудиосессии
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(.playAndRecord, mode: .voiceChat)
try audioSession.setActive(true)

// 2. Создание записи
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let recordingURL = documentsURL.appendingPathComponent("call_recording.m4a")

let recorder = try AVAudioRecorder(url: recordingURL, settings: [
    AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
    AVSampleRateKey: 44100,
    AVNumberOfChannelsKey: 2,
    AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
])

// 3. Запуск записи
recorder.record()

Вроде всё просто, да? Записывай себе на здоровье. Ан нет, ёпта! Дальше вылезают такие подводные ебучие камни, что мама не горюй.

Во-первых, законы, блядь. Это ж пиздец полный. В Штатах, допустим, можно записывать, если ты сам в разговоре участвуешь — это типа одностороннее согласие. А попробуй в Европе или у нас в России так сделать! Там нужно, чтобы ВСЕ участники, блядь, знали и согласились. Иначе — здравствуй, статья. Ты представляешь? Звонишь ты бабе, говоришь: «Привет, я тебя записываю», а она тебе: «Иди нахуй, пидорас шерстяной». И всё, приехали.

А во-вторых, сама Apple, эта мартышлюшка, в своих App Store Guidelines прямо прописала: если твоё приложение записывает — ты должен, сука, написать об этом размером с полэкрана, спросить разрешения у юзера, и ещё в политике конфиденциальности расписать, куда эти записи летят. Без этого — нахуй из магазина выкинут, даже не попрощаются.

И технически, охуеть, не всё так гладко. Нельзя взять и тихо-мирно записать сам системный поток звонка через CallKit. Не-а, не дадут. Записывать будешь только через микрофон своего же телефона, пока говоришь. Качество, конечно, будет так себе, особенно если динамик хреновый.

Так что если вдруг задумал такое, то:

  • Ставь режим voiceChat — звук чутка лучше будет.
  • Прячь записи в папку Documents/ и шифруй их, а то мало ли.
  • И самое главное — делай, блядь, предупреждающий сигнал! Бип-бип-бип, мол, идёт запись, а то потом придётся оправдываться перед судом, как последний мудак.