Trying to implement beginBackgroundTaskWithExpirationHandler and UILocalNotification
Asked Answered
I

1

12

I have the following code in my AppDelegate for when my application enters the background:

var backgroundUpdateTask: UIBackgroundTaskIdentifier!

func beginBackgroundUpdateTask() {
    self.backgroundUpdateTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({
        self.endBackgroundUpdateTask()
    })
}

func endBackgroundUpdateTask() {
    UIApplication.sharedApplication().endBackgroundTask(self.backgroundUpdateTask)
    self.backgroundUpdateTask = UIBackgroundTaskInvalid
}

func doBackgroundTask() {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
        self.beginBackgroundUpdateTask()

        // Do something with the result.
        var timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: "displayAlert", userInfo: nil, repeats: false)
        NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode)
        NSRunLoop.currentRunLoop().run()

        // End the background task.
        self.endBackgroundUpdateTask()
    })
}

func displayAlert() {
    let note = UILocalNotification()
    note.alertBody = "As a test I'm hoping this will run in the background every X number of seconds..."
    note.soundName = UILocalNotificationDefaultSoundName
    UIApplication.sharedApplication().scheduleLocalNotification(note)
}

func applicationDidEnterBackground(application: UIApplication) {
    self.doBackgroundTask()
}

I'm hoping that it executes a UILocalNotification() every X number of seconds specified in the NSTimer.scheduledTimerWithTimeInterval() however it only executes once.

I'm still trying to get my head around how background tasks work. Is there something I'm missing?

Irinairis answered 4/2, 2015 at 4:47 Comment(1)
var backgroundUpdateTask: UIBackgroundTaskIdentifier! was missing from my code. Thanks to your question I found the last piece of the puzzle.Neutralization
S
8

In the code sample, the timer you create will only fire once as you have set the "repeats" value to false in the initialiser.

Sonora answered 18/4, 2015 at 14:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.