2017-07-02 6 views
0

Ich bin ziemlich neu zu swift (1 Woche) und iOS-Programmierung, und mein Problem ist, dass ich etwas grundlegendes Verständnis vermisse. Unten sehen Sie eine Funktion, die durch eine Hintergrundbenachrichtigung ausgelöst wird. Ich kann und habe bestätigt, dass ich die Hintergrundbenachrichtigung zuverlässig erhalte und die App aktiv wird (Ausdruck der Rohdatenwerte auf der Konsole) Solange die App im Vordergrund ist, funktioniert alles wie erwartet, es wird gefeuert und versendet Eine einzelne https-Anfrage. Die Hintergrundauslöser kommen jede Minute auf einen Timer.swift 3+, URLsession, im Hintergrund scheitert scheinbar zufällig

Jetzt ändert sich das Ganze, wenn die App in den Hintergrund tritt. In diesem Fall bekomme ich immer noch die Auslöser durch die Benachrichtigung (Konsolenausdruck) und ich kann im Debugger die gleiche Funktion sehen, die wie ein Charm im Vordergrund stolpert. Es funktioniert immer noch, es wird immer noch gefeuert, aber ein Datenpaket wird nur so oft gesendet, zufällig wie es zwischen 2 und 30 Minuten scheint.

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

Antwort

0

Versuchen dataTaskWithCompletion so können Sie sehen, mit was in den Fehler falsch läuft.

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

EDIT

Was möchten Sie tun, ist für die Hintergrund Sie completions über delegate Anruf erhalten sichert so, wenn Sie init ur URLSession dies mit dem folgenden func

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

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

entsprechen dann ur-Klasse an den URLSessionDelegate wie so

class queryService, URLSessionDelegate { 

dann implementieren, um die delegate Methoden aufgeführt hier für Rückrufe

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

EDIT2

Hier Schmiere d Tutorial darüber https://www.raywenderlich.com/158106/urlsession-tutorial-getting-started

+0

Ich hatte eigentlich diese erste, aber iOS sagte mir, dass im Hintergrund Sie keinen Abschluss-Handler haben: „Ausnahme‚NSGenericException‘Grund:‚Completion Hantierungsbausteine ​​sind nicht im Hintergrund unterstützt Sitzungen. Verwenden Sie stattdessen einen Delegaten. " –

+0

Richtig. Haben Sie" Hintergrund holen "unter der Option" Fähigkeiten "im Projekt aktiviert. Https://www.raywenderlich.com/143128/background-modes-tutorial-getting-started –

+0

Ja, Ich habe es getan, ich habe es erneut überprüft und nur zur Klärung funktioniert der Code, nur nicht jedes Mal, wenn es gefeuert wird –

Verwandte Themen