iOs 8,在后台开始播放声音,闹钟应用程序

时间:2014-07-15 02:52:37

标签: ios audio swift alarm

我知道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 btw,因此它不会被释放,而audioplayer.play()将不会做任何事情......

1 个答案:

答案 0 :(得分:10)

最后,我设法用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与此计时器同步,以获得良好的用户体验。

虽然我不确定这是否会通过苹果,但我认为没有任何理由不这样做:\