I\'m trying to do something similar to Tile.app. When it shows a notification, it plays a sound. That seems simple enough-- use UILocalNotification
and include
Actually you can use one of AudioServices...
functions
AudioServicesPlaySystemSound
AudioServicesPlayAlertSound
AudioServicesPlaySystemSoundWithCompletion
to start playing sound in background.
I'm not sure about length of sound that can be submitted to AudioServicesCreateSystemSoundID
because I'm checked only with short looped sound for ringing but this API not tied to notification so possible can overpass 30 second limit.
EDIT:
App still requires audio
in UIBackgroundModes
to play in background
Cut from my test project appDelegate, iOS 9.3.1
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// test sound in foreground.
registerAndPlaySound()
return true
}
func applicationDidEnterBackground(application: UIApplication) {
var task = UIBackgroundTaskInvalid
task = application.beginBackgroundTaskWithName("time for music") {
application.endBackgroundTask(task)
}
// dispatch not required, it's just to simulate "deeper" background
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(5 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
self.registerAndPlaySound()
}
}
func registerAndPlaySound() {
var soundId: SystemSoundID = 0
let bundle = NSBundle.mainBundle()
guard let soundUrl = bundle.URLForResource("InboundCallRing", withExtension: "wav") else {
return
}
AudioServicesCreateSystemSoundID(soundUrl, &soundId)
AudioServicesPlayAlertSound(soundId)
}
Update
There I used beginBackgroundTask
to start sound only as simplest way to execute code in background in another project similar code to registerAndPlaySound
was called from PushKit
callback without background task.