Подтвердить что ты не робот

IOs 8, начать воспроизведение звука в фоновом режиме, приложение для будильника

Я знаю, что в 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() ничего не сделает...

4b9b3361

Ответ 1

Наконец, мне удалось сделать это с помощью 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 синхронизируется с этим таймером для хорошего пользовательского интерфейса.

Хотя я не уверен, что это пройдет через яблоко, но я не вижу причин, почему это не будет:\