【发布时间】:2014-12-08 11:27:25
【问题描述】:
我正在将现有应用更新为 Swift。我遇到的问题是应用程序的主要目的是在应用程序到达特定位置时播放声音文件。一切都在模拟器中工作,但它不会在设备上播放声音。如果我为音频和播放添加背景模式,它可以完美运行。苹果拒绝了这一点,因为它不会一直使用音频,只是当它进入一个区域时。我不必为 iOS7 启用音频和无线播放背景模式。
我认为这与音频播放器在有机会被使用之前被释放有关。我无法弄清楚如何正确设置它。在 StackOverflow 上针对 Objective C 也有同样的问题,但我找不到任何与 swift 类似的东西(对我来说,这就是该问题的答案所暗示的以及我为 iOS7 设置它的方式)。
class MasterViewController: UITableViewController, NSFetchedResultsControllerDelegate, CLLocationManagerDelegate, AVSpeechSynthesizerDelegate, AVAudioPlayerDelegate {
var myManager: CLLocationManager!
var audioPlayer = AVAudioPlayer()
var mySpeechSynthesizer = AVSpeechSynthesizer()
func playSound()
{
audioPlayer.prepareToPlay()
audioPlayer.play()
}
func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool)
{
speak()
}
func speak()
{
var myString = "This is the phrase I want to speak"
var mySpeechUtterance:AVSpeechUtterance = AVSpeechUtterance(string:myString)
mySpeechUtterance.rate = 0.12
mySpeechUtterance.voice = AVSpeechSynthesisVoice(language: "en-US")
mySpeechSynthesizer .speakUtterance(mySpeechUtterance)
}
func locationManager(manager: CLLocationManager!, didEnterRegion region: CLRegion!)
{
playSound()
scheduleAllLocations()
}
override func viewDidLoad()
{
super.viewDidLoad()
myManager = CLLocationManager()
myManager.delegate = self
myManager.desiredAccuracy = kCLLocationAccuracyBest
myManager.requestAlwaysAuthorization()
var alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("SpeakMinder", ofType: "mp3")!)
var error:NSError?
audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error)
audioPlayer.delegate = self
mySpeechSynthesizer.delegate = self
}
这是完整的代码。如果我在后台启用了音频/播放,它可以完美地工作。如果我在后台禁用了音频/空中播放,则不会播放声音或说话。 (Apple 已拒绝该应用启用音频/airplay)
【问题讨论】:
-
如果改用本地通知会怎样?
-
列出的代码只是 didEnterRegion 中发生的代码的一半。其余的使用 SpeechSynthesizer 在播放声音后说出一个短语。那也行不通。我把它拿出来试图让这个问题变得更容易。如果我能让声音工作,我知道语音合成也能工作。我花了一整天的时间试图播放一个声音文件。如果启用了后台,则没有问题,如果禁用了后台,则没有。如果启用了后台,Apple 会拒绝该应用程序。
-
我用上面的代码做了一个测试应用。在附近转了很多圈之后,我得出了同样的结果。如果启用了后台音频...工作正常;如果没有,则不会发出声音。那么有什么建议吗?
-
您似乎走到了死胡同,因为 Apple 的后台任务准则禁止在没有通知使用的情况下最终播放声音。但这更多是猜测,抱歉,我无能为力。
-
我应该接到审核小组的电话讨论这个问题。我会在讨论之后发布任何更新。
标签: swift ios8 avaudioplayer cllocationmanager