0

我对 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()
    }
}
4

1 回答 1

0

尝试使用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回调获得的背景,所以当你init这样URLSession做时,使用以下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

编辑2

这是关于它的好教程 https://www.raywenderlich.com/158106/urlsession-tutorial-getting-started

于 2017-07-02T19:35:22.010 回答