当前位置: 首页 > 知识库问答 >
问题:

后台未调用请求块的URLSession.DataTask

魏毅
2023-03-14
    let request = NSMutableURLRequest(url: URL(string: url as String)!,

                                      cachePolicy: .reloadIgnoringCacheData,

                                      timeoutInterval:20)

    request.httpMethod = method as String

    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

    let session = URLSession.shared

    let data = params.data(using: String.Encoding.utf8.rawValue)

    request.httpBody = data

    session.dataTask(with: request as URLRequest,completionHandler:

        {(data, response, error) -> Void in

         if error == nil

            {

                do {

                    let result = try JSONSerialization.jsonObject(with: data!, options:

                        JSONSerialization.ReadingOptions.mutableContainers)

                    print(result)

                     completionHandler(result as AnyObject?,nil)

                }

                catch let JSONError as NSError{

                    completionHandler(nil,JSONError.localizedDescription as NSString?)

                }

            }

            else{

                completionHandler(nil,error!.localizedDescription as NSString?)                    

            }                

    }).resume()

共有1个答案

叶展
2023-03-14

如果你想在你的应用程序不再在前台后下载进展,你必须使用后台会话。后台会话的基本限制在后台下载文件中概述,本质上是:

>

  • 使用基于委托的URLSession和后台URLSessionConfiguration

    只使用上载和下载任务,没有完成处理程序。

    func startRequest(for urlString: String, method: String, parameters: String) {
        let url = URL(string: urlString)!
        var request = URLRequest(url: url, cachePolicy: .reloadIgnoringCacheData, timeoutInterval: 20)
        request.httpMethod = method
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        request.httpBody = parameters.data(using: .utf8)
        BackgroundSession.shared.start(request)
    }
    
    class BackgroundSession: NSObject {
        static let shared = BackgroundSession()
        
        static let identifier = "com.domain.app.bg"
        
        private var session: URLSession!
    
        #if !os(macOS)
        var savedCompletionHandler: (() -> Void)?
        #endif
        
        private override init() {
            super.init()
            
            let configuration = URLSessionConfiguration.background(withIdentifier: BackgroundSession.identifier)
            session = URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
        }
        
        func start(_ request: URLRequest) {
            session.downloadTask(with: request).resume()
        }
    }
    
    extension BackgroundSession: URLSessionDelegate {
        #if !os(macOS)
        func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
            DispatchQueue.main.async {
                self.savedCompletionHandler?()
                self.savedCompletionHandler = nil
            }
        }
        #endif
    }
    
    extension BackgroundSession: URLSessionTaskDelegate {
        func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
            if let error = error {
                // handle failure here
                print("\(error.localizedDescription)")
            }
        }
    }
    
    extension BackgroundSession: URLSessionDownloadDelegate {
        func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
            do {
                let data = try Data(contentsOf: location)
                let json = try JSONSerialization.jsonObject(with: data)
                
                print("\(json)")
                // do something with json
            } catch {
                print("\(error.localizedDescription)")
            }
        }
    }
    
    func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
        BackgroundSession.shared.savedCompletionHandler = completionHandler
    }
    

  •  类似资料:
    • 问题内容: 当应用程序在后台运行并被请求卡住时,数据任务块未调用。 当我打开应用程序时,将调用该块。顺便说一下,我正在使用请求。 这是我的代码: 当应用程序处于活动状态时,可以完美运行。我的代码有什么问题吗?请指出我 问题答案: 如果要在应用程序不再处于前台状态后继续下载,则必须使用后台会话。在后台下载文件中概述了后台会话的基本限制,主要包括: 使用基于委托的背景。 仅使用上传和下载任务,没有完成

    • 问题内容: 我有以下指令: 这是我如何调用它: 首次初始化指令时,则为空。稍后,通过ajax对其进行检索,并填充其值。 问题是,我怎么看待更新的价值?当我从链接方法执行此操作时: 初始化指令时,仅调用一次,然后该值为空。通过ajax(来自)检索值时,不会再次调用此watch函数。但是,在我要显示的页面的其他部分,该值在获取ajax请求时会更新。因此,我认为问题与在ajax请求之后执行无关。 编辑:

    • 我对prestashop 1.7中select2中的ajax有问题。当我尝试写一些东西时,调用是200,但我得到错误“控制器Psb2BAjaxModuleAdmin丢失或无效。” 我在模块modules/psb2b/src/Controller/psb2bajaxmoduledmincontroller中创建了用于测试的控制器。php 在admin目录admin*********/themes/d

    • 当用户未连接到xmpp时,我正在使用FCM通知进行聊天。 FCM中有两种通知模式1。通知消息2。数据消息 如果我的应用程序最近被清除,我将不会使用数据消息作为通知消息 这种方法适用于除奥利奥以外的所有版本。 对于Oreo,我只有在应用程序未连接到xmpp且处于前台时才会收到通知。我的onMessageReception方法正在被调用。 但当该应用程序仅为奥利奥而被删除或从最近的应用程序中删除时,情

    • 我正在使用数据消息,正如Firebase文档所建议的,但没有成功...

    • 我尝试使用Firebase为Android提供推送通知。但我面临着非常奇怪的问题。当我在前台发送推送时,一切正常。当我在后台发送推送时(我只发送数据),一切都正常,直到我回到前台,然后回到后台。 当我的应用程序第二次转到后台时,不会调用我的FirebaseMessagingService。另外,请注意,我使用的是Android Emulator。代码: AndroidManifest。xml: 服