Audio Session — apa itu, kategori dan konfigurasi di iOS

Penulis: IT Sectr Diterbitkan: 2026-05-24 Waktu membaca: 8 mnt

Audio Session — mekanisme sentral iOS untuk mengelola perilaku audio aplikasi: interaksi dengan sistem, penanganan interupsi, dan perutean suara. Setiap aplikasi iOS menerima satu sesi audio yang menentukan bagaimana suara berperilaku saat layar dikunci, panggilan, dan koneksi Bluetooth. Menurut Apple Developer Documentation, 2026, Audio Session dikonfigurasi melalui kategori dan mode — tanpa konfigurasi yang benar, aplikasi mungkin tidak dapat memutar suara di latar belakang.

Poin utama

  • Audio Session (AVAudioSession) — objek sistem iOS yang mengelola perilaku audio aplikasi pada tingkat sistem operasi.
  • Kategori sesi menentukan perilaku dasar: playback, record, ambient, playAndRecord dan lainnya.
  • Mode dan opsi memperjelas perilaku: default, voiceChat, videoRecording, allowBluetooth.
  • Saat interupsi (panggilan, alarm) sesi menerima pemberitahuan melalui NotificationCenter dengan tipe interruptionType.
  • Untuk pemutaran di latar belakang, perlu mengaktifkan Background Modes — Audio, AirPlay and Picture in Picture.

Apa itu Audio Session?

Audio Session — adalah satu instance AVAudioSession yang dibuat oleh sistem saat aplikasi dijalankan dan ada sepanjang siklus hidupnya. Ini bertindak sebagai perantara antara aplikasi dan sistem audio iOS: konfigurasi kategori menentukan apakah aplikasi diizinkan memutar suara di latar belakang, apakah suara akan diredam saat panggilan, dan ke perangkat mana audio akan dikeluarkan.

Tidak seperti Android Audio Focus, di mana setiap aplikasi secara independen meminta dan melepaskan fokus, iOS Audio Session dikelola secara terpusat melalui satu sesi per aplikasi. Saat sesi diaktifkan, sistem secara otomatis menonaktifkan sesi aplikasi sebelumnya, mengirimkan pemberitahuan interupsi. Perbedaan arsitektur ini menentukan pendekatan yang berbeda dalam penanganan audio di dua platform.

Menurut WWDC 2024 Session 211, sekitar 40% masalah audio di aplikasi iOS disebabkan oleh konfigurasi Audio Session yang salah. Kesalahan paling umum — memilih kategori ambient daripada playback, yang menyebabkan suara hilang saat layar dikunci.

Prinsip kerja AVAudioSession

Saat dijalankan, aplikasi mendapatkan sharedInstance sesi, mengatur kategori melalui panggilan setCategory(_:mode:options:) dan mengaktifkan sesi melalui setActive(true). Setelah aktivasi, iOS mempertimbangkan kebijakan kategori untuk perutean. Jika aplikasi lain mengaktifkan sesinya, aplikasi saat ini menerima pemberitahuan AudioSessionInterruptionType.began melalui Notification.Name.AVAudioSessionInterruption.

Kategori Audio Session

Kategori — parameter utama Audio Session, yang menentukan enam varian perilaku yang telah ditentukan sebelumnya. Pemilihan kategori adalah keputusan pertama dan terpenting dalam konfigurasi audio di iOS.

KategoriKapan digunakanAudio latar belakangRedam saat mute
ambientGame, efek latar belakangTidakYa
playbackMusik, podcast, buku audioYaTidak
recordAlat perekam, rekaman suaraTidakT/T
playAndRecordVoIP, pesan suaraYaTidak
multiRouteMixer DJ, karaokeYaTidak
soloAmbientStandar (iOS default)TidakYa

Kategori playback — pilihan utama untuk pemutar

Untuk pemutar musik dan video, selalu gunakan playback. Kategori ini memungkinkan: memutar suara dengan layar terkunci, dengan sakelar mute mati (tombol fisik di bodi iPhone) dan dengan aplikasi diminimalkan. Tanpa kategori playback, sesi akan dinonaktifkan saat layar dikunci atau aplikasi diminimalkan.

Kategori ambient cocok untuk game dan aplikasi dengan suara latar — memungkinkan aplikasi lain untuk melanjutkan pemutaran. Misalnya, jika pengguna mendengarkan musik dan membuka game dengan sesi ambient, musik terus diputar di atas suara game. Ini adalah perbedaan fundamental dengan Android, di mana skenario seperti itu memerlukan izin duck eksplisit.

Cara mengatur Audio Session

Konfigurasi Audio Session harus dilakukan sebelum pemutaran apa pun dimulai. Disarankan untuk mengonfigurasi sesi di metode application(_:didFinishLaunchingWithOptions:) atau di inisialisasi pemutar. Setelah mengkonfigurasi kategori, sesi perlu diaktifkan.

Konfigurasi dasar Audio Session di Swift

swift
import AVFAudio

let session = AVAudioSession.sharedInstance

do {
    try session.setCategory(
        playback,
        mode: default,
        options: [allowBluetooth, defaultToSpeaker]
    )
    try session.setActive(true)
} catch {
    print("Pengaturan Audio Session gagal: \(error.localizedDescription)")
}

Parameter options mencakup allowBluetooth (output ke headset Bluetooth) dan defaultToSpeaker (pemutaran melalui speaker, bukan lubang suara). Opsi allowBluetooth wajib untuk aplikasi yang mendukung headphone Bluetooth — tanpanya, suara dapat dikeluarkan melalui speaker internal bahkan saat headset terhubung.

Konfigurasi untuk perekaman dan pemutaran (VoIP)

swift
let session = AVAudioSession.sharedInstance
try session.setCategory(
    playAndRecord,
    mode: voiceChat,
    options: [allowBluetooth, allowBluetoothA2DP]
)

try session.overrideOutputAudioPort(speaker)
try session.setActive(true)

Kategori playAndRecord dengan mode voiceChat mengoptimalkan jalur audio untuk komunikasi suara: termasuk penekanan gema, pengaturan penguatan otomatis (AGC), dan pemilihan codec optimal. OverrideOutputAudioPort(.speaker) memaksa output melalui speaker bahkan dengan headset terhubung — berguna untuk panggilan handsfree.

Aktivasi dan deaktivasi sesi

Panggilan setActive(true) mengaktifkan sesi dan memberi tahu sistem bahwa aplikasi akan menggunakan audio. Saat pemutaran dijeda, disarankan untuk menonaktifkan sesi agar aplikasi lain bisa mendapatkan aliran audio. Pengecualian — aplikasi dengan pemutaran latar belakang yang lama (musik, podcast), di mana sesi tetap aktif sepanjang lagu.

Penting untuk menangani kesalahan saat setActive. Jika sesi lain dengan prioritas tinggi aktif (misalnya, Telepon selama panggilan), setActive dapat menghasilkan kesalahan. Dalam hal ini, perlu menunggu pemberitahuan AudioSessionInterruptionType.ended dan mengulangi aktivasi.

Mode dan kebijakan Audio Session

Mode memperjelas kategori dan mengoptimalkan jalur audio untuk jenis penggunaan tertentu. Setiap mode mengubah perilaku AGC, penekanan gema, dan codec. Mode tidak menggantikan kategori, tetapi melengkapinya — satu kategori dapat bekerja dengan mode yang berbeda.

  • default — mode standar untuk musik dan video. AGC dimatikan, penekanan gema minimal.
  • voiceChat — optimalisasi untuk VoIP. Termasuk penekanan gema, AGC, pengurangan kebisingan. Gunakan dengan kategori playAndRecord.
  • videoRecording — untuk perekaman video. Prioritas kualitas rekaman di atas pemutaran. Gunakan dengan kategori record atau playAndRecord.
  • measurement — untuk pengukuran audio. Pemrosesan sinyal minimal, tanpa AGC atau penekanan gema.
  • gameChat — untuk obrolan suara dalam game. Mirip dengan voiceChat, tetapi dengan prioritas suara game.
  • moviePlayback — untuk menonton film. Optimalisasi untuk audio multi-saluran (5.1, 7.1) dan Dolby Atmos.

Opsi kategori Audio Session

Opsi memberikan penyesuaian halus pada perilaku sesi. Setiap opsi adalah bendera yang digabungkan dengan yang lain dalam array. Misalnya, [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] memungkinkan output suara ke headset Bluetooth, menggunakan speaker secara default, dan mencampur dengan buku audio.

Di iOS 17+ muncul opsi spatialAudio, yang mengaktifkan suara spasial yang dipersonalisasi untuk AirPods melalui AVAudioSessionSpatialPreferences. Menurut WWDC 2024, suara spasial meningkatkan keterlibatan pengguna aplikasi musik sebesar 25% dalam pengujian Apple.

Penanganan interupsi dan panggilan

Interupsi (interruptions) — perbedaan utama antara Audio Session dan Android Audio Focus. Di iOS, interupsi ditangani melalui NotificationCenter dengan berlangganan AVAudioSession.interruptionNotification. Pemberitahuan berisi kamus dengan tipe interupsi: began atau ended.

Berlangganan pemberitahuan interupsi

swift
override func viewDidLoad() {
    super.viewDidLoad()
    let center = NotificationCenter.default
    center.addObserver(
        self,
        selector: #selector(handleInterruption),
        name: AVAudioSession.interruptionNotification,
        object: nil
    )
}

@objc func handleInterruption(_ notification: Notification) {
    guard let userInfo = notification.userInfo,
        let type = userInfo[AVAudioSession.interruptionTypeKey]
            as? AVAudioSessionInterruptionType
    else { return }

    switch type {
    case began:
        pausePlayback()
    case ended:
        guard let options = userInfo[AVAudioSession.interruptionOptionKey]
            as? AVAudioSessionInterruptionOptions
        else { return }

        if options.contains(shouldResume) {
            resumePlayback()
        }
    }

Saat menerima interruptionType.began, pemutar harus menjeda pemutaran. Pada interruptionType.ended, properti interruptionOptionKey menunjukkan apakah pemutar dapat melanjutkan secara otomatis (shouldResume). Jika pengguna menutup panggilan, shouldResume = true. Jika panggilan berakhir karena timeout — shouldResume = false, melanjutkan tidak diizinkan.

Penanganan interupsi dari aplikasi lain

Ketika aplikasi lain mengaktifkan Audio Session-nya dengan kategori playback, sesi saat ini menerima pemberitahuan interupsi. Jika aplikasi lain menggunakan ambient, interupsi tidak terjadi — suara dicampur. Perilaku ini sangat berbeda dengan Android, di mana setiap aktivasi Audio Focus menyebabkan peristiwa LOSS.

Untuk aplikasi yang harus melanjutkan pemutaran saat aktivasi sesi lain (misalnya, navigasi saat musik diputar), gunakan opsi .mixWithOthers. Opsi ini mengizinkan pencampuran suara dengan aplikasi lain, dan interupsi tidak dikirim. MixWithOthers — padanan iOS dari mode duck di Android.

Perutean suara dan Bluetooth

Audio Session secara otomatis mengelola perutean suara antara speaker internal, headphone, headset Bluetooth, dan perangkat AirPlay. Aplikasi dapat melacak rute saat ini melalui properti currentRoute dan menerima pemberitahuan perubahan melalui AVAudioSession.routeChangeNotification.

Saat headphone Bluetooth terhubung, iOS secara otomatis mengalihkan output audio ke headphone tersebut jika sesi dikonfigurasi dengan opsi allowBluetooth. Tanpa opsi ini, suara terus mengalir melalui speaker internal. Mulai iOS 16, saat menghubungkan AirPods Pro, sistem secara otomatis mengaktifkan sinkronisasi ProMotion untuk mengurangi latensi.

Pemantauan perubahan rute

Berlangganan routeChangeNotification memungkinkan bereaksi terhadap koneksi dan pemutusan headphone. Saat headset Bluetooth terputus, pemutar harus menjeda pemutaran — pengguna mungkin tidak mengharapkan suara mulai diputar dari speaker telepon. Menurut Apple HIG (2026), ini adalah perilaku wajib untuk aplikasi musik.

Properti availableInputs dan availableOutputs mengembalikan daftar perangkat audio yang tersedia dengan tipenya (builtInSpeaker, headphones, bluetoothA2DP, hdmi). Pengembang dapat secara programatis memilih perangkat tertentu melalui overrideOutputAudioPort untuk skenario perutean kustom.

Pertanyaan yang sering diajukan

Apa perbedaan Audio Session dengan Android Audio Focus?

Perbedaan utama — arsitektur. Audio Session adalah satu sesi terpusat per aplikasi, yang dikonfigurasi sekali. Audio Focus di Android memerlukan permintaan fokus manual setiap kali pemutaran. Selain itu, iOS mendukung pencampuran melalui opsi mixWithOthers, sementara di Android duck adalah satu-satunya alternatif untuk penghentian total.

Mengapa suara hilang saat layar iPhone dikunci?

Penyebab paling umum — kategori Audio Session yang salah. Jika ambient atau soloAmbient dipilih, suara berhenti saat layar dikunci. Ganti kategori ke playback dan pastikan Info.plist telah ditambahkan Background Modes — Audio, AirPlay, and Picture in Picture.

Bagaimana cara mengizinkan dua aplikasi bermain bersamaan di iOS?

Tambahkan opsi .mixWithOthers di setCategory. Ini akan mengizinkan pencampuran suara aplikasi Anda dengan sesi aktif lainnya. Tanpa opsi ini, aplikasi baru akan menginterupsi aplikasi saat ini. MixWithOthers — padanan mode duck di Android, tetapi dengan volume yang dipertahankan sepenuhnya.

Bagaimana cara mengalihkan suara secara programatis ke speaker Bluetooth?

Gunakan overrideOutputAudioPort dengan nil untuk pemilihan otomatis. Untuk output paksa ke Bluetooth: dapatkan AVAudioSessionRouteDescription dari availableOutputs, pilih port dengan tipe .bluetoothA2DP dan berikan ke overrideOutputAudioPort. Pastikan sesi dikonfigurasi dengan allowBluetooth.

Apakah perlu memanggil setActive(false) saat menjeda pemutar?

Untuk sebagian besar aplikasi — ya. Menonaktifkan sesi saat jeda memungkinkan aplikasi lain mendapatkan fokus audio. Pengecualian — pemutar musik dengan pemutaran latar belakang yang lama. Jika jeda singkat (kurang dari 5 detik), lebih baik biarkan sesi tetap aktif untuk melanjutkan dengan cepat.

Kesimpulan

  • Audio Session (AVAudioSession) — satu sesi audio per aplikasi di iOS yang mengelola perilaku suara pada tingkat sistem operasi.
  • Enam kategori: ambient, playback, record, playAndRecord, multiRoute, soloAmbient — menentukan perilaku audio dasar.
  • Untuk pemutaran latar belakang, kategori playback dan Background Modes di Info.plist wajib.
  • Interupsi ditangani melalui NotificationCenter dengan tipe began (jeda) dan ended (lanjut saat shouldResume).
  • Opsi .mixWithOthers mengaktifkan pencampuran suara dengan aplikasi lain tanpa interupsi.
  • Perutean dikelola secara otomatis, tetapi dipantau melalui routeChangeNotification untuk menjeda saat headphone terputus.
  • Kategori playAndRecord dengan mode voiceChat — standar untuk aplikasi VoIP dengan penekanan gema dan AGC.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga