由于UILocalNotification
在应用程序处于活动状态时未显示该消息,因此我尝试配置an
UIAlertController
并在出现时播放一些声音。
我在没问题,AppDelegate
可以处理通知/创建警报。我的问题与声音有关。确实,它无法正常播放。
这是我到目前为止所拥有的:
//...
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
// Notifications permissions
let types: UIUserNotificationType = UIUserNotificationType.Sound | UIUserNotificationType.Alert
let settings: UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: nil)
application.registerUserNotificationSettings(settings)
return true
}
func application(application: UIApplication!, didReceiveLocalNotification notificathtml" target="_blank">ion: UILocalNotification!) {
let state : UIApplicationState = application.applicationState
var audioPlayer = AVAudioPlayer()
if (state == UIApplicationState.Active) {
// Create sound
var error:NSError?
var audioPlayer = AVAudioPlayer()
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient, error: nil)
AVAudioSession.sharedInstance().setActive(true, error: nil)
let soundURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("sound", ofType: "wav")!)
audioPlayer = AVAudioPlayer(contentsOfURL: soundURL, error: &error)
if (error != nil) {
println("There was an error: \(error)")
} else {
audioPlayer.prepareToPlay()
audioPlayer.play()
}
// Create alert
let alertController = UIAlertController(title: "Alert title", message: "Alert message.", preferredStyle: .Alert)
let noAction = UIAlertAction(title: "No", style: .Cancel) { (action) in
// ...
}
let yesAction = UIAlertAction(title: "Yes", style: .Default) { (action) in
// ...
}
alertController.addAction(noAction)
alertController.addAction(yesAction)
self.window?.rootViewController?.presentViewController(alertController, animated: true, completion: nil)
}
}
这样,当玩家经过这条线时:audioPlayer.play()
它只播放不到一秒钟。好像是突然取消分配了(?)。
我尝试了以下两件事:
AVAudioPlayer
状态切换为非活动状态:AVAudioSession.sharedInstance().setActive(false, error: nil)
在创建警报之前(或在显示警报之后)。如果这样做,声音将正确播放。但是,此方法是同步(阻止)操作,因此会延迟其他操作(在声音后显示提示)。显然不是一个好的解决方案。var audioPlayer = AVAudioPlayer()
)移到窗口(var window: UIWindow?
)下面的类级别。如果这样做,声音会正确播放,并且警报也会正确显示。我不明白为什么它会那样工作。我想念什么吗?这是解决我的问题的正确方法吗?
在此先感谢所有可以帮助我了解/解决此问题的人。
您已经为问题提供了正确的解决方案,那就是第二。具有类级别的audioPlayer
属性。为什么会这样呢?好吧,这是因为在代码中设置了播放器,开始播放,显示弹出窗口,并且在完成所有操作后,该方法退出了作用域。自动内存管理(ARC)起作用,以便在退出该变量的范围时释放所有局部变量。如果您认为声音播放是异步的(例如,它将在不阻塞主线程的情况下播放),请在音频播放器完成声音播放之前退出示波器。ARC注意到这audioPlayer
是一个局部变量,并在那时将其释放,但是声音尚未播放完毕。
我希望我足够清楚,如果不能不提出更多要求!
问题内容: 我正在尝试播放声音,但无法正常工作。 编辑1: 仍然行不通。 编辑2 :此代码有效。我的设备处于静音模式。 问题答案: 对您的代码进行了修改: Swift 3和Swift 4.1:
问题内容: 我试图让多个声音文件在AVAudioPlayer实例上播放,但是当一种声音播放时,另一种声音停止。我一次只能播放一种以上的声音。这是我的代码: 有人可以告诉我如何一次播放多个声音文件,以帮助我吗?任何帮助深表感谢。 非常感谢,凯 问题答案: 音频停止的原因是因为您仅设置了一个AVAudioPlayer,所以当您要求类播放另一种声音时,当前您正在用新的AVAudioPlayer实例替换旧
问题内容: 我想用Swift播放声音。 我的代码在Swift 1.0中可用,但现在在Swift 2或更高版本中不再起作用。 问题答案: 最可取的是,您可能想使用 AVFoundation。它提供了使用视听媒体的所有必要条件。 更新: 某些评论中建议与 Swift 2 , Swift 3 和 Swift 4 兼容。 斯威夫特2.3 迅捷3 Swift 4(与iOS 13兼容) 确保更改乐曲的名称以及
播放(播放音效/播放录音)
问题内容: 我正在模拟器中测试我的应用。 我正在下载文件,并以这种方式获取本地文件: 现在,我想使用AVAudioPlayer播放此文件,但是我总是遇到此错误: 播放代码: 我应该如何播放? 问题答案: 在iOS8下,您保存的路径在启动期间将无效。您看到的ID“ E5F13797-A6A8-48A1-B3C3-FBC3D7A03151”将随每次启动而更改。 解决方案是保存文件名而不是完整路径,并通
问题内容: 我正在尝试使用pygame播放声音文件(.wav),但是当我启动它时却听不到任何声音。 这是代码: 我也尝试使用频道,但结果是一样的 问题答案: 您的代码在我的机器上可以正常运行(Mac OSX 10.5,Python 2.6.4,pygame 1.9.1)。您正在使用哪些OS,Python和pygame版本?您是否可以通过其他方式(例如,在Mac的终端上或在Windows控制台上,然