как вызвать api в фоновом режиме через 5 минут?

#ios #swift

#iOS #swift

Вопрос:

Мое приложение прослушивает устройство Bluetooth для запуска события, когда приложение находится в фоновом режиме, а затем вызывает api. Я хочу вызвать тот же API через 1 минуту и снова вызвать этот API через 5 минут, когда приложение находится в фоновом режиме.

Комментарии:

1. Вы проверили ответ ниже?

2. да, я протестировал его, и он работает лучше, чем DispatchSourceTimer, но все же некоторое время для второго вызова требуется более 5 минут

3. Попробуйте создать 2 запроса с разной длительностью. Вы можете вызвать этот DispatchQueue func applicationDidEnterBackground(_ application: UIApplication) в AppDelegate

4. можете ли вы предоставить мне образец кода, если это возможно?

5. я обновил ответ. Попробуйте вызвать registerBackgroundTask(60) в первом случае. Также вам нужно настроить блок внутри { print("fasdf") } с тем, что вам нужно. Также будет полезен некоторый параметр, описывающий состояние. background

Ответ №1:

Убедитесь, что вы включили фоновый режим и установили необходимые значения в xCode. Странно, но даже если фоновый режим отключен, этот код работает. Я использую этот код:

В AppDelegate добавьте код ниже:

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    registerBackgroundTask(60)
    return true
}

func registerBackgroundTask(_ durationSec : Double = 60 ) {
    let duration : DispatchTime = DispatchTime.now()   durationSec
    DispatchQueue.global(qos: .background).asyncAfter(deadline: duration, qos: .background) {
            print("fasdf")
            // customize it!
        }
}

func applicationDidEnterBackground(_ application: UIApplication) {

    application.beginBackgroundTask {[weak self] in
        self?.registerBackgroundTask(5 * 60)
    }
}
 

Комментарии:

1. В настоящее время я использую этот код, но он работает несколько раз, а иногда и не работает. Любое другое решение было бы оценено.

2. Я еще не нашел никакого решения, но ваше решение сейчас очень полезно. Спасибо, брат