Мне нужно обновить заказы из моего приложения, пока приложение находится в фоновом режиме.
Хорошо, я использую OneSignal, я могу получить сообщение на didReceiveRemoteNotification
и внутри него я вызываю Alamofire, чтобы проверить на моем API, что мне нужно обновить.
Проблема в том, что когда код доходит до точки: Alamofire.request(url).responseJSON {(response) in
он не уходит внутрь, просто когда я открываю приложение, я могу получить результат.
Мне бы хотелось, чтобы он получал новые данные в фоновом режиме и уведомлял пользователей после обновления, чтобы они могли щелкнуть уведомление, чтобы узнать, что нового.
Я прочитал, что Alamofire по умолчанию работает в фоновом потоке, но сетевой запрос идет в основном потоке.
Итак, я попытался: это и это , оба не работают.
Я пытался URLSessionConfiguration , но я получил Error code -999 cancelled.
Итак, я добавил sessionManager.session.finishTasksAndInvalidate()
в конце моего ответа. Ошибка прекращается, но код по-прежнему не входит в запрос Alamofire.
Часть моего кода - didReceiveRemoteNotification на моем AppDelegate:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
if let custom = userInfo["custom"] as? NSDictionary {
if let a = custom["a"] as? NSDictionary {
if let update = a["update"] as? NSString {
if update.isEqual(to: "Pedido") {
let strdataPedido = PedidoDAO().getMostRecentDtPedido()
if self.defaults.getDownloadInicialPedido(){
if strdataPedido != "" {
//let task = self.beginBackgroundTask()
self.loadOrdersFromLastSyncByApi(strdataPedido)
//self.endBackgroundTask(task)
}
}
}
}
}
}
функция loadOrdersFromLastSyncByApi в моем AppDelegate:
func loadOrdersFromLastSyncByApi(_ lastSync: String) {
let parceiroId = defaults.getParceiroId()
PedidoAPI().loadOrdersForLastSync(parceiroId, lastSync){ (dados) in
if let dadosPedidoModel = dados as? [PedidoModel] {
//do what needs to do to save new data
}
PedidoAPI (). Функция loadOrdersForLastSync:
func loadOrdersForLastSync(_ parceiroId: String, _ lastSync: String, _ onComplete: @escaping(Any?) -> Void) {
let url = Test.basePath + "/api/orders/parceiro/\(parceiroId)/\(lastSync)"
//let queue = DispatchQueue(label: "com.test.br", qos: .background, attributes: .concurrent)
let task = self.beginBackgroundTask()
let queue = DispatchQueue.global(qos: .background)
queue.async {
Alamofire.request(url).responseJSON {(response) in
//This result its fired just when I open my app, I would like it to make everything on background
switch (response.result) {
//do what needs to send new data
}
self.endBackgroundTask(task)
Любая помощь, пожалуйста?