web-dev-qa-db-fra.com

AVAudioSession setCategory Swift 4.2 iOS 12 - Écouter le son en mode silencieux

Pour jouer du son même en mode silencieux, j’utilise la méthode ci-dessous. Mais comment ça ne marche pas.

// Works on Swift 3  
do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch {
    print(error)
}

Comment le faire fonctionner dans 4.2/iOS 12?

Dans les nouvelles versions, nous devons définir le mode et les options.

try AVAudioSession.sharedInstance().setCategory(
    <#T##category:AVAudioSession.Category##AVAudioSession.Category#>,
    mode: <#T##AVAudioSession.Mode#>, 
    options: <#T##AVAudioSession.CategoryOptions#>)`
35
Nitesh

Le commentaire de sa mère vous montre la nouvelle syntaxe, mais vous devez également activer la session audio après setCategory:

do {
    try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
    try AVAudioSession.sharedInstance().setActive(true)
} catch {
    print(error)
}
36
Rhythmic Fistman

Pour contourner le problème, vous pouvez appeler la méthode Objective-C AVAudioSession.setCategory: avec le 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 vous souhaitez définir la catégorie et les options pour iOS 9 et versions antérieures, utilisez:

AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:withOptions:error:"), with: AVAudioSession.Category.playback, with:  [AVAudioSession.CategoryOptions.duckOthers])
32
ricardopereira

Pour Swift 4.2 dans iOS 12, il s’agit simplement de: 

try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [])
16
Chewie The Chorkie

Vous pouvez utiliser une catégorie objective-c pour résoudre ce problème.

Créez un 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

Avec 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

Importez ensuite "AVAudioSession + Swift.h" dans votre <#target_name#>-Bridging-Header.h

#import "AVAudioSession+Swift.h"

Le résultat est que vous pouvez appeler la méthode dans Swift comme avant.

do {
    try AVAudioSession.sharedInstance().setCategory(.playback)
    try AVAudioSession.sharedInstance().setCategory(.playback, options: [.mixWithOthers])
    try AVAudioSession.sharedInstance().setActive(true)
} catch {
    print(error)
}
7
Galvin

La réponse ci-dessus (de Rhythmic Fistman) est correcte si votre application n'est pas compatible avec iOS 9 ou une version antérieure.

Si votre application est compatible avec iOS 9, l'erreur suivante apparaît:

'setCategory' n'est pas disponible dans Swift

Dans ce cas, il y a un bogue avec Swift 4.2, c'est un problème avec AVFoundation dans les SDK de Xcode 10, vous pouvez le contourner en écrivant une fonction Objective-C qui appelle via l'ancienne API, car ils sont toujours disponibles dans Objective. -C.

Dans le lien suivant, vous pouvez lire plus de détails:

https://forums.Swift.org/t/using-methods-marked-unavailable-in-Swift-4-2/14949

5
Jose M. Gavilán

Collez ceci dans votre viewDidLoad()

do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: AVAudioSession.Mode.default, options: [])
    try AVAudioSession.sharedInstance().setActive(true)
}
catch {
    print(error)
}
2
Will Reynolds
//Swift 4.2
if #available(iOS 10.0, *) {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, 
    mode: AVAudioSessionModeDefault)
} else {
 //Fallback on earlier versions
}
0
Piyush Sharma

Swift 5

let audioSession = AVAudioSession.sharedInstance()
_ = try? audioSession.setCategory(.playback, options: .defaultToSpeaker)
_ = try? audioSession.setActive(true)
0
budidino

Code pour Swift 4:

do {
        try AKSettings.setSession(category: .playback, with: [])
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, mode: AVAudioSessionModeDefault, options: [])
        try AVAudioSession.sharedInstance().setActive(true)


    } catch {
        print(error)
    }

J'espère que cela pourra aider

0
micheal woods