我知道关于SOF的问题很多,但这是“最新的”问题。事实是,我正在尝试创建和警报应用程序,并且我知道有一个警报应用程序可以很好地运行(某种程度上),即使该应用程序未运行且在后台。
我的问题是:你是怎么开始播放声音 后, 你的应用程序已经在后台?
UILocalNotification很棒,但是只有application:(_:didReceiveLocalNotification:)在用户单击通知后您才能获得,因此使用AVAudioPlayer播放声音不起作用,无论用户单击还是不单击,我都想播放声音。当然Required background modes: App plays audio or streams audio/video using AirPlay在info.plist已经设置好了。音乐开始播放后,即使我进入后台,它也会继续播放。
application:(_:didReceiveLocalNotification:)
Required background modes: App plays audio or streams audio/video using AirPlay
info.plist
我不想使用UILocalNotificaation声音,因为它仅限于30秒,只能播放与应用程序捆绑在一起的声音。
有什么见解吗?想法??
样例代码:
var notif = UILocalNotification() notif.fireDate = self.datePicker.date notif.alertBody = "test" UIApplication.sharedApplication().scheduleLocalNotification(notif)
当用户选择并报警并单击保存时,将调用上述代码。
这是AppDelegate中发生的事情:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { NSLog("launched") application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Alert | UIUserNotificationType.Badge, categories: nil )) AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil) AVAudioSession.sharedInstance().setActive(true, error: nil) self.sound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("sound", ofType: "caf")) self.audioPlayer = AVAudioPlayer(contentsOfURL: sound, error: nil) return true } func application(application: UIApplication!, didReceiveLocalNotification notification: UILocalNotification!){ audioPlayer.play() NSLog("received local notif") }
您需要对AVAudioPlayerbtw 保持强烈的引用,以便它不会被释放,并且audioplayer.play()不会执行任何操作…
AVAudioPlayer
audioplayer.play()
最终,我设法使用NSTimer做到了。
func applicationWillResignActive(application: UIApplication) { var timer = NSTimer(fireDate: NSDate(timeIntervalSinceNow: 20), interval: 60.0, target: self, selector: Selector("playAlarm"), userInfo: nil, repeats: false) NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode) } func playAlarm() { self.sound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("sound", ofType: "caf")) self.audioPlayer = AVAudioPlayer(contentsOfURL: sound, error: nil) audioPlayer.play() }
UILocalNotification与此计时器同步,以提供良好的用户体验。
尽管我不确定这是否会通过苹果,但是我看不出为什么它不会通过:\