it-roy-ru.com

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

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

// 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#>)`
35
Nitesh

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

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

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

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

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

Вы можете использовать категорию 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"

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

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

Приведенный выше ответ (от 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

5
Jose M. Gavilán

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

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

0
micheal woods