【发布时间】:2014-09-05 02:44:33
【问题描述】:
我知道关于 SOF 有很多问题,但这是“最新”的问题。问题是,我正在尝试创建警报应用程序,并且我知道有一个警报应用程序可以完美运行(不知何故),即使应用程序没有运行并且在后台。
我的问题是:在您的应用已经在后台后如何开始播放声音?
UILocalNotification 很棒,但您只会在用户点击您的通知后获得application:(_:didReceiveLocalNotification:),因此使用 AVAudioPlayer 播放声音不起作用,无论用户点击或不点击它,我都想播放声音不。当然,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")
}
顺便说一句,您需要对AVAudioPlayer 进行强引用,所以它不会被释放,audioplayer.play() 不会做任何事情...
【问题讨论】:
-
如果你的应用在后台,
didreceivelocalnotification应该在通知触发后被调用。也许你可以把你的代码放在那里播放声音。 -
我尝试了很多次,它没有,它只有在用户实际点击通知后才会被触发。无论如何我都会编辑我的问题。