我正在将现有应用更新为Swift。我遇到的问题是该应用程序的主要目的是在应用程序到达特定位置时播放声音文件。一切都在模拟器中工作,但它不会在设备上播放声音。如果我添加音频和播放的背景模式,它可以完美地工作。 Apple拒绝了这一点,因为它不会一直使用音频,就在它进入某个地区时。我没有为iOS7启用音频和播放后台模式。
我认为这与在有机会被使用之前被处理的audioplayer有关。我无法弄清楚如何正确设置它。在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已拒绝启用音频/播放的应用程序)
答案 0 :(得分:0)
来自技术团队
如果您尝试从后台使用AVSpeechSynthesizer,则应启用背景音频键。 AVSpeech只使用相同的音频管道播放任何声音。
关于它在iOS7中工作而没有启用后台音频
如果不需要此密钥,由于我们纠正过的错误,您很可能会很幸运。
今天一个应用程序获得批准,启用了音频背景。
如果由于语音合成器的后台启用了音频而被拒绝。
我们自己的基于位置的样本“Breadcrumbs"在plist中启用了以下功能。您可以在上诉中指出此示例。