Swift-AVAudioPlayer,声音无法正常播放

由于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 notification: 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() 它只播放不到一秒钟。好像是突然取消分配了(?)。

我尝试了以下两件事:

  1. AVAudioPlayer状态切换为非活动状态:AVAudioSession.sharedInstance().setActive(false, error: nil)在创建警报之前(或在显示警报之后)。如果这样做,声音将正确播放。但是,此方法是同步(阻止)操作,因此会延迟其他操作(在声音后显示提示)。显然不是一个好的解决方案。
  2. 将audioPlayer属性(var audioPlayer = AVAudioPlayer())移到窗口(var window: UIWindow?)下面的类级别。如果这样做,声音会正确播放,并且警报也会正确显示。

我不明白为什么它会那样工作。我想念什么吗?这是解决我的问题的正确方法吗?

在此先感谢所有可以帮助我了解/解决此问题的人。

回答:

您已经为问题提供了正确的解决方案,那就是第二。具有类级别的audioPlayer属性。为什么会这样呢?好吧,这是因为在代码中设置了播放器,开始播放,显示弹出窗口,并且在完成所有操作后,该方法退出了作用域。自动内存管理(ARC)起作用,以便在退出该变量的范围时释放所有局部变量。如果您认为声音播放是异步的(例如,它将在不阻塞主线程的情况下播放),请在音频播放器完成声音播放之前退出示波器。ARC注意到这audioPlayer是一个局部变量,并在那时将其释放,但是声音尚未播放完毕。

我希望我足够清楚,如果不能不提出更多要求!

以上是 Swift-AVAudioPlayer,声音无法正常播放 的全部内容, 来源链接: utcz.com/qa/420091.html

回到顶部