AVAudioSession setCategory Swift 4.2 iOS 12 - Воспроизведение звука на Silent

Для воспроизведения звука даже в режиме "Без звука" я использую метод ниже. Но как это не работает.

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

Как заставить его работать в 4.2/iOS 12?

В новой версии нам нужно установить режим и параметры.

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

Ответ 1

Комментарий к ней der Töne показывает вам новый синтаксис, но вам также нужно активировать сеанс аудио после setCategory:

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

Ответ 2

В качестве обходного пути вы можете вызвать Objective-C AVAudioSession.setCategory: метод с 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)
}

Если вы хотите установить категорию и параметры для iOS 9 и более ранних версий, используйте:

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

ОБНОВИТЬ:

Проблема исправлена в Xcode 10.2.

Ответ 3

Для Swift 4.2 в iOS 12 это просто:

try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [])

Ответ 4

Обновление для Xcode 10.2:

Apple finally fix this issue in Xcode 10.2. 
So no need to add these workaround code anymore if you use Xcode 10.2 or newer version.

But you also could refer this code for any problem like this.

Вы можете использовать категорию target-c, чтобы решить эту проблему.

Создайте 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

С 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

Затем импортируйте "AVAudioSession + Swift.h" в ваш <#target_name#>-Bridging-Header.h

#import "AVAudioSession+Swift.h"

В результате вы можете вызывать метод по-быстрому, как и раньше.

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

Ответ 5

Вышеупомянутый ответ (по Rhythmic Fistman) правильный, если ваше приложение несовместимо с iOS 9 или ниже.

Если ваше приложение совместимо с iOS 9, вы увидите следующую ошибку:

"setCategory" недоступен в Swift

В этом случае есть ошибка с Swift 4.2, это проблема с AVFoundation в SDK Xcode 10, вы можете обойти это, написав функцию Objective-C, которая вызывает старый API, поскольку они все еще доступны в Objective -С.

В следующей ссылке вы можете прочитать более подробную информацию:

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

Ответ 6

Вставьте это в ваш viewDidLoad()

do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: AVAudioSession.Mode.default, options: [])
    try AVAudioSession.sharedInstance().setActive(true)
}
catch {
    print(error)
}

Ответ 7

//Swift 4.2
if #available(iOS 10.0, *) {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, 
    mode: AVAudioSessionModeDefault)
} else {
 //Fallback on earlier versions
}

Ответ 8

Swift 5

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

Ответ 9

Код для 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)
    }

надеюсь, это поможет