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()
}
}
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. " –
Richtig. Haben Sie" Hintergrund holen "unter der Option" Fähigkeiten "im Projekt aktiviert. Https://www.raywenderlich.com/143128/background-modes-tutorial-getting-started –
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 –