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 — 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.
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 — 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.
| Kategori | Kapan digunakan | Audio latar belakang | Redam saat mute |
|---|---|---|---|
| ambient | Game, efek latar belakang | Tidak | Ya |
| playback | Musik, podcast, buku audio | Ya | Tidak |
| record | Alat perekam, rekaman suara | Tidak | T/T |
| playAndRecord | VoIP, pesan suara | Ya | Tidak |
| multiRoute | Mixer DJ, karaoke | Ya | Tidak |
| soloAmbient | Standar (iOS default) | Tidak | Ya |
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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
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.
Baca juga