【问题标题】:swift 3+, URLsession, in the background fails apparently at randomswift 3+,URLsession,在后台显然随机失败
【发布时间】:2017-12-06 01:31:34
【问题描述】:

我对 swift(1 周)和 iOS 编程相当陌生,我的问题是我似乎错过了一些基本的理解。下面您会看到一个由后台通知触发的功能。我可以并且已经验证我可靠地收到后台通知并且应用程序处于活动状态(在控制台上打印输出原始数据值)只要应用程序在前台一切都按预期工作,它就会被触发并发送单个 https 请求。背景触发器每分钟都有一个计时器。

现在,当应用程序进入后台时,整个事情都发生了变化。在这种情况下,我仍然通过通知(控制台打印输出)获取触发器,并且我可以在调试器中看到与前台的魅力相同的功能。它仍然可以工作,它仍然会被触发,但数据包的发送频率只是很频繁,似乎在 2 到 30 分钟之间随机发送。

let config = URLSessionConfiguration.background(withIdentifier: "org.x.Reporter")
class queryService {
    let defaultSession = URLSession(configuration: config)
    var dataTask: URLSessionDataTask?


    var errorMessage = ""


    func getSearchResults(baseURL: String, searchTerm: String) {
        dataTask?.cancel()
        config.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData;
        config.timeoutIntervalForRequest = 10

        if var urlComponents = URLComponents(string: "https://host.com/reportPosition.php") {
            urlComponents.query = "\(searchTerm)"
            guard let url = urlComponents.url else { return }

            dataTask = defaultSession.dataTask(with: url)
        }
        // 7
        dataTask?.resume()
    }
}

【问题讨论】:

    标签: ios swift background urlsession


    【解决方案1】:

    尝试使用dataTaskWithCompletion,这样您就可以看到错误中出了什么问题。

        URLSession.shared.dataTask(with: URL.init(string: "")!) { (data, response, error) in
            if error != nil {
                // Error
            }
        }.resume()
    

    https://developer.apple.com/documentation/foundation/urlsession/1410330-datatask

    编辑

    你想要做的是后台你得到completions通过delegate回调所以当你initURLSession这样做使用以下func

    URLSession.init(configuration: URLSessionConfiguration.init(), delegate: self, delegateQueue: OperationQueue.init())
    

    https://developer.apple.com/documentation/foundation/urlsession/1411597-init

    然后像这样使你的类符合URLSessionDelegate

    class queryService, URLSessionDelegate {
    

    然后实现此处列出的 delegate 方法用于回调

    https://developer.apple.com/documentation/foundation/urlsessiondelegate

    EDIT2

    这是一个很好的教程 https://www.raywenderlich.com/158106/urlsession-tutorial-getting-started

    【讨论】:

    • 我实际上是第一个,但iOS告诉我在后台你不能有一个完成处理程序:“异常'NSGenericException',原因:'后台会话不支持完成处理程序块。请改用委托。”
    • 对。您是否在项目中的Capabilities 选项下启用了Background Fetchraywenderlich.com/143128/…
    • 是的,我做了,我又检查了一遍。澄清一下,代码有效,只是无效。每次被解雇。
    • 更新了我的答案
    • 好主意,唉,它似乎也没有帮助。我实现了所有三个委托函数,并在它们上设置了断点,但是,它们永远不会被调用。如果它有效,也不会失败。
    猜你喜欢
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2017-06-22
    • 2017-10-08
    • 1970-01-01
    • 2022-12-31
    • 2015-08-29
    • 2016-04-23
    相关资源
    最近更新 更多