Получить данные из Alamofire в фоновом режиме - PullRequest
0 голосов
/ 15 января 2019

Мне нужно обновить заказы из моего приложения, пока приложение находится в фоновом режиме.

Хорошо, я использую 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)

Любая помощь, пожалуйста?

1 Ответ

0 голосов
/ 08 июня 2019

Спасибо за ваш вопрос. Чтобы уточнить, я понял ваш вопрос следующим образом:

Вы хотите обновить пользователей, когда в их заказах произошли изменения, когда приложение работает в фоновом режиме.

Дополнительный вопрос: Есть ли причина, по которой вы хотите сделать запрос от клиента? Кроме того, какие данные поступают из OneSignal, которые вы не можете просто обработать на своем сервере?

Ответ: Вы должны обрабатывать любые запросы к третьей стороне (Alamofire) на сервере, а затем использовать наш API для отправки пользователю уведомления с новой информацией из ответа на запрос. Я думаю, что это был бы лучший подход.

...