Проблема: Я хочу запустить простую функцию через 5 секунд после того, как приложение перейдет в фоновый режим.
Мне пришлось реализовать BGTaskScheduler для поддержки iOS 13. Старая реализация BackgroundTask работает на старых версиях iOS.
Я добавил фоновые режимы по запросу (аксессуары BLE отмечены галочкой, потому что в этой функции мы выполняем небольшую операцию BLE):

Затем я подготовил Info.plist в соответствии с документацией (Идентификатор поддельный только для вопроса StackOverflow):

Прежде чем didFinishLaunchingWithOptions завершится, я регистрирую свою BackgroundTask:
if #available(iOS 13.0, *) { BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.example.MyID", используя: .global()) { (task) в print("Моя фоновая задача СЕЙЧАС выполняется!") Task.expirationHandler = { Task.setTaskCompleted(успех: правда) } } } Теперь, когда приложение запускает метод didEnterBackground, я отправляю BackgroundTaskRequest:
if #available(iOS 13.0, *) { делать { let request = BGAppRefreshTaskRequest (идентификатор: «com.example.MyID») request.earliestBeginDate = Calendar.current.date(byAdding: .секунда, значение: 5, до: Дата()) попробуйте BGTaskScheduler.shared.submit (запрос) print("Отправленный запрос задачи") } ловить { print("Не удалось отправить BGTask") } } Проблема в том, что это ОЧЕНЬ противоречиво. Apple гарантирует, что задача не будет выполнена раньше указанной даты, но не гарантирует, что она будет выполнена в точное время (меня устраивает с небольшой задержкой). Однако, когда я запускал приложение, оно не работало в 100% случаев, независимо от того, предоставлял ли я задержку запроса задачи (используя EarlyBeginDate), поэтому сначала оно выполнялось через 7 секунд (вместо 5), в следующий раз, когда я отправил на выполнение задачи ушло 26 секунд, в третий раз никогда не произошло закрытия.
Я неправильно реализую BackgroundTask? Я обыскал весь Интернет, но не нашел ни у кого такой проблемы.
Мобильная версия