gpt4 book ai didi

swift - AVAudioSession setCategory 在 Swift 4.2 中的可用性

转载 作者:IT王子 更新时间:2023-10-29 05:16:50 27 4
gpt4 key购买 nike

迁移到 Swift 4.2 后,我收到多个错误,其中一个很奇怪。这似乎是 Xcode 10 中的错误,但是否有可用的解决方法?

do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playAndRecord, with: options)
} catch {
NSLog("Could not set audio session category")
}

**** 'setCategory(_:with:)' is unavailable in Swift

最佳答案

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 或更新版本 错误。

这已被报告为 error in Apple's 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 类方法

如果您想更好地控制错误,请按以下步骤立即执行此操作

  1. 在我的案例中创建一个新的 Objective-C 文件 AudioSessionHelper.m。当系统提示是否应创建桥接头文件时,单击(如果您的项目中还没有)
  2. 创建一个新的Header 文件AudioSessionHelper.h
  3. 插入代码
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
  1. 将您的助手类插入到桥接头文件中
[项目]-Bridging-Header.h
#import "AudioSessionHelper.h"
  1. 在您的 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。

关于swift - AVAudioSession setCategory 在 Swift 4.2 中的可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52413107/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com