前言
按照正常思路来说,开启静音键,播放视频也应该没有声音。关闭静音键,视频有声音,这才是正常思维,所以很多第三方框架也是这样的。但是产品要求用户静音键开启,播放视频也需要有声音,好吧,只能硬头皮实现。
一、OC实现方法
//后台播放
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:nil];
//静音状态下播放
[[AVAudioSession sharedInstance] setActive:YES error:nil];
//设置代理 可以处理电话打进时中断音乐播放
[[AVAudioSession sharedInstance] setDelegate:self];
//当有电话打进的时候,这里可以处理将正在播放的音乐停止,然后打完电话后再重新播放
- (void)beginInterruption{
//停止播放的事件
}
- (void)endInterruption{
//继续播放的事件
}
二、Swift实现方法
现在我总结出最终的方法:
do {
if #available(iOS 11.0, *) {
try audioSession.setCategory(.playback, mode: .default, policy: .longForm, options: [])
} else if #available(iOS 10.0, *) {
try audioSession.setCategory(.playback, mode: .default, options: [])
} else {
// Compiler error: 'setCategory' is unavailable in Swift
try audioSession.setCategory(AVAudioSession.Category.playback)
}
try AVAudioSession.sharedInstance().setActive(true)
} catch let error {
print("Unable to configure audio sesson category: \(error)")
}
除此之外,网上还有各种方法,如果你需要支持iOS10一下的,那么可以参考一下:
1、方法一
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)
}
//静音状态下播放
try AVAudioSession.sharedInstance().setActive(true)
2、方法二
创建一个oc文件AudioSessionHelper然后在Swift中调用
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()
}
try AVAudioSession.sharedInstance().setActive(true)
方法三
do{
if #available(iOS 10.0, *) {
try? AVAudioSession.sharedInstance().setCategory(.playback,mode: .default)
}else{
AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"),with: AVAudioSession.Category.playback)
}
try AVAudioSession.sharedInstance().setActive(true)
}catch{
printLog(error)
}