Audio Session — ο κεντρικός μηχανισμός του iOS για τη διαχείριση της ηχητικής συμπεριφοράς της εφαρμογής: αλληλεπίδραση με το σύστημα, χειρισμός διακοπών και δρομολόγηση ήχου. Κάθε εφαρμογή iOS λαμβάνει μία μοναδική ηχητική συνεδρία που καθορίζει πως συμπεριφέρεται ο ήχος κατά το κλείδωμα της οθόνης, τις κλήσεις και τη σύνδεση Bluetooth. Σύμφωνα με το Apple Developer Documentation, 2026, το Audio Session ρυθμίζεται μέσω κατηγορίας και λειτουργίας — χωρίς σωστή διαμόρφωση, η εφαρμογή ενδέχεται να μην αναπαράγει ήχο στο παρασκήνιο.
Βασικά σημεία
Audio Session — είναι ένα μοναδικό στιγμιότυπο AVAudioSession που δημιουργείται από το σύστημα κατά την εκκίνηση της εφαρμογής και υπάρχει καθ' όλη τη διάρκεια του κύκλου ζωής της. Λειτουργεί ως μεσάζων μεταξύ της εφαρμογής και του ηχητικού συστήματος iOS: η διαμόρφωση της κατηγορίας καθορίζει εάν η εφαρμογή επιτρέπεται να αναπαράγει ήχο στο παρασκήνιο, εάν ο ήχος θα σβήνει κατά τη διάρκεια μιας κλήσης και σε ποιες συσκευές θα εξάγεται ο ήχος.
Σε αντίθεση με το Android Audio Focus, όπου κάθε εφαρμογή ανεξάρτητα ζητά και απελευθερώνει εστίαση, το iOS Audio Session διαχειρίζεται κεντρικά μέσω μιας συνεδρίας ανά εφαρμογή. Κατά την ενεργοποίηση της συνεδρίας, το σύστημα απενεργοποιεί αυτόματα τη συνεδρία της προηγούμενης εφαρμογής, στέλνοντάς της ειδοποίηση διακοπής. Αυτή η αρχιτεκτονική διαφορά καθορίζει διαφορετική προσέγγιση στο χειρισμό ήχου στις δύο πλατφόρμες.
Σύμφωνα με το WWDC 2024 Session 211, περίπου το 40% των προβλημάτων ήχου σε εφαρμογές iOS προκαλούνται από εσφαλμένη διαμόρφωση του Audio Session. Το πιο συνηθισμένο λάθος — η επιλογή της κατηγορίας ambient αντί για playback, με αποτέλεσμα ο ήχος να εξαφανίζεται κατά το κλείδωμα της οθόνης.
Κατά την εκκίνηση, η εφαρμογή λαμβάνει το sharedInstance της συνεδρίας, ορίζει την κατηγορία μέσω της κλήσης setCategory(_:mode:options:) και ενεργοποιεί τη συνεδρία μέσω του setActive(true). Μετά την ενεργοποίηση, το iOS λαμβάνει υπόψη τις πολιτικές κατηγορίας για τη δρομολόγηση. Εάν μια άλλη εφαρμογή ενεργοποιεί τη δική της συνεδρία, η τρέχουσα λαμβάνει ειδοποίηση AudioSessionInterruptionType.began μέσω του Notification.Name.AVAudioSessionInterruption.
Κατηγορία — η κύρια παράμετρος του Audio Session, που καθορίζει έξι προκαθορισμένες παραλλαγές συμπεριφοράς. Η επιλογή κατηγορίας είναι η πρώτη και πιο σημαντική απόφαση κατά τη διαμόρφωση ήχου στο iOS.
| Κατηγορία | Πότε να χρησιμοποιείτε | Ήχος παρασκηνίου | Σίγαση στο mute |
|---|---|---|---|
| ambient | Παιχνίδια, εφέ παρασκηνίου | Όχι | Ναι |
| playback | Μουσική, podcasts, ηχητικά βιβλία | Ναι | Όχι |
| record | Μαγνητόφωνο, ηχογράφηση | Όχι | Δ/Ι |
| playAndRecord | VoIP, φωνητικά μηνύματα | Ναι | Όχι |
| multiRoute | Mixer DJ, καραόκε | Ναι | Όχι |
| soloAmbient | Προεπιλογή (iOS default) | Όχι | Ναι |
Για συσκευές αναπαραγωγής μουσικής και βίντεο, χρησιμοποιείτε πάντα playback. Αυτή η κατηγορία επιτρέπει: αναπαραγωγή ήχου με κλειδωμένη οθόνη, με απενεργοποιημένο το διακόπτη σίγασης (φυσικό κουμπί στο σώμα του iPhone) και με ελαχιστοποιημένη εφαρμογή. Χωρίς την κατηγορία playback, η συνεδρία απενεργοποιείται κατά το κλείδωμα της οθόνης ή την ελαχιστοποίηση της εφαρμογής.
Η κατηγορία ambient είναι κατάλληλη για παιχνίδια και εφαρμογές με ήχους παρασκηνίου — επιτρέπει σε άλλες εφαρμογές να συνεχίσουν την αναπαραγωγή. Για παράδειγμα, εάν ο χρήστης ακούει μουσική και ανοίγει ένα παιχνίδι με συνεδρία ambient, η μουσική συνεχίζει να παίζει πάνω από τους ήχους του παιχνιδιού. Αυτή είναι μια θεμελιώδης διαφορά από το Android, όπου ένα τέτοιο σενάριο απαιτεί ρητή άδεια duck.
Η διαμόρφωση του Audio Session πρέπει να εκτελείται πριν από την έναρξη οποιασδήποτε αναπαραγωγής. Συνιστάται η ρύθμιση της συνεδρίας στη μέθοδο application(_:didFinishLaunchingWithOptions:) ή στον αρχικοποιητή της συσκευής αναπαραγωγής. Μετά τη ρύθμιση της κατηγορίας, η συνεδρία πρέπει να ενεργοποιηθεί.
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Αποτυχία ρύθμισης Audio Session: \(error.localizedDescription)")
}
Η παράμετρος options περιλαμβάνει allowBluetooth (έξοδος σε ακουστικά Bluetooth) και defaultToSpeaker (αναπαραγωγή μέσω ηχείου, όχι μέσω ακουστικού). Η επιλογή allowBluetooth είναι υποχρεωτική για εφαρμογές που υποστηρίζουν ακουστικά Bluetooth — χωρίς αυτήν, ο ήχος μπορεί να εξάγεται μέσω του ενσωματωμένου ηχείου ακόμη και με συνδεδεμένα ακουστικά.
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
Η κατηγορία playAndRecord με λειτουργία voiceChat βελτιστοποιεί τη διαδρομή ήχου για φωνητική επικοινωνία: περιλαμβάνει καταστολή ηχούς, αυτόματο έλεγχο απολαβής (AGC) και επιλογή βέλτιστου κωδικοποιητή. Το OverrideOutputAudioPort(.speaker) εξαναγκάζει την έξοδο μέσω ηχείου ακόμη και με συνδεδεμένα ακουστικά — χρήσιμο για κλήσεις handsfree.
Η κλήση setActive(true) ενεργοποιεί τη συνεδρία και ειδοποιεί το σύστημα ότι η εφαρμογή θα χρησιμοποιήσει ήχο. Κατά την παύση της αναπαραγωγής, συνιστάται η απενεργοποίηση της συνεδρίας ώστε άλλες εφαρμογές να μπορούν να λάβουν τη ροή ήχου. Εξαίρεση — εφαρμογές με μακρά αναπαραγωγή στο παρασκήνιο (μουσική, podcasts), όπου η συνεδρία παραμένει ενεργή καθ' όλη τη διάρκεια του κομματιού.
Είναι σημαντικό να χειρίζεστε σφάλματα στο setActive. Εάν μια άλλη συνεδρία υψηλής προτεραιότητας είναι ενεργή (π.χ. Τηλέφωνο κατά τη διάρκεια κλήσης), το setActive μπορεί να προκαλέσει σφάλμα. Σε αυτήν την περίπτωση, πρέπει να περιμένετε την ειδοποίηση AudioSessionInterruptionType.ended και να επαναλάβετε την ενεργοποίηση.
Η λειτουργία (mode) διευκρινίζει την κατηγορία και βελτιστοποιεί τη διαδρομή ήχου για συγκεκριμένο τύπο χρήσης. Κάθε λειτουργία αλλάζει τη συμπεριφορά του AGC, της καταστολής ηχούς και των κωδικοποιητών. Οι λειτουργίες δεν αντικαθιστούν την κατηγορία, αλλά τη συμπληρώνουν — μία κατηγορία μπορεί να λειτουργήσει με διαφορετικές λειτουργίες.
Οι επιλογές παρέχουν λεπτομερή ρύθμιση της συμπεριφοράς της συνεδρίας. Κάθε επιλογή είναι μια σημαία που συνδυάζεται με άλλες σε έναν πίνακα. Για παράδειγμα, το [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] επιτρέπει την έξοδο ήχου σε ακουστικά Bluetooth, τη χρήση ηχείου από προεπιλογή και την ανάμειξη με ηχητικά βιβλία.
Στο iOS 17+ εμφανίστηκε η επιλογή spatialAudio, η οποία ενεργοποιεί εξατομικευμένο χωρικό ήχο για AirPods μέσω του AVAudioSessionSpatialPreferences. Σύμφωνα με το WWDC 2024, ο χωρικός ήχος αυξάνει την αφοσίωση των χρηστών εφαρμογών μουσικής κατά 25% σε δοκιμές της Apple.
Διακοπές (interruptions) — η βασική διαφορά μεταξύ Audio Session και Android Audio Focus. Στο iOS, οι διακοπές αντιμετωπίζονται μέσω του NotificationCenter με εγγραφή στο AVAudioSession.interruptionNotification. Η ειδοποίηση περιέχει ένα λεξικό με τον τύπο διακοπής: began ή 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, η συσκευή αναπαραγωγής πρέπει να διακόψει την αναπαραγωγή. Στο interruptionType.ended, η ιδιότητα interruptionOptionKey υποδεικνύει εάν η συσκευή αναπαραγωγής μπορεί να συνεχίσει αυτόματα (shouldResume). Εάν ο χρήστης τερμάτισε την κλήση, shouldResume = true. Εάν η κλήση έληξε λόγω χρονικού ορίου — shouldResume = false, η συνέχιση δεν επιτρέπεται.
Όταν μια άλλη εφαρμογή ενεργοποιεί το Audio Session της με κατηγορία playback, η τρέχουσα συνεδρία λαμβάνει ειδοποίηση διακοπής. Εάν η άλλη εφαρμογή χρησιμοποιεί ambient, η διακοπή δεν συμβαίνει — οι ήχοι αναμειγνύονται. Αυτή η συμπεριφορά διαφέρει ριζικά από το Android, όπου κάθε ενεργοποίηση του Audio Focus προκαλεί γεγονός LOSS.
Για εφαρμογές που πρέπει να συνεχίσουν την αναπαραγωγή κατά την ενεργοποίηση άλλων συνεδριών (π.χ. πλοήγηση ενώ παίζει μουσική), χρησιμοποιήστε την επιλογή .mixWithOthers. Αυτή η επιλογή επιτρέπει την ανάμειξη ήχου με άλλες εφαρμογές και οι διακοπές δεν αποστέλλονται. Το MixWithOthers — το αντίστοιχο iOS της λειτουργίας duck στο Android.
Το Audio Session διαχειρίζεται αυτόματα τη δρομολόγηση ήχου μεταξύ ενσωματωμένων ηχείων, ακουστικών, ακουστικών Bluetooth και συσκευών AirPlay. Η εφαρμογή μπορεί να παρακολουθεί την τρέχουσα διαδρομή μέσω της ιδιότητας currentRoute και να λαμβάνει ειδοποιήσεις αλλαγών μέσω του AVAudioSession.routeChangeNotification.
Κατά τη σύνδεση ακουστικών Bluetooth, το iOS αλλάζει αυτόματα την έξοδο ήχου σε αυτά, εάν η συνεδρία έχει ρυθμιστεί με την επιλογή allowBluetooth. Χωρίς αυτήν την επιλογή, ο ήχος συνεχίζει να ρέει μέσω του ενσωματωμένου ηχείου. Από το iOS 16, κατά τη σύνδεση AirPods Pro, το σύστημα ενεργοποιεί αυτόματα συγχρονισμό ProMotion για μείωση της καθυστέρησης.
Η εγγραφή στο routeChangeNotification επιτρέπει την αντίδραση στη σύνδεση και αποσύνδεση ακουστικών. Κατά την αποσύνδεση ακουστικών Bluetooth, η συσκευή αναπαραγωγής πρέπει να διακόψει την αναπαραγωγή — ο χρήστης μπορεί να μην αναμένει ότι ο ήχος θα αρχίσει να παίζει από το ηχείο του τηλεφώνου. Σύμφωνα με το Apple HIG (2026), αυτή είναι υποχρεωτική συμπεριφορά για εφαρμογές μουσικής.
Οι ιδιότητες availableInputs και availableOutputs επιστρέφουν μια λίστα διαθέσιμων συσκευών ήχου με τους τύπους τους (builtInSpeaker, headphones, bluetoothA2DP, hdmi). Ο προγραμματιστής μπορεί να επιλέξει προγραμματικά μια συγκεκριμένη συσκευή μέσω του overrideOutputAudioPort για προσαρμοσμένα σενάρια δρομολόγησης.
Συχνές ερωτήσεις
Η βασική διαφορά — αρχιτεκτονική. Το Audio Session είναι μια κεντρική συνεδρία ανά εφαρμογή, που ρυθμίζεται μία φορά. Το Audio Focus στο Android απαιτεί χειροκίνητη αίτηση εστίασης κάθε φορά κατά την αναπαραγωγή. Επιπλέον, το iOS υποστηρίζει ανάμειξη μέσω της επιλογής mixWithOthers, ενώ στο Android το duck είναι η μόνη εναλλακτική για πλήρη διακοπή.
Η πιο συνηθισμένη αιτία — εσφαλμένη κατηγορία Audio Session. Εάν έχει επιλεγεί ambient ή soloAmbient, ο ήχος σταματά κατά το κλείδωμα της οθόνης. Αλλάξτε την κατηγορία σε playback και βεβαιωθείτε ότι στο Info.plist έχει προστεθεί Background Modes — Audio, AirPlay, and Picture in Picture.
Προσθέστε την επιλογή .mixWithOthers στο setCategory. Αυτό θα επιτρέψει την ανάμειξη του ήχου της εφαρμογής σας με άλλες ενεργές συνεδρίες. Χωρίς αυτήν την επιλογή, η νέα εφαρμογή διακόπτει την τρέχουσα. Το MixWithOthers — το αντίστοιχο της λειτουργίας duck στο Android, αλλά με πλήρη διατήρηση της έντασης.
Χρησιμοποιήστε το overrideOutputAudioPort με nil για αυτόματη επιλογή. Για εξαναγκασμένη έξοδο σε Bluetooth: λάβετε AVAudioSessionRouteDescription από availableOutputs, επιλέξτε θύρα με τύπο .bluetoothA2DP και μεταβιβάστε την στο overrideOutputAudioPort. Βεβαιωθείτε ότι η συνεδρία έχει ρυθμιστεί με allowBluetooth.
Για τις περισσότερες εφαρμογές — ναι. Η απενεργοποίηση της συνεδρίας κατά την παύση επιτρέπει σε άλλες εφαρμογές να αποκτήσουν εστίαση ήχου. Εξαίρεση — συσκευές αναπαραγωγής μουσικής με μακρά αναπαραγωγή στο παρασκήνιο. Εάν η παύση είναι σύντομη (λιγότερο από 5 δευτερόλεπτα), καλύτερα να αφήσετε τη συνεδρία ενεργή για γρήγορη συνέχιση.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης