swift 3+,URLsession,在后台显然随机失败

时间:2017-07-02 19:24:25

标签: ios swift background urlsession

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

1 个答案:

答案 0 :(得分: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()) 时这样做

URLSessionDelegate

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

然后将您的班级与class queryService, URLSessionDelegate { 一致,如此

delegate

然后实现此处列出的@Entity @Table(name = "person") public class Person implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; public Person() { super(); } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 方法用于回拨

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

<强> EDIT2

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