Audio Session là cơ chế trung tâm của iOS để quản lý hành vi âm thanh của ứng dụng: tương tác với hệ thống, xử lý gián đoạn và định tuyến âm thanh. Mỗi ứng dụng iOS nhận một phiên âm thanh duy nhất xác định cách âm thanh hoạt động khi màn hình bị khóa, trong cuộc gọi và khi kết nối Bluetooth. Theo Tài liệu Nhà phát triển Apple, 2026, Audio Session được cấu hình thông qua danh mục và chế độ — nếu không cấu hình đúng, ứng dụng có thể không phát âm thanh trong nền.
Các điểm chính
Audio Session là một thể hiện AVAudioSession duy nhất được hệ thống tạo ra khi ứng dụng khởi chạy và tồn tại trong suốt vòng đời của nó. Nó hoạt động như một trung gian giữa ứng dụng và hệ thống âm thanh iOS: cấu hình danh mục xác định liệu ứng dụng có được phép phát âm thanh trong nền hay không, âm thanh có bị tắt tiếng trong cuộc gọi hay không và thiết bị nào sẽ xuất âm thanh.
Không giống như Android Audio Focus, nơi mỗi ứng dụng độc lập yêu cầu và giải phóng tiêu điểm, iOS Audio Session được quản lý tập trung thông qua một phiên cho mỗi ứng dụng. Khi một phiên được kích hoạt, hệ thống tự động hủy kích hoạt phiên của ứng dụng trước đó, gửi cho nó một thông báo gián đoạn. Sự khác biệt về kiến trúc này xác định các cách tiếp cận khác nhau để xử lý âm thanh trên hai nền tảng.
Theo Phiên 211 của WWDC 2024, khoảng 40% sự cố âm thanh trong ứng dụng iOS là do cấu hình Audio Session không chính xác. Lỗi phổ biến nhất là chọn danh mục ambient thay vì playback, khiến âm thanh biến mất khi màn hình bị khóa.
Khi khởi chạy, ứng dụng nhận sharedInstance của phiên, đặt danh mục qua lệnh gọi setCategory(_:mode:options:) và kích hoạt phiên qua setActive(true). Sau khi kích hoạt, iOS xem xét các chính sách danh mục để định tuyến. Nếu một ứng dụng khác kích hoạt phiên của nó, ứng dụng hiện tại nhận được thông báo AudioSessionInterruptionType.began qua Notification.Name.AVAudioSessionInterruption.
Danh mục là tham số chính của Audio Session, xác định sáu tùy chọn hành vi được xác định trước. Chọn danh mục là quyết định đầu tiên và quan trọng nhất khi thiết lập âm thanh trong iOS.
| Danh mục | Khi nào sử dụng | Âm thanh nền | Công tắc tắt tiếng ảnh hưởng |
|---|---|---|---|
| ambient | Trò chơi, hiệu ứng nền | Không | Có |
| playback | Nhạc, podcast, sách nói | Có | Không |
| record | Ghi âm giọng nói, ghi âm | Không | Không áp dụng |
| playAndRecord | VoIP, tin nhắn thoại | Có | Không |
| multiRoute | Bộ trộn DJ, karaoke | Có | Không |
| soloAmbient | Mặc định (iOS default) | Không | Có |
Đối với trình phát nhạc và video, luôn sử dụng playback. Danh mục này cho phép: phát âm thanh khi màn hình bị khóa, khi công tắc tắt tiếng tắt (nút vật lý trên iPhone) và khi ứng dụng ở trong nền. Nếu không có danh mục playback, phiên sẽ bị hủy kích hoạt khi màn hình bị khóa hoặc ứng dụng được thu nhỏ.
Danh mục ambient phù hợp cho trò chơi và ứng dụng có âm thanh nền — nó cho phép các ứng dụng khác tiếp tục phát. Ví dụ: nếu người dùng đang nghe nhạc và mở một trò chơi có phiên ambient, nhạc sẽ tiếp tục phát trên âm thanh của trò chơi. Đây là sự khác biệt cơ bản so với Android, nơi kịch bản như vậy yêu cầu quyền duck rõ ràng.
Việc cấu hình Audio Session nên được thực hiện trước khi bắt đầu bất kỳ phát lại nào. Nên cấu hình phiên trong phương thức application(_:didFinishLaunchingWithOptions:) hoặc trong bộ khởi tạo của trình phát. Sau khi đặt danh mục, phiên phải được kích hoạt.
import AVFAudio
let session = AVAudioSession.sharedInstance
do {
try session.setCategory(
playback,
mode: default,
options: [allowBluetooth, defaultToSpeaker]
)
try session.setActive(true)
} catch {
print("Thiết lập Audio Session thất bại: \(error.localizedDescription)")
}
Tham số options bao gồm allowBluetooth (xuất ra tai nghe Bluetooth) và defaultToSpeaker (phát qua loa thay vì tai nghe). Tùy chọn allowBluetooth là bắt buộc đối với ứng dụng hỗ trợ tai nghe Bluetooth — nếu không có tùy chọn này, âm thanh có thể được định tuyến đến loa tích hợp ngay cả khi tai nghe được kết nối.
let session = AVAudioSession.sharedInstance
try session.setCategory(
playAndRecord,
mode: voiceChat,
options: [allowBluetooth, allowBluetoothA2DP]
)
try session.overrideOutputAudioPort(speaker)
try session.setActive(true)
Danh mục playAndRecord với chế độ voiceChat tối ưu hóa đường dẫn âm thanh cho giao tiếp bằng giọng nói: kích hoạt khử tiếng vang, điều khiển độ lợi tự động (AGC) và chọn codec tối ưu. OverrideOutputAudioPort(.speaker) buộc xuất qua loa ngay cả khi tai nghe được kết nối — hữu ích cho loa ngoài.
Gọi setActive(true) kích hoạt phiên và thông báo cho hệ thống rằng ứng dụng sẽ sử dụng âm thanh. Khi phát lại bị tạm dừng, nên hủy kích hoạt phiên để các ứng dụng khác có thể nhận được luồng âm thanh. Ngoại lệ là các ứng dụng có phát lại nền kéo dài (nhạc, podcast), nơi phiên vẫn hoạt động trong suốt toàn bộ bản nhạc.
Điều quan trọng là phải xử lý lỗi khi gọi setActive. Nếu một phiên khác có mức ưu tiên cao đang hoạt động (ví dụ: Điện thoại trong cuộc gọi), setActive có thể đưa ra lỗi. Trong trường hợp này, bạn cần đợi thông báo AudioSessionInterruptionType.ended và thử kích hoạt lại.
Chế độ làm rõ danh mục và tối ưu hóa đường dẫn âm thanh cho một trường hợp sử dụng cụ thể. Mỗi chế độ thay đổi hành vi của AGC, khử tiếng vang và codec. Các chế độ không thay thế danh mục mà bổ sung cho nó — một danh mục có thể hoạt động với các chế độ khác nhau.
Các tùy chọn cung cấp khả năng điều chỉnh tinh vi hành vi của phiên. Mỗi tùy chọn là một cờ có thể kết hợp với các tùy chọn khác trong một mảng. Ví dụ: [.allowBluetooth, .defaultToSpeaker, .interruptSpokenAudioAndMix] cho phép xuất âm thanh ra tai nghe Bluetooth, sử dụng loa theo mặc định và trộn với sách nói.
Trên iOS 17+, tùy chọn spatialAudio đã xuất hiện, cho phép âm thanh không gian được cá nhân hóa cho AirPods thông qua AVAudioSessionSpatialPreferences. Theo WWDC 2024, âm thanh không gian làm tăng mức độ tương tác của người dùng trong ứng dụng nhạc lên 25% trong các thử nghiệm của Apple.
Gián đoạn là sự khác biệt chính giữa Audio Session và Android Audio Focus. Trong iOS, gián đoạn được xử lý thông qua NotificationCenter bằng cách đăng ký AVAudioSession.interruptionNotification. Thông báo chứa một từ điển với loại gián đoạn: began hoặc 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()
}
}
Khi nhận được interruptionType.began, trình phát nên tạm dừng phát lại. Khi nhận được interruptionType.ended, thuộc tính interruptionOptionKey cho biết trình phát có thể tự động tiếp tục hay không (shouldResume). Nếu người dùng từ chối cuộc gọi, shouldResume = true. Nếu cuộc gọi kết thúc do hết thời gian chờ — shouldResume = false, không được phép tiếp tục.
Khi một ứng dụng khác kích hoạt Audio Session của nó với danh mục playback, phiên hiện tại nhận được thông báo gián đoạn. Nếu ứng dụng khác sử dụng ambient, không có gián đoạn nào xảy ra — âm thanh được trộn lẫn. Hành vi này hoàn toàn khác với Android, nơi bất kỳ kích hoạt Audio Focus nào cũng kích hoạt sự kiện LOSS.
Đối với các ứng dụng cần tiếp tục phát lại khi các phiên khác được kích hoạt (ví dụ: điều hướng trong khi nhạc đang phát), hãy sử dụng tùy chọn .mixWithOthers. Tùy chọn này cho phép trộn âm thanh với các ứng dụng khác và không có gián đoạn nào được gửi. MixWithOthers là tương đương iOS của chế độ duck trong Android.
Audio Session tự động quản lý định tuyến âm thanh giữa loa tích hợp, tai nghe, tai nghe Bluetooth và thiết bị AirPlay. Ứng dụng có thể theo dõi tuyến đường hiện tại thông qua thuộc tính currentRoute và nhận thông báo về các thay đổi qua AVAudioSession.routeChangeNotification.
Khi tai nghe Bluetooth được kết nối, iOS tự động chuyển đầu ra âm thanh sang chúng nếu phiên được cấu hình với tùy chọn allowBluetooth. Nếu không có tùy chọn này, âm thanh tiếp tục qua loa tích hợp. Bắt đầu từ iOS 16, khi kết nối AirPods Pro, hệ thống tự động bật đồng bộ hóa ProMotion để giảm độ trễ.
Đăng ký routeChangeNotification cho phép phản ứng với việc kết nối và ngắt kết nối tai nghe. Khi tai nghe Bluetooth bị ngắt kết nối, trình phát nên tạm dừng phát lại — người dùng có thể không mong đợi âm thanh bắt đầu phát từ loa điện thoại. Theo Apple HIG (2026), đây là hành vi bắt buộc đối với ứng dụng nhạc.
Các thuộc tính availableInputs và availableOutputs trả về danh sách các thiết bị âm thanh có sẵn cùng với loại của chúng (builtInSpeaker, headphones, bluetoothA2DP, hdmi). Nhà phát triển có thể chọn theo chương trình một thiết bị cụ thể thông qua overrideOutputAudioPort cho các kịch bản định tuyến tùy chỉnh.
Các câu hỏi thường gặp
Sự khác biệt chính là kiến trúc. Audio Session là một phiên tập trung duy nhất cho mỗi ứng dụng được cấu hình một lần. Android Audio Focus yêu cầu yêu cầu tiêu điểm thủ công mỗi khi phát. Ngoài ra, iOS hỗ trợ trộn qua tùy chọn mixWithOthers, trong khi trên Android duck là lựa chọn thay thế duy nhất cho việc dừng hoàn toàn.
Nguyên nhân phổ biến nhất là danh mục Audio Session không chính xác. Nếu ambient hoặc soloAmbient được chọn, âm thanh dừng lại khi màn hình bị khóa. Chuyển danh mục sang playback và đảm bảo rằng Background Modes — Audio, AirPlay, and Picture in Picture đã được thêm vào Info.plist.
Thêm tùy chọn .mixWithOthers vào setCategory. Điều này sẽ cho phép trộn âm thanh của ứng dụng của bạn với các phiên hoạt động khác. Nếu không có tùy chọn này, một ứng dụng mới sẽ làm gián đoạn ứng dụng hiện tại. MixWithOthers là tương tự như chế độ duck trong Android, nhưng với việc bảo toàn toàn bộ âm lượng.
Sử dụng overrideOutputAudioPort với nil để chọn tự động. Để xuất cưỡng bức sang Bluetooth: lấy AVAudioSessionRouteDescription từ availableOutputs, chọn cổng có loại .bluetoothA2DP và truyền nó vào overrideOutputAudioPort. Đảm bảo rằng phiên được cấu hình với allowBluetooth.
Đối với hầu hết các ứng dụng — có. Hủy kích hoạt phiên khi tạm dừng cho phép các ứng dụng khác nhận được tiêu điểm âm thanh. Ngoại lệ là các trình phát nhạc có phát lại nền kéo dài. Nếu tạm dừng ngắn (dưới 5 giây), tốt hơn nên giữ phiên hoạt động để tiếp tục nhanh chóng.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm