J'essaye d'ajouter la capacité d'extraction d'arrière-plan à mon application. À l'heure actuelle, la fonction de délégué urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
est appelée après l'appel du réseau est terminée, mais l'URL dans le répertoire du cache n'existe pas:Impossible d'obtenir des données à partir de URLSessionTaskDelegate
class DownloadManager: NSObject, URLSessionTaskDelegate, URLSessionDownloadDelegate {
static var shared = DownloadManager()
var session : URLSession {
get {
let config = URLSessionConfiguration.background(withIdentifier: "my_Identifier")
return URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue())
}
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
print(location.absoluteString)
do {
let myData = try Data(contentsOf: location)
} catch let error {
print(error.localizedDescription)
// The The file “file_id.tmp” couldn’t be opened because there is no such file.
}
}
public func fetch() {
guard let url = URL(string: "#{myURL}") else {
return
}
let task = session.downloadTask(with: url)
task.resume()
}
}
Et dans mon délégué App:
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print("Executing background fetch")
DownloadManager.shared.fetch()
completionHandler(.newData)
}
Qu'est-ce que je manque ?
Votre code semble fonctionner quand je l'essaie. Est-il possible que votre URL commence par 'http' au lieu de' https'? Cela pourrait le faire aller à l'encontre de App Transit Security. –
Ils sont tous 'https'. Comment simulez-vous cette recherche de fond? –
Je viens de copier votre classe dans CodeRunner, j'ai remplacé l'URL par un fichier sur mon site web, et j'ai ajouté une ligne en bas pour appeler 'DownloadManager.shared.fetch()'. Il a semblé télécharger correctement. –