由于UILocalNotification在应用程序处于活动状态时未显示该消息,因此我尝试配置an UIAlertController并在出现时播放一些声音。
UILocalNotification
UIAlertController
我在没问题,AppDelegate可以处理通知/创建警报。我的问题与声音有关。确实,它无法正常播放。
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() 它只播放不到一秒钟。好像是突然取消分配了(?)。
audioPlayer.play()
我尝试了以下两件事:
AVAudioPlayer
AVAudioSession.sharedInstance().setActive(false, error: nil)
var audioPlayer = AVAudioPlayer()
var window: UIWindow?
我不明白为什么它会那样工作。我想念什么吗?这是解决我的问题的正确方法吗?
在此先感谢所有可以帮助我了解/解决此问题的人。
您已经为问题提供了正确的解决方案,那就是第二。具有类级别的audioPlayer属性。为什么会这样呢?好吧,这是因为在代码中设置了播放器,开始播放,显示弹出窗口,并且在完成所有操作后,该方法退出了作用域。自动内存管理(ARC)起作用,以便在退出该变量的范围时释放所有局部变量。如果您认为声音播放是异步的(例如,它将在不阻塞主线程的情况下播放),请在音频播放器完成声音播放之前退出示波器。ARC注意到这audioPlayer是一个局部变量,并在那时将其释放,但是声音尚未播放完毕。
audioPlayer
我希望我足够清楚,如果不能不提出更多要求!