iOS 10 +
Если вы нацеливаетесь на iOS 10 + , просто перейдите на новый API и используйте:
try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [])
Старые версии iOS
Когда вы попробуете это для приложения, ориентированного на более старую версию iOS (например, iOS 9) , вы получите setCategory(_:mode:options:)' is only available on iOS 10.0 or newer
Ошибка.
Это было сообщено какошибка в Apple API и исправлена в Xcode 10.2.Для более старых версий Xcode (например, Xcode 10.1) есть обходной путь, который я нашел.При создании помощника Objective-C, как описано, вы все равно можете получить доступ к старому API, потому что он все еще доступен для Objective-C.
Обходной путь 1: метод .perform ()
Если требуется быстрое встроенное исправление без обработки ошибок, вы можете вызвать API Obj.-C с помощью метода .perform()
:
if #available(iOS 10.0, *) {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
} else {
// Set category with options (iOS 9+) setCategory(_:options:)
AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:withOptions:error:"), with: AVAudioSession.Category.playback, with: [])
// Set category without options (<= iOS 9) setCategory(_:)
AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"), with: AVAudioSession.Category.playback)
}
Обходной путь 2: Метод класса помощника
Вот шаги, как сделать это прямо сейчас, если вы хотите больше контроля над ошибками
- Создать новый *Файл 1033 * в моем случае
AudioSessionHelper.m
.Когда будет предложено создать файл заголовка моста, нажмите Да (если у вас его еще нет в вашем проекте) - Создайте новый
Header
файл AudioSessionHelper.h
- Вставить код
AudioSessionHelper.h
#ifndef AudioSessionHelper_h
#define AudioSessionHelper_h
#import <AVFoundation/AVFoundation.h>
@interface AudioSessionHelper: NSObject
+ (BOOL) setAudioSessionWithError:(NSError **) error;
@end
#endif /* AudioSessionHelper_h */
AudioSessionHelper.m
#import "AudioSessionHelper.h"
#import <Foundation/Foundation.h>
@implementation AudioSessionHelper: NSObject
+ (BOOL) setAudioSessionWithError:(NSError **) error {
BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:error];
if (!success && error) {
return false;
} else {
return true;
}
}
@end
Вставьте ваш вспомогательный класс в файл заголовка моста [PROJECT] -Bridging-Header.h
#import "AudioSessionHelper.h"
Используйте его в своем проекте Swift
if #available(iOS 10.0, *) {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
} else {
try AudioSessionHelper.setAudioSession()
}
Это не красиво и добавляет много ненужного кода и файлов в ваш проект, поэтому используйте его, если вы срочно хотите или должныиспользуйте Swift 4.2 на Xcode 10.1 прямо сейчас.Во всех остальных случаях вам лучше использовать Xcode 10.2.