Nour1991 Nour1991 - 1 year ago 242
Swift Question

iOs 8, start playing sound when in the background, alarm clock app

I know there are many questions on SOF, but this is the "newest" one. The thing is, I'm trying to create and alarm app, and I know for a fact that there are alarm apps out there that works perfectly ( somehow ), even if the app is not running and is in the background.

My question is: how do you start playing sound after your app is already in the background ??

UILocalNotification is great, but you'll only get

after the user has already clicked on your notification, so playing sound using AVAudioPlayer didn't work, i want to play sound regardless weather the user clicks on it or doesn't. Of course with
Required background modes: App plays audio or streams audio/video using AirPlay
already set. Once the music starts playing, it keeps playing even if i go to the background.

I don't want to use UILocalNotificaation sound coz it's limited to 30 secs and only the able to play the sounds that are bundled with the application.

Any insights ? thoughts ??

Sample code:

var notif = UILocalNotification()
notif.fireDate =
notif.alertBody = "test"

the above code gets called when the user selects and alarm and clicks save.

and here's what's happening in AppDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
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!){
NSLog("received local notif")


You need to hold a strong reference to the
btw, so it won't get released, and the
won't do anything...

Answer Source

Finally, I managed to do it with 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)

and somewhere else a UILocalNotification is synced with this timer, for a good user experience.

Although I'm not sure if this would go through apple, but I don't see any reason why it wouldn't :\

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download