AVAudioSession setCategory Swift 4.2 iOS 12-Reproducir sonido en silencio
avfoundation (5)
Para reproducir sonido incluso en el modo silencioso, uso el siguiente método. Pero como no funciona.
// Works on Swift 3
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch {
print(error)
}
¿Cómo conseguir que funcione en 4.2 / iOS 12?
En la versión más reciente tenemos que configurar el modo y las opciones.
try AVAudioSession.sharedInstance().setCategory(
<#T##category:AVAudioSession.Category##AVAudioSession.Category#>,
mode: <#T##AVAudioSession.Mode#>,
options: <#T##AVAudioSession.CategoryOptions#>)`
Como solución alternativa, puede llamar al método Objective-C AVAudioSession.setCategory:
con el NSObject.performSelector:
::
if #available(iOS 10.0, *) {
try! AVAudioSession.sharedInstance().setCategory(.playback, mode: .moviePlayback)
}
else {
// Workaround until https://forums.swift.org/t/using-methods-marked-unavailable-in-swift-4-2/14949 isn''t fixed
AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"), with: AVAudioSession.Category.playback)
}
Si desea configurar la categoría y las opciones para iOS 9 y versiones anteriores, utilice:
AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:withOptions:error:"), with: AVAudioSession.Category.playback, with: [AVAudioSession.CategoryOptions.duckOthers])
El comentario de Her der Töne le muestra la nueva sintaxis, pero también necesita activar la sesión de audio después de setCategory
:
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
try AVAudioSession.sharedInstance().setActive(true)
} catch {
print(error)
}
La respuesta anterior (de Rhythmic Fistman) es correcta si su aplicación no es compatible con iOS 9 o inferior.
Si su aplicación es compatible con iOS 9, verá el siguiente error:
''setCategory'' no está disponible en Swift
En ese caso, hay un error con Swift 4.2, este es un problema con AVFoundation en los SDK de Xcode 10, puede solucionarlo escribiendo una función Objective-C que llama a la API antigua, ya que todavía están disponibles en Objective -DO.
En el siguiente enlace puedes leer más detalles:
https://forums.swift.org/t/using-methods-marked-unavailable-in-swift-4-2/14949
Para Swift 4.2 en iOS 12, es simplemente:
try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [])
Puede usar una categoría de objetivo-c para ayudar a solucionar este problema.
Crear una AVAudioSession+Swift.h
:
@import AVFoundation;
NS_ASSUME_NONNULL_BEGIN
@interface AVAudioSession (Swift)
- (BOOL)swift_setCategory:(AVAudioSessionCategory)category error:(NSError **)outError NS_SWIFT_NAME(setCategory(_:));
- (BOOL)swift_setCategory:(AVAudioSessionCategory)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError NS_SWIFT_NAME(setCategory(_:options:));
@end
NS_ASSUME_NONNULL_END
Con un AVAudioSession+Swift.m
:
#import "AVAudioSession+Swift.h"
@implementation AVAudioSession (Swift)
- (BOOL)swift_setCategory:(AVAudioSessionCategory)category error:(NSError **)outError {
return [self setCategory:category error:outError];
}
- (BOOL)swift_setCategory:(AVAudioSessionCategory)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError {
return [self setCategory:category withOptions:options error:outError];
}
@end
Luego importe el "AVAudioSession + Swift.h" en su <#target_name#>-Bridging-Header.h
#import "AVAudioSession+Swift.h"
El resultado es que puedes llamar al método de forma rápida como antes.
do {
try AVAudioSession.sharedInstance().setCategory(.playback)
try AVAudioSession.sharedInstance().setCategory(.playback, options: [.mixWithOthers])
try AVAudioSession.sharedInstance().setActive(true)
} catch {
print(error)
}