在后台模式下从Alamofire获取数据

时间:2019-01-15 18:46:36

标签: ios swift background alamofire onesignal

我需要在后台运行时更新我的​​应用程序中的订单。

好吧,我正在使用OneSignal,我可以在didReceiveRemoteNotification上获取消息,并且在其中可以调用Alamofire来检查我的api是否需要更新。

问题在于代码到达了重点:Alamofire.request(url).responseJSON {(response) in并没有进入内部,只是当我打开应用程序时我才可以得到结果。

我希望它可以在后台获取新数据并在更新后通知用户,以便他们可以单击通知以查看有什么新内容。

我了解到默认情况下Alamofire在后台线程上运行,但是网络请求在主线程上进行。

因此,我尝试:thisthis都不起作用。

我尝试了URLSessionConfiguration,但得到了Error code -999 cancelled. 因此,我在回复的末尾添加了sessionManager.session.finishTasksAndInvalidate()。错误停止,但是代码仍然不在Alamofire请求中。

我的一些代码-AppDelegate上的didReceiveRemoteNotification:

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)
                            }
                        }
                    }
                }
            }
        }
我的AppDelegate上的

loadOrdersFromLastSyncByApi函数:

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 :(得分:1)

感谢您的提问。为了澄清,我理解您的问题如下:

您希望在应用程序处于后台状态时更新用户订单时的更新。

后续问题: 您是否有理由要从客户端发出请求?另外,您不能仅仅在服务器上处理来自OneSignal的哪些数据?

答案: 您应该处理对服务器上第三方(Alamofire)的任何请求,然后使用我们的API通过请求响应中的新信息向用户发送通知。我认为那是最好的方法。