Страницы

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

понедельник, 29 октября 2018 г.

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

У меня с периодичностью запускается фоновый поток 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 }


Ответ

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

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

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