所以我的问题是我正在创建一个使用本地通知作为闹钟的应用。唯一的问题是,如果设备的铃声音量降低或静音,它将不播放任何声音。我知道您无法在后台执行此操作,但是可以将滑块连接到振铃器音量(如MPVolume的滑块)吗?还可以检查设备是否静音?我只想指出我知道你不能在没有用户知道的情况下简单地改变它,但我想知道前面提到的两种方法是否可行。任何有关该主题的帮助将不胜感激。
答案 0 :(得分:0)
无法检测iPhone是否打开静音开关或更改“铃声”(非音量),因为Apple无法访问它们。
过去常常使用Objective-C进行解决,但我不确定它是否仍然有效,欢迎您随时尝试。
答案 1 :(得分:0)
还可以检查设备是否静音吗?
这个问题真的令人沮丧,我无法相信苹果公司如此努力:(
检查音量本身很简单:
let audioSession = AVAudioSession.sharedInstance()
let volume: Float = audioSession.outputVolume
如果音量为0.0,则它是静音的。但真正的问题是铃声开关。
我的解决方案是播放静音(称为“silence.mp3”,长1.5秒,全部静音),并在0.5秒后检查是否还在播放。 这完全受SoundSwitch的启发:https://github.com/moshegottlieb/SoundSwitch
用法:
MyAudioPlayer.isLoudCheck()
{
isLoud in
print("%%% - device is loud = \(isLoud)")
}
我将音频播放器类更改为此(通常我只是用它来播放声音文件):
import AVFoundation
class MyAudioPlayer: NSObject, AVAudioPlayerDelegate
{
private static let sharedPlayer: MyAudioPlayer =
{
return MyAudioPlayer()
}()
public var container = [String : AVAudioPlayer]()
static func isLoudCheck(completionHandler: @escaping (Bool?) -> ())
{
let name = "silence"
let key = name
var player: AVAudioPlayer?
for (file, thePlayer) in sharedPlayer.container
{
if file == key
{
player = thePlayer
break
}
}
if player == nil, let resource = Bundle.main.path(forResource: name, ofType: "mp3")
{
do
{
player = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: resource), fileTypeHint: AVFileTypeMPEGLayer3)
}
catch
{
print("%%% - audio error?")
}
}
if let thePlayer = player
{
print("%%% - the player plays")
thePlayer.delegate = sharedPlayer
sharedPlayer.container[key] = thePlayer
thePlayer.play()
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute:
{
if let thePlayer = player
{
if thePlayer.isPlaying
{
print("%%% - check: playing")
completionHandler(true)
}
else
{
print("%%% - check: not playing")
completionHandler(false)
}
}
})
}
static func isPlaying(key: String) -> Bool?
{
return sharedPlayer.container[key]?.isPlaying
}
}
希望这有助于某人:)