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#>)`
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)
}
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])
Pour Swift 4.2 dans iOS 12, il s’agit simplement de:
try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [])
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)
}
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
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)
}
//Swift 4.2
if #available(iOS 10.0, *) {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback,
mode: AVAudioSessionModeDefault)
} else {
//Fallback on earlier versions
}
Swift 5
let audioSession = AVAudioSession.sharedInstance()
_ = try? audioSession.setCategory(.playback, options: .defaultToSpeaker)
_ = try? audioSession.setActive(true)
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