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() 方法
如果您想要快速内联修复而不需要错误处理,您可以使用以下.perform()
方法调用 Obj.-C API:
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:Helper 类方法
如果您想对错误进行更多控制,以下是立即执行此操作的步骤
- 在我的情况下创建一个新
Objective-C
文件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
- 将您的助手类插入桥接头文件
[项目]-Bridging-Header.h
#import "AudioSessionHelper.h"
- 在你的 Swift 项目中使用它
if #available(iOS 10.0, *) {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
} else {
try AudioSessionHelper.setAudioSession()
}
这并不漂亮,并且会在您的项目中添加大量不必要的代码和文件,因此如果您现在迫切需要或必须在 Xcode 10.1 上使用 Swift 4.2,请使用它。在所有其他情况下,您最好使用 Xcode 10.2。