我需要在后台运行时更新我的应用程序中的订单。
好吧,我正在使用OneSignal,我可以在didReceiveRemoteNotification
上获取消息,并且在其中可以调用Alamofire来检查我的api是否需要更新。
问题在于代码到达了重点:Alamofire.request(url).responseJSON {(response) in
并没有进入内部,只是当我打开应用程序时我才可以得到结果。
我希望它可以在后台获取新数据并在更新后通知用户,以便他们可以单击通知以查看有什么新内容。
我了解到默认情况下Alamofire在后台线程上运行,但是网络请求在主线程上进行。
我尝试了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)
请帮忙吗?
答案 0 :(得分:1)
感谢您的提问。为了澄清,我理解您的问题如下:
您希望在应用程序处于后台状态时更新用户订单时的更新。
后续问题: 您是否有理由要从客户端发出请求?另外,您不能仅仅在服务器上处理来自OneSignal的哪些数据?
答案: 您应该处理对服务器上第三方(Alamofire)的任何请求,然后使用我们的API通过请求响应中的新信息向用户发送通知。我认为那是最好的方法。