Я хотел бы добавить что-то к приведенным выше ответам.
Да, вы можете определять функции в файлах исходного кода (вне класса). Но лучше, если вы определяете статические функции внутри класса с помощью Companion Object, потому что вы можете добавить больше статических функций, используя расширения Kotlin.
class MyClass {
companion object {
//define static functions here
}
}
//Adding new static function
fun MyClass.Companion.newStaticFunction() {
// ...
}
И вы можете вызывать выше определенную функцию, как вы вызовете любую функцию внутри объекта Companion.
Существует специфическая проблема с аудио I / O и CallKit
. Когда вы собираетесь получать входящий вызов, вы должны настроить аудио сеанс для вызовов VoIP, но не активировать его, просто установить категорию, режим и буфер.
Пример настройки аудиосеанса для CallKit
входящего вызова:
func configureAudioSession() {
let sharedSession = AVAudioSession.sharedInstance()
do {
try sharedSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
try sharedSession.setMode(AVAudioSessionModeVoiceChat)
try sharedSession.setPreferredIOBufferDuration(TimeInterval(0.005))
try sharedSession.setPreferredSampleRate(44100.0)
} catch {
debugPrint("Failed to configure `AVAudioSession`")
}
}
Затем, когда вы отвечаете на входящий вызов, CallKit
активирует аудиосеанс для вас, и вы будете получить обратный вызов от CXProvider:
func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
// Start call audio I/O here
}
В этом обратном вызове делегата вы должны начать звук вызова, а не раньше. Если ввод / вывод аудио через WebRTC был запущен ранее, CallKit прервет его и звука не будет.