Audio Session, bir uygulamanın ses davranışını yönetmek için iOS’un merkezi mekanizmasıdır: sistemle etkileşim, kesintileri yönetme ve ses yönlendirmesi. Her iOS uygulaması, ekran kilitlendiğinde, aramalar sırasında ve Bluetooth bağlantısında sesin nasıl davranacağını belirleyen tek bir ses oturumu alır. Apple Developer Documentation, 2026’ya göre, Audio Session bir kategori ve mod aracılığıyla yapılandırılır — doğru yapılandırma olmadan uygulama arka planda ses çalamayabilir.
Kilit Noktalar
Audio Session, bir uygulama başlatıldığında sistem tarafından oluşturulan ve tüm yaşam döngüsü boyunca var olan tek bir AVAudioSession örneğidir. Uygulama ile iOS ses sistemi arasında bir aracı görevi görür: kategori yapılandırması, uygulamanın arka planda ses çalmasına izin verilip verilmediğini, bir arama sırasında sesin kısılıp kısılmayacağını ve hangi cihazlara ses çıkışı yapılacağını belirler.
Her uygulamanın bağımsız olarak odak talep edip serbest bıraktığı Android Audio Focus’un aksine, iOS Audio Session uygulama başına bir oturum aracılığıyla merkezi olarak yönetilir. Bir oturum etkinleştirildiğinde, sistem otomatik olarak önceki uygulamanın oturumunu devre dışı bırakır ve ona bir kesinti bildirimi gönderir. Bu mimari fark, iki platformda ses işleme konusundaki farklı yaklaşımları tanımlar.
WWDC 2024 Oturum 211’e göre, iOS uygulamalarındaki ses sorunlarının yaklaşık %40’ı yanlış Audio Session yapılandırmasından kaynaklanır. En yaygın hata, playback yerine ambient kategorisini seçmektir ve bu da ekran kilitlendiğinde sesin kaybolmasına neden olur.
Başlatıldığında, uygulama oturumun sharedInstance’ını alır, setCategory(_:mode:options:) çağrısıyla kategoriyi ayarlar ve setActive(true) aracılığıyla oturumu etkinleştirir. Etkinleştirmeden sonra iOS, yönlendirme için kategori politikalarını dikkate alır. Başka bir uygulama oturumunu etkinleştirirse, mevcut uygulama Notification.Name.AVAudioSessionInterruption aracılığıyla bir AudioSessionInterruptionType.began bildirimi alır.
Kategori, Audio Session’ın altı önceden tanımlanmış davranış seçeneğini tanımlayan ana parametresidir. Kategori seçmek, iOS’ta ses ayarları yaparken ilk ve en önemli karardır.
| Kategori | Ne Zaman Kullanılır | Arka Plan Sesi | Sessiz Anahtarı Etkiler |
|---|---|---|---|
| ambient | Oyunlar, arka plan efektleri | Hayır | Evet |
| playback | Müzik, podcast, sesli kitaplar | Evet | Hayır |
| record | Ses kaydı, sesli notlar | Hayır | Yok |
| playAndRecord | VoIP, sesli mesajlar | Evet | Hayır |
| multiRoute | DJ mikserleri, karaoke | Evet | Hayır |
| soloAmbient | Varsayılan (iOS default) | Hayır | Evet |
Müzik ve video oynatıcıları için her zaman playback kullanın. Bu kategori şunlara izin verir: ekran kilitliyken, sessiz anahtarı kapalıyken (iPhone’daki fiziksel düğme) ve uygulama arka plandayken ses çalma. playback kategorisi olmadan, ekran kilitlendiğinde veya uygulama küçültüldüğünde oturum devre dışı bırakılır.
ambient kategorisi oyunlar ve arka plan sesleri olan uygulamalar için uygundur — diğer uygulamaların çalmaya devam etmesine izin verir. Örneğin, bir kullanıcı müzik dinliyorsa ve ambient oturumu olan bir oyun açarsa, müzik oyun seslerinin üzerinde çalmaya devam eder. Bu, Android’den temel bir farktır; Android’de böyle bir senaryo açık duck izni gerektirir.
Audio Session yapılandırması, herhangi bir oynatma başlamadan önce yapılmalıdır. Oturumun application(_:didFinishLaunchingWithOptions:) yönteminde veya oynatıcının başlatıcısında yapılandırılması önerilir. Kategori ayarlandıktan sonra oturum etkinleştirilmelidir.
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Audio Session yapılandırması başarısız: \(error.localizedDescription)")
}
options parametresi, allowBluetooth (Bluetooth kulaklığa çıkış) ve defaultToSpeaker (kulaklık yerine hoparlörden çalma) içerir. allowBluetooth seçeneği, Bluetooth kulaklıkları destekleyen uygulamalar için zorunludur — bu seçenek olmadan, kulaklık bağlı olsa bile ses dahili hoparlöre yönlendirilebilir.
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
voiceChat modundaki playAndRecord kategorisi, sesli iletişim için ses yolunu optimize eder: yankı önlemeyi, otomatik kazanç kontrolünü (AGC) etkinleştirir ve en uygun kodeki seçer. OverrideOutputAudioPort(.speaker), kulaklık bağlı olsa bile hoparlörden çıkışı zorlar — hoparlör için kullanışlıdır.
setActive(true) çağrısı oturumu etkinleştirir ve sisteme uygulamanın ses kullanacağını bildirir. Oynatma duraklatıldığında, diğer uygulamaların ses akışını alabilmesi için oturumun devre dışı bırakılması önerilir. İstisna, oturumun tüm parça boyunca aktif kaldığı uzun süreli arka plan oynatması (müzik, podcast) olan uygulamalardır.
setActive çağrısında hataları yönetmek önemlidir. Yüksek öncelikli başka bir oturum aktifse (örneğin, arama sırasında Telefon), setActive bir hata verebilir. Bu durumda, AudioSessionInterruptionType.ended bildirimini bekleyin ve etkinleştirmeyi yeniden deneyin.
Mod, kategoriyi hassaslaştırır ve belirli bir kullanım durumu için ses yolunu optimize eder. Her mod, AGC, yankı önleme ve kodeklerin davranışını değiştirir. Modlar kategoriyi değiştirmez, tamamlar — bir kategori farklı modlarla çalışabilir.
Seçenekler, oturum davranışının ince ayarını sağlar. Her seçenek, bir dizide diğerleriyle birleştirilebilen bir bayraktır. Örneğin, [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] Bluetooth kulaklığa ses çıkışına izin verir, varsayılan olarak hoparlörü kullanır ve sesli kitaplarla karıştırır.
iOS 17+ üzerinde, AVAudioSessionSpatialPreferences aracılığıyla AirPods için kişiselleştirilmiş uzamsal sesi etkinleştiren spatialAudio seçeneği ortaya çıktı. WWDC 2024’e göre, uzamsal ses Apple’ın testlerinde müzik uygulamalarında kullanıcı katılımını %25 artırır.
Kesintiler, Audio Session ve Android Audio Focus arasındaki temel bir farktır. iOS’ta, kesintiler NotificationCenter aracılığıyla AVAudioSession.interruptionNotification’a abone olunarak yönetilir. Bildirim, kesinti türünü içeren bir sözlük içerir: began veya 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()
}
}
interruptionType.began alındığında, oynatıcı oynatmayı duraklatmalıdır. interruptionType.ended alındığında, interruptionOptionKey özelliği oynatıcının otomatik olarak devam edip edemeyeceğini (shouldResume) belirtir. Kullanıcı aramayı reddettiyse, shouldResume = true. Arama zaman aşımıyla sona erdiyse — shouldResume = false, devama izin verilmez.
Başka bir uygulama playback kategorisiyle Audio Session’unu etkinleştirdiğinde, mevcut oturum bir kesinti bildirimi alır. Başka bir uygulama ambient kullanırsa, kesinti oluşmaz — sesler karıştırılır. Bu davranış, herhangi bir Audio Focus etkinleştirmesinin LOSS olayını tetiklediği Android’den kökten farklıdır.
Diğer oturumlar etkinleştirildiğinde oynatmaya devam etmesi gereken uygulamalar için (örneğin, müzik êlarken navigasyon), .mixWithOthers seçeneğini kullanın. Bu seçenek, diğer uygulamalarla ses karıştırmaya izin verir ve hiçbir kesinti gönderilmez. MixWithOthers, Android’deki duck modunun iOS karşılığıdır.
Audio Session, dahili hoparlörler, kulaklıklar, Bluetooth kulaklıklar ve AirPlay cihazları arasında ses yönlendirmesini otomatik olarak yönetir. Uygulama, currentRoute özelliği aracılığıyla mevcut yolu izleyebilir ve AVAudioSession.routeChangeNotification aracılığıyla değişiklikler hakkında bildirim alabilir.
Bluetooth kulaklıklar bağlandığında, oturum allowBluetooth seçeneğiyle yapılandırılmışsa, iOS otomatik olarak ses çıkışını onlara yönlendirir. Bu seçenek olmadan, ses dahili hoparlörden devam eder. iOS 16’dan itibaren, AirPods Pro bağlandığında, sistem gecikmeyi azaltmak için otomatik olarak ProMotion senkronizasyonunu etkinleştirir.
routeChangeNotification’a abone olmak, kulaklık bağlantısı ve bağlantı kesilmesine tepki vermeyi sağlar. Bir Bluetooth kulaklık bağlantısı kesildiğinde, oynatıcı oynatmayı duraklatmalıdır — kullanıcı telefon hoparlöründen ses gelmeye başlamasını beklemeyebilir. Apple HIG (2026)’ya göre, bu müzik uygulamaları için zorunlu bir davranıştır.
availableInputs ve availableOutputs özellikleri, türleriyle (builtInSpeaker, headphones, bluetoothA2DP, hdmi) birlikte kullanılabilir ses cihazlarının bir listesini döndürür. Geliştirici, özel yönlendirme senaryoları için overrideOutputAudioPort aracılığıyla programlama yoluyla belirli bir cihazı seçebilir.
Sıkça Sorulan Sorular
Temel fark mimaridir. Audio Session, uygulama başına bir kez yapılandırılan tek bir merkezi oturumdur. Android’de Audio Focus, her oynatmada manuel olarak odak talep etmeyi gerektirir. Ayrıca iOS, mixWithOthers seçeneği aracılığıyla karıştırmayı desteklerken, Android’de duck tam durdurmanın tek alternatifidir.
En yaygın neden yanlış bir Audio Session kategorisidir. ambient veya soloAmbient seçilirse, ekran kilitlendiğinde ses durur. Kategoriyi playback’e değiştirin ve Info.plist’e Background Modes — Audio, AirPlay, and Picture in Picture eklendiğinden emin olun.
setCategory’ye .mixWithOthers seçeneğini ekleyin. Bu, uygulamanızın sesinin diğer aktif oturumlarla karışmasına izin verir. Bu seçenek olmadan, yeni bir uygulama mevcut olanı kesintiye uğratır. MixWithOthers, Android’deki duck modunun benzeridir ancak tam ses seviyesi korumasıyla.
Otomatik seçim için nil ile overrideOutputAudioPort kullanın. Bluetooth’a zorunlu çıkış için: availableOutputs’tan AVAudioSessionRouteDescription alın, .bluetoothA2DP türünde bir port seçin ve overrideOutputAudioPort’a iletin. Oturumun allowBluetooth ile yapılandırıldığından emin olun.
Çoğu uygulama için — evet. Duraklatmada oturumu devre dışı bırakmak, diğer uygulamaların ses odağını almasına izin verir. İstisna, uzun süreli arka plan oynatması olan müzik oynatıcılarıdır. Duraklatma kısaysa (5 saniyeden az), hızlı devam için oturumu aktif tutmak daha iyidir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun