Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Swift, воспроизведение mp3 в фоне

#ios #swift


У меня с периодичностью запускается фоновый поток scheduledTimerWithTimeInterval(),
который проверяет наличие в базе записей с определенным статусом

Если такие записи есть, то необходимо воспроизвести mp3. 

Делал воспроизведение с помощью:

1. AVAudioPlayer

Включил Audio, AirPlay and Picture in Picture в BackgroundModes

    do {
    try   AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    try AVAudioSession.sharedInstance().setActive(true)
    } catch _ {
    return print("error")
    }


Установил категорию AVAudioSessionCategoryPlayback

Проблема: на открытом экране каждые 20 секунд издается звук (играет музыка), а вот
когда просто сверну приложение, звук сам уже не воспроизводится. 

2. AudioServicesPlayAlertSound(1009)

Работал но APPLE отклоняли с причиной "Включен режим backgroundModes но ни чего не
воспроизводится".

Что можно использовать для такой задачи?

UPD

Это метод который запускает таймер с интервалом 20 секунд:

func scheduledTimerWithTimeInterval(){
timer = NSTimer.scheduledTimerWithTimeInterval(20, target: self, selector: #selector(ListOfOrders.checkNewOrder),
userInfo: nil, repeats: true)
registerBackgroundTask()
}


Это метод, который запускает таймер, в котором происходит закачка и проверка данных.
Если есть новые данные, в теории телефон должен пищать

func checkNewOrder() {
WorkWithInternet().getOrders(self, token: prefs.stringForKey("token")!, col: 0, add:
false, vc: ListOfOrders())
}


UPD2 Воспроизведение звука по файлу:

do {
    let soundURL: NSURL = NSBundle.mainBundle().URLForResource("notif", withExtension:
"mp3")!
    audioPlayer = try AVAudioPlayer(contentsOfURL: soundURL)
    audioPlayer!.delegate = self
    audioPlayer!.prepareToPlay()
    audioPlayer!.play()
}catch{
    print("Error")
}


UPD3

var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid


Регистрирует таск в фоне: 

func registerBackgroundTask() {
    backgroundTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler {
    [unowned self] in
    self.endBackgroundTask()
    }
    assert(backgroundTask != UIBackgroundTaskInvalid)
 }


Функция завершения бэкграунд-таска:

func endBackgroundTask() {
   NSLog("Background task ended.")
   UIApplication.sharedApplication().endBackgroundTask(backgroundTask)
   backgroundTask = UIBackgroundTaskInvalid
}

    


Ответы

Ответ 1



Взгляни на этот проект из книги Я лично протестировал его на iOS 9.3 iPhone 6+ все работает.

Комментариев нет:

Отправить комментарий