13

I use BGTaskScheduler for a background task as described here: https://developer.apple.com/documentation/backgroundtasks/bgtaskscheduler

My question is: should this scheduled task also work after a device restart or after I manually kill the app? If not, are there another alternatives for this?

Sorin Lica
  • 6,894
  • 10
  • 35
  • 68
  • 1
    I don't know why this question has been downvoted. I think it is a valid and interesting programming question. BTW Downvoting without giving a reason is not very useful... – Reinhard Männer May 25 '20 at 14:04

3 Answers3

9

No , After restarting the device or after killing the app manually , no Background Task will be executed or start again automatically.

It is because then the State of Your App will be Changed

Various methods of AppDelegate are given in the Apple Docs , which handles different States of the App (ForeGround/BackGround/Terminated etc.)

  1. If you manually kill your app then applicationWillTerminate(_ application: UIApplication) will be executed in your AppDelegate.swift file (So , you can set some action to perform which will be executed just before app will be manually killed.)

Note that when it executes Your any BackGround Task will also be terminated & the State of your app is changed from BackGround -> Terminated

  1. When we Switch off or Restart the device , It is an external event and has nothing to do with your app, So we are not able to determine the State of the App

Even if your App is in the Back-Ground and performing any BGTask , if device will be switching off , App won't even execute applicationWillTerminate or any AppDelegate method

Muhammad Asyraf
  • 1,748
  • 15
  • 20
Nayan Dave
  • 1,078
  • 1
  • 8
  • 30
3

The answer is NO, and I don't know an alternative.
I just tested it:
I started a background task after 1 min, and in the background task handler, I set a flag in the User Defaults. I then killed the app manually.
After some minutes, I opened the app and read out the User Defaults, and the flag was not set.
This indicates to me that background tasks can only be launched into background, if they have not been killed, and the same surely applies, if the device has been restarted.

Reinhard Männer
  • 14,022
  • 5
  • 54
  • 116
  • min update time is 15 minutes. Flutter_background_service IOS notes: Keep in your mind, iOS doesn't have a long running service feature like Android. So, it's not possible to keep your application running when it's in background because the OS will suspend your application soon. Currently, this plugin provide onBackground method, that will be executed periodically by Background Fetch capability provided by iOS. It cannot be faster than 15 minutes and only alive about 15-30 seconds. – user1544428 Jul 14 '23 at 13:40
3

As Reinhard and Nayan said straight answer to question is NO.

Also note: even if your app is not terminated the task will be executed only when the system decides to run it. Execution time can’t be guaranteed. Refer Advances in App Background Execution

Solution: One of the ways you can handle background execution is through handling notification in background.

Apple quote from Local and Remote Notification Programming Guide

When a background update notification is delivered to the user’s device, iOS wakes up your app in the background and gives it up to 30 seconds to run. In iOS, the system delivers background update notifications by calling the application:didReceiveRemoteNotification:fetchCompletionHandler: method of your app delegate. Use that method to initiate any download operations needed to fetch new data. Processing remote notifications in the background requires that you add the appropriate background modes to your app.

aman.sood
  • 872
  • 7
  • 19