我正在尝试构建 闹钟应用 ,因此需要 根据时间播放声音 在DatePicker(NSDate)W中输入的内容。我通过实现正在执行播放音频功能的NSTimer来做到这一点。我还提供了在info.plist中设置 AVAudioSessionCategoryPlayback 和背景模式以允许播放声音,即使用户将应用程序带到后台也是如此。它的工作原理很完美,但前提是应用程序位于前台(计时器无法从后台执行代码)。制作它的方法是什么? 附:一个人告诉我,他之前通过播放“无声的声音”来做到这一点。保持应用程序处于执行状态。希望能有更好的解决方案=)
import UIKit
import AVFoundation
import MediaPlayer
class AlarmViewController: UIViewController {
var date = NSDate()
var ding = AVAudioPlayer()
override func viewDidLoad() {
super.viewDidLoad()
// Setting AVAudioSession to enable playing music in silent mode
do {
_ = try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
_ = try AVAudioSession.sharedInstance().setActive(true)
} catch {
print("Something wrong in declaring session")
}
let timer = NSTimer(fireDate: NSDate(timeIntervalSinceNow: 5), interval: 0, target: self, selector: "prepareAudios", userInfo: nil, repeats: false)
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
}
func prepareAudios() {
let path = NSBundle.mainBundle().pathForResource("Hills", ofType: "m4r")
do {
ding = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!))
} catch {
print("Something wrong in prepareAudios() func")
}
// This code sets max volume on device
let masterVolumeSlider = MPVolumeView()
if let view = masterVolumeSlider.subviews.first as? UISlider{
view.value = 1.0
}
ding.volume = 1.0
ding.prepareToPlay()
ding.play()
}