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